Разбор apache логов с использованием PostgreSQL - PullRequest
2 голосов
/ 17 октября 2010

В этой статье O'Reilly приведен пример оператора PostgreSQL, который анализирует строку журнала Apache:

 INSERT INTO http_log(log_date,ip_addr,record)
     SELECT CAST(substr(record,strpos(record,'[')+1,20) AS date),
            CAST(substr(record,0,strpos(record,' ')) AS cidr),
            record
 FROM tmp_apache;

Очевидно, что это только извлекает поля IP и timestamp. Есть ли каноническое утверждение для извлечения всех полей из типичной записи в формате комбинированного журнала? Если нет, я напишу один и обещаю опубликовать результат здесь!

Ответы [ 2 ]

3 голосов
/ 30 октября 2010

ОК, вот мое решение:

insert into accesslog
select m[1], m[2], m[3],
    (to_char(to_timestamp(m[4], 'DD/Mon/YYYY:HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS ')
        || split_part(m[4], ' ',2))::timestamp with time zone,
     m[5], m[6]::smallint, (case m[7] when '-' then '0' else m[7] end)::integer, m[8], m[9] from (
    select regexp_matches(record,
 E'(.*) (.*) (.*) \\[(.*)\\] "(.*)" (\\d+) (.*) "(.*)" "(.*)"')
 as m from tmp_apache) s;

Он берет необработанные строки журнала из таблицы tmp_apache и извлекает поля (используя регулярное выражение) в массив.

0 голосов
/ 17 октября 2010

См. в этом блоге для получения информации о входе в Postgres.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...