Назад | Перейти на главную страницу

Как разделить поленья по шаблонам?

Я хотел бы иметь возможность разбивать файлы журнала в соответствии с найденным в них шаблоном.

Например, обработайте все журналы и найдите /(\w+)\s соответствовать /myresource но исключить /myresource/anythingelse, чтобы перенаправить все на /var/log/extractedlog/myresource/access.log. Я мог бы легко написать сценарий, используя команду grep, однако попытка сделать это в реальном времени может усложнить проблему. Например, я хотел бы дважды вызвать программу, не создавая дубликатов.

РЕДАКТИРОВАТЬ

Вот полный код, чтобы что-то вроде этого работало с syslog-ng /etc/syslog-ng/syslog-ng.conf (кредиты переходят к принятому ответу):

# no-parse let syslog load any source
source s_unparsed_source {
    file("/var/log/myservice/access.log"
        flags(no-parse));
};

# Just protect the input and avoid syslog-ng header to be added in the final log
template t_preserve_message {
    template("$MSG\n");
    template_escape(no);
};

# This will filter the message only matching the given expression
filter f_match_pattern1 {
    match("\/pattern1");
};

destination d_target1 {
    file("/var/log/target/pattern1/access.log" template(t_preserve_message));
};

# The actual logging instruction which wraps everything
log {
    source(s_unparsed_source);
    filter(f_math_pattern1);
    destination(d_target1);
};

Обе rsyslog и syslog-ng (две обычные программы, используемые в GNU / Linux для управления журналами) имеют средства для этого.

С участием syslog-ng, вы можете определить фильтры, которые соответствовать регулярному выражению:

filter myfilter {
  not match("regex" value("\/usr\/sbin\/run-crons"))
  and not match("regex" value("vmware-checker"));
}

И вы также можете использовать база данных шаблонов, что позволяет соотносить события и запуск действия.

Есть также logstash, у которого есть расширенные возможности фильтрации. В частности, он имеет grep фильтр:

filter {
  grep {
    match => { "message" => "hello world" }
  }
}

Взгляни на Логсерфер.

Я использую syslog-ng для «нормального» входа в файлы и, кроме того, передаю все в logsurfer для классификации по программам и обнаружения новых / необычных сообщений.

Фрагмент моей конфигурации, чтобы я видел все предупреждения openvpn:

'^.{29} .+ openvpn\[[0-9]+\]: (ERROR|WARN)' - - - 0 echo >>lines.openvpn $0
'^.{29} .+ openvpn\[[0-9]+\]: ' - - - 0 ignore