我正在尝试将一个应用程序日志导入到mysql,它不是标准的syslog格式。
示例行:

Dec  5 10:50:06 wifi coova-chilli[10099]: Client process timed out: 2

当我使用imfile模块导入日志(然后将其转发到mysql)时,它工作正常,但整行都进入了消息字段。这也意味着字段ReceivedAt和DeviceReportedTime是日志导入时的时间戳,而不是消息中的实际事件时间。
我认为答案在于属性替换器,但我似乎在网上找不到一个关于如何实际获取实际日期并将其强制输入到devicreportedtime字段的示例。
这就是最终在数据库中的结果:
53052   NULL    2018-12-04 16:17:44 2018-12-04 16:17:44 16  5   server   Dec  5 10:50:06 wifi coova-chilli[10099]: Client process timed out: 2  5   NULL    customtag   NULL    NULL    0   NULL    NULL    NULL    NULL    NULL    3   customtag   -   NULL    NULL

我在/etc/rsyslog.d的客户端有以下配置:
module(load="imfile" mode="inotify")

input(type="imfile"
        File="/var/log/appname/applog.log"
        Tag="customtag")

在服务器端的/etc/rsysconfig.d下:
:syslogtag, contains, "customtag":ommysql:10.255.2.6,rsyslogdb,loganalyzer,password

最佳答案

这不是完整的答案,因为它不是我以前使用过的rsyslog的一部分,但它应该能让您接近最终的解决方案。
您可以使用rsyslog的输入解析库liblognorm和模块mmnormalize。如果rsyslog中没有这些包,您可能需要安装一两个额外的包。首先,编写一个规则文件myrules.rb包含一行描述您拥有的字段:

rule=:%date:date-rfc3164% %tag:word% %host:char-to:[%[%pid:number%]: %msg:rest%

您可以使用示例行,将其作为测试程序的标准输入:
echo 'Dec  5 10:50:06 wifi coova-chilli[10099]: Client process timed out: 2' |
lognormalizer  -r myrules.rb

您应该得到json格式的输出:
{ "msg": "Client process timed out: 2", "pid": "10099",
  "host": "coova-chilli", "tag": "wifi", "date": "Dec  5 10:50:06" }

现在可以将此模块的使用添加到rsyslog配置文件中:
module(load="mmnormalize")
action(type="mmnormalize" rulebase="myrules.rb")
template(name="simple" type="string" string="%$!date:::date-rfc3339% %$!host% %$!msg%\n")
if $parsesuccess=="OK" then action(type="omfile" file="output" template="simple")

现在应该解析输入文件中的同一个示例输入行,json键将作为变量(如lognormalizer)在模板中使用。上面应该在输出文件中写入一行,如下所示:
Dec  5 10:50:06 coova-chilli Client process timed out: 2

关于上面的问题,我还有很多不明白的地方,所以你可能应该为每个新问题在特定的点上分别写一篇文章,这样其他人就可以回答了。

关于linux - rsyslog导入非标准日志,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53631229/

10-15 19:11