使用 java grok 模式从 syslog 消息中提取详细信息

Posted

技术标签:

【中文标题】使用 java grok 模式从 syslog 消息中提取详细信息【英文标题】:Extract details from syslog message with java grok patterns 【发布时间】:2015-09-21 18:46:43 【问题描述】:

我正在开发一个 Java 项目来解析我使用 Java Grok 库进行模式识别的日志。我给出的模式如下:

%SYSLOGTIMESTAMP:syslog_timestamp %SYSLOGHOST:syslog_hostname %DATA:syslog_program(?:\\[%POSINT:syslog_pid\\])?: %GREEDYDATA:syslog_message

当我尝试解析该行时,

Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)

它给出以下输出:

syslog_timestamp=Dec 23 14:30:01
syslog_hostname=louis
syslog_program=CRON
syslog_pid=619
syslog_message=(www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)

我想进一步从syslog_message 中提取详细信息,以获取设施和严重性等信息。如何改进 grok 模式以获取这些详细信息?

【问题讨论】:

【参考方案1】:

我不是 Java Grok 专家。您可以使用 www-data 作为您的设施,并使用错误作为您的严重性。

更改您的模式以获取此信息。

syslog_facility=www-数据 系统日志严重性=错误

问候, 伊沃

【讨论】:

不清楚,但我尝试了我理解的方式。还是不行【参考方案2】:

据我所知,您无法从该消息中获得严重性和便利性,因为它不存在。假设这是由 syslog 守护进程编写的,并且假设 syslog 守护进程是 rsyslog,您可以通过更改 template 并选择您想要的 properties 来更改记录方式。

例如,您可以使用这样的模板在文件中每行编写一个 JSON(基本上是从 this rsyslog->Elasticsearch blog post 复制粘贴):

template(name="jsonPerLine"
  type="list") 
    constant(value="")
      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
      constant(value="\",\"host\":\"")        property(name="hostname")
      constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
      constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
      constant(value="\",\"tag\":\"")   property(name="syslogtag" format="json")
      constant(value="\",\"message\":\"")    property(name="msg" format="json")
    constant(value="\"\n")

这样,在您的应用程序中,您可以解析这个 JSON 并获取所有这些字段,这比使用正则表达式便宜得多(这就是 grok 所做的)。

稍后您将使用此模板在配置中写入文件,例如:

action(
  type="omfile"
  file="/var/log/json_messages"
  template="jsonPerLine"
)

如果您从上述语法中得到错误,则可能是您的发行版具有非常非常旧的 rsyslog 版本。如果是这样,您可以从official repositories 获取包。

【讨论】:

以上是关于使用 java grok 模式从 syslog 消息中提取详细信息的主要内容,如果未能解决你的问题,请参考以下文章

手把手教你用java实现syslog消息的收发,学不会你打我喽!

Logstash的filter插件-Grok

logstash grok 过滤器忽略消息的某些部分

Logstash Grok 解析器

Logstash input输入 beats插件 和 syslog插件

logstash grok match 对等于号,和中括号做筛选