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