如题所述,关于Nxlog的日志采集过程中的一些问题,当我们对复杂服务器日志进行收取时,一些我们认为的规则和规律会被狠狠的践踏,在各行各业的技术人的随机命名,或者无序命名的手段下,目前学到的一些Nxlog的皮毛远远不够用了。
我们知道Nxlog的采集可以使用正则匹配日志名,但是仅限于日志名,对路径中出现的可匹配项就无能为力了,这时候,我们通常使用递归采集,加上无脑*.log去进行匹配。
<Input in>
Module im_file
File "/var/log/*.log"
SavePos TRue
ReadFromLast TRUE
Recursive TRUE
RenameCheck TRUE
PollInterval 1
</Input>
<Output out>
Module om_file
File "/app/test.log"
</Output>
<Route 1>
Path in => out
</Route>
虽然大部分情况下都会有很好的效果,但是日志的繁杂度越高,此方式问题就越多,目前本篇文章只是讲解了怎么使用函数替代日期,至于其他的函数有什么功效,大家可以去官网看一下文档。
路径:/var/log/20181008/xxx.log
每天会生成一个文件夹,文件夹下会有很多的以log结尾的,当我们对log进行匹配时可以使用正则,很容易就把各类日志区分开来,但是
当我们对目录名进行操作时,就会发现有些束手无策的感觉,如果使用上面的全部采集,那么时间一长监控的文件数,必然会不断上升,
消耗资源,做无用功。
而官方文档中的后半部分记载了一种函数,strftime(),下面就是我对这种函数的一些学习心得。
strftime(now(), "%Y%m%d%H%M%S") ==> 20181008185515
strftime(now(), "%Y%m%d") ==> 20181008
用法类似date命令,此外还发现了几个好用的时间函数:
year(now()) 年
month(now()) 月
day(now()) 天
下面是我对这个函数进行一些小例子:
<Input in>
Module im_file
File "/var/log/"+strftime(now(),"%Y%m%d")+"/cron-"+strftime(now(),"%Y%m%d")+".log"
SavePos TRue
ReadFromLast TRUE
Recursive TRUE
RenameCheck TRUE
PollInterval 1
</Input>
<Output out>
Module om_file
File "/app/test.log"
</Output>
<Route 1>
Path in => out
</Route>
这样就可以把当天的cron日志取出来,路径为:/var/log/20181008/cron-20181008.log。
经过项目的不断进行,我们在采集aud的审计日志时,可以不仅仅只是路径中有日期,在文件命中蕴含着日期,当我们采集时遇到了很大的麻烦,但是使用上面的这种方式就很好的解决了,大致可以这样写:
File "/u01/oracle/adump/*"+strftime(now(),"%Y%m%d")+"*.aud"
#路径类似于/u01/oracle/adump/ora_chls_201810221117234243.aud,这样就可以采集了一整天的aud日志,尽量的减少了日志采集时的资源资源问题。
项目中总会碰到其他问题,比如有的客户想要取前一天的数据,我研究了好久发现了一个来自nxlog社区博客的方法:
File "/u01/oracle/adump/*"+strftime(now() - 86400,"%Y%m%d")+"*.aud"
# 这样就可以采集前一天数据