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

时间:2015-09-21 18:46:43

标签: java syslog grok

我正在开发一个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模式以获取这些细节?

2 个答案:

答案 0 :(得分:0)

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

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

SYSLOG_FACILITY = WWW的数据 系统日志严重性=误差

此致 IVO

答案 1 :(得分:0)

据我所知,您无法从该消息中获得严重性和便利性,因为它不存在。假设这是由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获取包裹。