Я хотел бы иметь возможность разбивать файлы журнала в соответствии с найденным в них шаблоном.
Например, обработайте все журналы и найдите /(\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