赞
踩
rsyslog 在Linux上自带,兼容syslog语法,在syslog基础上增加了更多协议的支持,配合额外module插件可以完成很多场景的使用。借用下官网的图片:
注: Windows 平台需要 nxlog (nxlog 是用C 语言写的一个跨平台日志收集处理软件)。
最近遇到一个需求,需要把线上环境的debug日志及集中化收集起来,一方面是方便开发调试;一方面是避免直接到线上环境查看,存在安全隐患。
rsyslog发送端 + rsyslog接收端: 直接存在接收端的本地硬盘
rsyslog发送端 + logstash接收端 + <后续第三方处理>: 接受到log更新行后,通过logstash简单处理后,可以继续往第三方处理,如放到ElasticSearch,或者放到消息队列Kfaka等
rsyslog发送端 + Splunk: Splunk是商业软件,也是业内用的比较多的方式,价格不菲
基本原理和处理流程都是类似的: 监控本地log文件内容的变化,然后把变化的文件内容发送到远端收集服务上。
例如常说的ELKstack(ElasticSearch+Logstash+Kibana)的第一步都是配置rsyslog发送端。
不管哪种方案都得监控本地文件的变化,rsyslog属于必选。我们需求比较简单,暂时选用了落地到本地盘,默认存储15天debug日志。
本文主要介绍rsyslog发送端、接收端的配置,以及遇到的一些坑。
在CentOS 6.8 Final 上自带的版本为 5.8.10。如需最新版本,可参考官网。
http://www.rsyslog.com
V5版本开发于2010年,属于比较旧的版本,最新版本是V8,支持了更多的字符串处理函数和更多module,当然性能也更好。
缺点是:新旧配置语法不兼容,而采用内置版本的另一个偷懒的好处是云端的镜像也不需要再额外升级,能支持更多老机器。
后面介绍以V5版本为例,如有不同的,会单独指出。
/sbin/rsyslogd : 执行文件
/etc/rsyslog.conf : 主配置文件:
/etc/rsyslog.d/*.conf : 自定义配置文件
/etc/init.d/rsyslog restart : 修改配置文件后,重启服务
MODULES
RULES
全局指令,模板,模块参数等
自带的配置文件如下,参考后面的注释:
# rsyslog v5 configuration file # For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html # If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html #### MODULES #### # 模块放在开头加载 $ModLoad imuxsock # provides support for local system logging (e.g. via logger command) # 可以用来调试,稍后有例子 $ModLoad imklog # provides kernel logging support (previously done by rklogd) #$ModLoad immark # provides --MARK-- message capability # Provides UDP syslog reception #$ModLoad imudp #$UDPServerRun 514 # Provides TCP syslog reception # TCP server,接收端需要加载这个模块,发送端不需要 #$ModLoad imtcp #$InputTCPServerRun 514 #### GLOBAL DIRECTIVES #### # Use default timestamp format $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # 消息格式 # File syncing capability is disabled by default. This feature is usually not required, # not useful and an extreme performance hit #$ActionFileEnableSync on #### RULES #### # 用来指定哪种类型的,哪种级别的log,发送给谁处理 # Log all kernel messages to the console. # Logging much else clutters up the screen. # kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # '-' 表示异步 # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log # local开头的是自定义的日志类型 # ### begin forwarding rule ### # The statement between the begin ... end define a SINGLE forwarding # rule. They belong together, do NOT split them. If you create multiple # forwarding rules, duplicate the whole block! # Remote Logging (we use TCP for reliable delivery) # # An on-disk queue is created for this action. If the remote host is # down, messages are spooled to disk and sent when it is up again. #$WorkDirectory /var/lib/rsyslog # where to place spool files #$ActionQueueFileName fwdRule1 # unique name prefix for spool files #$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible) #$ActionQueueSaveOnShutdown on # save messages to disk on shutdown #$ActionQueueType LinkedList # run asynchronously #$ActionResumeRetryCount -1 # infinite retries if host is down # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional #*.* @@remote-host:514 # ### end of the forwarding rule ### # Finally include all config files in /etc/rsyslog.d. This allows overrides # of the default configuration above. $IncludeConfig /etc/rsyslog.d/*.conf # 这里会自动加载自定义的*.conf配置文件,可以覆盖默认参数
为了完成我们的任务,除了上面默认的模块,还需要加载 imfile,,来指定监控哪些文件,参考文档。
$ModLoad imfile # Load the imfile input module
该模块把标准的文本文件转换成syslog的message格式, 所谓标准文本是指:保护可打印的字符,每行以 LF作为分隔符号。 支持文件正在在logrotate的时候,仍能正确处理。
它会把监控文件的读取到哪一个位置(类似游标cursor),存储在state文件里(由 $WorkDirectory 指定)。
该模块支持如下指令,一组如下设置,可以称为一个 listener:
$InputFileName /path/to/file # 待监控的文件路径
$InputFileTag tag # 文件唯一标识tag,最好保持唯一,用于接收端区分原始log文件,可以包含特殊字符,如":"、","等
$InputFileStateFile /path/to/state/file
# 【重要】需要保证发送端唯一,记录读取到哪儿,状态文件保存在$WorkDirectory,默认为 /var/lib/rsyslog
# 如果某个要监控的文件名变化了,一定要重新设置该值
$InputFileFacility facility # log类型,默认local0, local开头的表示自定义类型
$InputFileSeverity severity # log级别:info,warning,默认notice
$InputRunFileMonitor # 启动监控当前的文件,如果忘记这行,则啥事也不会发生
$InputFilePollInterval seconds # 全局设置,默认轮询是10s
$InputFilePersistStateInterval lines # 每多少行更新state文件状态
$InputFileReadMode mode # 官网竟然没这个解释,不过也没用到。。。
$InputFileMaxLinesAtOnce number
# 默认10240,如果在发送端,需要同时监控多个文件,会处理完当前文件特定行后,切换到下一个文件,避免一个文件一直占用处理,导致收集别的文件不及时。
$InputFileBindRuleset ruleset # 属于较高级的设置,可以把这个listener绑定到特点的规则(http://www.rsyslog.com/doc/v5-stable/concepts/multi_ruleset.html)
接收端配置,注意tag里的逗号 ‘,’,稍后在接收端,会它来分隔:
# For product, total 19 files.
$InputFileName /Data/logs/product/cache-Statistic.log
$InputFileTag product,cache-Statistic
$InputFileSeverity info
$InputFileStateFile state_product_cache-Statistic
$InputFilePersistStateInterval 25000
$InputFileFacility local5
$InputRunFileMonitor
一条rule的语法格式如: .
# Log cron stuff
cron.* /var/log/cron
# 记录info到本地messages文件,.none 结尾表示排除掉这些文件类型。
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 所有为local5的任意级别日志发送到远端514
local5.* @@192.168.56.10:514
日志设备(可以理解为日志类型):
auth #pam产生的日志,认证日志
authpriv #ssh,ftp等登录信息的验证信息,认证授权认证
cron #时间任务相关
kern #内核
lpr #打印
mail #邮件
mark(syslog) #rsyslog服务内部的信息,时间标识
news #新闻组
user #用户程序产生的相关信息
uucp #unix to unix copy, unix主机之间相关的通讯
local 1~7 #自定义的日志设备
debug #有调式信息的,日志信息最多
info #一般信息的日志,最常用
notice #最具有重要性的普通条件的信息
warning, warn #警告级别
err, error #错误级别,阻止某个功能或者模块不能正常工作的信息
crit #严重级别,阻止整个系统或者整个软件不能正常工作的信息
alert #需要立刻修改的信息
emerg, panic #内核崩溃等严重信息
文件: /var/log/messages
用户: root,*(表示所有用户), 会发到/var/spool/mail/收件箱里
日志服务器: @192.168.56.10 或者 @@192.168.56.10
管道: | COMMAND
一个 @ 表示 UDP, 两个 @@ 表示 TCP 协议。
模板 $template, 最主要的一个指令,在 接收端 可用来定义消息格式、文件名。主要是在接收端使用。
可参考 官方文档Templates
语法:
$template <name>,<内容>,<可选项>
$template MyTemplateName,"\7Text %property% some more text\n",<options>
默认的消息格式 RSYSLOG_TraditionalFileFormat
<接收内容的时间> <发送者的hostname> <$InputFileTag> <原始消息%msg%>
Dec 18 20:39:27 jumper-172-31-56-18 karltestdemoTag blala... dummy msg
如果只需要显示原始消息,可设置
$template CleanMsgFormat,"%msg%\n"
模板里支持一些 内置的变量:
%msg%
%syslogfacility%
%HOSTNAME%
%syslogpriority%
%timereported:::date-mysql%
%timegenerated:::date-mysql%
%iut%
'%syslogtag%'
Property Replacer 用来处理变量,支持一些简单的字符串处理,如大小写,substring等,类似jinja2的filter概念。
版本越新支持的处理函数越强大。
语法:
%property:fromChar:toChar:options%
# For product
$template productFileFormat,"/Data/logs/product/%fromhost-ip%/%syslogtag:F,44:2%-%$YEAR%%$MONTH%%$DAY%.log"
if $syslogtag startswith 'product' then ?productFileFormat;CleanMsgFormat
& ~
上面的例子,在接收端会保存为 /Data/logs/product/198.168.56.123/karltest_demo-20161218.log
解释下这个指令%syslogtag:F,44:2%
F : - 代表自定义一个分隔符
44 : - 是逗号 , 的 ASCII 码值,如需要别的分隔符,需要查对应 ASCII 值
2 : - 取分隔后的第二个字段
所以就是: 假设发送端自定义的tag为 $InputFileTag product,karltest_demo,
如果tag以product开始,则取出逗号分隔的第二个字段作为保存的文件名,这也是为啥上面tag里要设置一个逗号的缘故。
另外,还支持一定的 regex 语法,可以进行更高级的控制。官方提供了一个在线的 regex 语法测试。
友情提醒:真的很难用。。。
上面的接收端,在一条规则后,加上了如下的指令(也叫停止指令),代表如果log被当前的rule已经处理过了,则完成本次执行,跳过后续rule的处理。 类似 C++里 switch/case,如果忘记加break的穿透副作用。
& ~
如果没有这个指令,则一条新来的消息可以被多个rule处理。 这里我们并不需要,只要命中就保存到接收端同名的文件里。
1. 加载 imfile 模块
2. 指定要监控的 log 文件路径,设置合适的tag
3. 指定远端的接收端的地址
完整配置: /etc/rsyslog.conf 和 /etc/rsyslog.d/product.conf
1. 加载 imtcp 模块
2. 设置 message 格式
3. 设置 文件存储路径,文件名格式
完整配置: /etc/rsyslog.conf
一般来说选择TCP都是OK的,除非忍受部分丢失,在意影响性能,可以改用UDP。
但是注意:如果你的消息每行大小超过了4k,只能用TCP。这是因为UDP栈大小限制的。
引用官方有关 MaxMessageSize 的描述:
Note: testing showed that 4k seems to be the typical maximum for UDP based syslog. This is an IP stack restriction. Not always … but very often. If you go beyond that value, be sure to test that rsyslogd actually does what you think it should do
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/401377
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。