使用 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消息的收发,学不会你打我喽!