如何按照模式分割日志?

如何按照模式分割日志?

我希望能够根据在日志文件中发现的模式来拆分日志文件。

例如,处理所有日志并查找/(\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);
};

答案1

rsyslogsyslog-ng(GNU/Linux 中用于管理日志的两个常用程序)都有方法可以做到这一点。

使用syslog-ng,您可以定义过滤器匹配正则表达式

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

您还可以使用模式数据库,它允许事件关联和动作触发。

还有日志存储, 其中有高级过滤功能。具体来说,它有一个grep筛选:

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

答案2

看一眼日志冲浪者

我使用 syslog-ng 进行文件“正常”登录,此外,我将所有内容输入到 logsurfer 中,以便按程序进行分类并发现新的/不寻常的消息。

来自我的配置的一个片段,因此我可以看到所有 openvpn 警告:

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

相关内容