rsyslog日志服务介绍以及日志收集
一、Rsyslog服务介绍
1.1 rsyslog简介
rsyslog,是Centos系统自带的很强大的一块系统日志工具。
/var/log/messages这个日志大家并不陌生,是我们出现问题经常去查看的一个日志记录文件,这个日志里面信息的填写是由rsyslog服务维护的。
以前旧版本Centos 5系列的时候,此服务叫做syslog,从Centos 6版本开始,更名为rsyslog服务。以前是两个进程,rsyslogd(系统日志包括用户空间的各应用程序相关的日志)进程,klogd(内核日志包括kernel相关的日志)进程但是此进程由rsyslogd代为管理。所以只看到了rsyslogd一个进程。
以前旧版本syslog不能进行并行数据存储、效率低,不能实现放在专用数据管理文件中,升级到rsyslog之后有了下面的优点:
(1). 多线程的服务,并发性能好。
(2). 可以使用udp、tcp、ssl、tls、relp等协议完成信息收集,可以集中存储在远程日志服务器中,早期的syslog仅支持简单的文本传输模式实现日志发送,不安全。
(3). 支持将日志放到mysql,pgsql,oracle等多种数据库中,这种行级锁的存储形式,不仅可以让多主机的信息写入更快,而且可以为web的界面展示提供很好的支持。
(4). 强大的过滤器,自定义过滤器,可实现过滤系统信息中的任意部分。
(5). 支持完整的自定义格式的输出格式配置。
1.2 rsyslog日志格式
完整的rsyslog日志中包含产生日志的程序模块(Facility)、严重性(Severity或Level)、时间、主机名或IP、进程名、进程ID和正文。
按照RFC 3164格式的话,rsyslog包分为3个部分,RPI,HEADER以及MSG总长度不能超过1024个字节:
PRI(代表了facility以及severity)此字段只存在于rsyslog报文包头部分在log中并不常见。
HEADER部分包含一个时间戳以及发送方的主机名或ip地址,并且HEADER部分必须是一些可打印字符,时间戳部分是格式为“Mmm dd hh:mm:ss”的本地时间,其中Mmm是3个字母的英文缩写,如果日期小于10,必须空格代替缺少的一个数字,主机部分一般使用主机名,如果没有的话可以使用IPv4或者IPv6的地址。需要注意的是主机名中不能包含任何空格,时间戳和主机名后面都各自跟一个空格。
MSG部分一般包含生成消息的进程信息(TAG field)以及消息正文(CONTENT field)。TAG部分主要是包含生成消息的进程信息,不能超过32个字符。消息体必须是一些可见字符,这部分就是消息正文。TAG与CONTENT之间的间隔用非字母表字母隔开,一般用[或者:或者空格隔开。
1.3 Facility 包含
Facility(产生日志的设施,从功能和程序上对日志收集进行分类)在rsyslog中指定了产生日志消息的子系统,可选值为:
auth : 身份认证
aupriv : 授权
cron : 计划任务
daemon:守护进程
kern : 内核
lpr :打印
mail : 邮件
mark :防火墙
news : 新闻
security : 安全
user : 用户
uucp : unix to unix copy, unix主机之间相关的通讯
syslog : 系统日志
local0-7 :用户自定义的日志设备。
1.4 Severity(PRIORITY指定日志消息的优先级)日志等级(从上到下级别从低到高,记录的信息越来越少):
7 - debug:调试信息,日志信息最多最细。
6 - info : 一般信息的日志,最常用。
5 - notice : 最具有重要性的普通条件的信息。提醒。
4 - warning : 警告级别。
3 - err : 错误级别,阻止某个功能或者模块不能正常工作的信息。
2 - crit : 严重级别,阻止整个系统或者整个软件不能正常工作的信息。
1 - alert : 需要立刻修改的信息。
0 - emerg : 内核崩溃等严重信息。
none - 什么都不记录
博文来自:www.51niux.com
二、rsyslog主配置文件介绍
# cat /etc/rsyslog.conf
#### MODULES #### #定义模块的相关信息,这个部分是针对接收配置的,主要是指定接收日志的协议和端口。若要配置日志服务器,则需要将相应的配置项去掉注释。
$ModLoad imuxsock #提供对本地系统日志记录的支持(例如通过logger命令)
$ModLoad imklog #提供内核日志记录支持(以前由rklogd完成)
#$ModLoad immark #提供--MARK--消息功能
而在Centos 7系列的rsyslog的7版本的配置文件中,这里是:
$ModLoad imuxsock #提供对本地系统日志记录的支持(例如通过logger命令)
$ModLoad imjournal #提供对systemd日志的访问
#$ModLoad imklog #读取内核消息(同样从日志读取)
#$ModLoad immark #提供--MARK--消息功能
#$ModLoad imudp #使用udp接收模块
#$UDPServerRun 514 #允许514端口接收使用UDP协议转发过来的日志,默认是注释状态,也就是不接收。
#$ModLoad imtcp #使用tcp接收模块
#$InputTCPServerRun 514 #允许514端口接收使用TCP协议转发过来的日志,默认也是注释状态,所以也就表示只记录本地的消息信息。也就是来自于/dev/log设备的信息。
#### GLOBAL DIRECTIVES #### #全局指令,主要用来配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat #使用默认的模板以及默认的时间戳格式。
#$ActionFileEnableSync on #默认情况下禁用文件同步功能。 此功能通常不需要。
$IncludeConfig /etc/rsyslog.d/*.conf #在/etc/rsyslog.d/中包含所有配置文件。
而在Centos7系列的rsyslog的7版本配置文件中,这里是:
$WorkDirectory /var/lib/rsyslog #在哪里放置辅助文件
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
#$ActionFileEnableSync on
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on #通过本地日志socket关闭消息接收,本地邮件现在通过imjournal检索。
$IMJournalStateFile imjournal.state #将文件存储在日志中
#### RULES #### #规则
#kern.* /dev/console #关于内核的所有日志都放到/dev/console(控制台)
*.info;mail.none;authpriv.none;cron.none /var/log/messages #记录所有日志类型的info级别以及大于info级别的信息到/var/log/messages,但是mail邮件信息,authpriv验证方面的信息和cron时间任务相关的信息除外
authpriv.* /var/log/secure # authpriv验证相关的所有信息存放在/var/log/secure
mail.* -/var/log/maillog # 邮件的所有信息存放在/var/log/maillog; 这里有一个-符号, 表示是使用异步的方式记录, 因为日志一般会比较大。但是突然断电可能睡丢失数据
cron.* /var/log/cron #计划任务有关的信息存放在/var/log/cron
*.emerg * #记录所有的大于等于emerg级别信息,以wall方式发送给每个登录到系统的人,在rsyslog的7版本上面是:*.emerg :omusrmsg:
uucp,news.crit /var/log/spooler #记录uucp,news.crit等存放在/var/log/spooler
local7.* /var/log/boot.log # 将引导消息保存到boot.log
# ### begin forwarding rule ### #开启转发规则设置,begin ... end之间的语句定义了一个SINGLE转发规则。 他们属于一起,不要分裂。如果创建多个转发规则,请重复整个块! 远程日志记录(我们使用TCP可靠的传送)。为此操作创建一个磁盘队列。 如果远程主机关闭,消息将被先托管写到本地磁盘,并在重新启动时发送。
#$WorkDirectory /var/lib/rsyslog #托管文件的目录
#$ActionQueueFileName fwdRule 1 #脱机托管文件的唯一名称前缀
#$ActionQueueMaxDiskSpace 1g #1GB空格限制(尽可能多使用)
#$ActionQueueSaveOnShutdown on #将消息保存到关机时的磁盘
#$ActionQueueType LinkedList #异步运行
#$ActionResumeRetryCount -1 #如果主机关闭,则无限重试
#*.* @@remote-host:514 #这是一个例子,remote host是:name / ip:port,例如 192.168.0.1:514,端口可选,@@表示通过tcp协议发送 @表示通过udp进行转发,这表示所有的消息都发送到目标IP:端口
https://blog.51niux.com/?id=109 #这里有关于rsyslog更加详细的用法。
博文来自:www.51niux.com
三、logrotate服务
logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。基本如果我们的系统日志只是用于本地存储查看不进行转发和接收的话,就是默认的启动rsyslog服务就可以了。系统日志会定时的切割,这主要是系统自带的logrotate。系统会定时运行logrotate,一般是一天一次。# cat /etc/cron.daily/logrotate #在这里有定义。
3.1 logrotate.conf 配置文件介绍
# cat /etc/logrotate.conf
weekly #每周轮转一次
rotate 4 #保留四个文件
create #切割日志之后,创建一个新的空文件
dateext #将日期用作切割后的文件的后缀
#compress #默认是不压缩的
include /etc/logrotate.d #加载一个目录,使其目录下的配置文件生效,这目录下面也就类似于要切割的文件及操作。
/var/log/wtmp { #定义/var/log/wtmp这个日志文件,系统的每一次登录,都会在此日志中添加记录,为了防止有人篡改,该文件为二进制文件。命令#last
monthly #每月轮训一次,取代了上面的全局设定的每周轮转一次。
create 0664 root utmp #新的日志文件的权限,0644,以及属主和属组
minsize 1M #定义日志必须要大于1M大小才会去轮转
rotate 1 #保留一个,取代了上面的全局设定的保留四个。0表示不备份。
}
/var/log/btmp { #定义/var/log/btmp日志文件,这个文件记录错误的登录尝试,执行lastb命令就可以查看到最后一个不成功的登录尝试. 命令#lastb
missingok
monthly
create 0600 root utmp
rotate 1
}
另外:#lastlog 为显示当前系统上所有用户的最近一次的登录信息。
3.2 logrotate配置文件选项说明:
# man logrotate #可以查看更详细的文档
compress:日志文件的旧版本默认使用gzip(1)进行压缩转储的备份日志。
compresscmd:指定用于压缩日志文件的命令。默认是gzip。
uncompresscmd:指定使用哪个命令解压缩日志文件。默认是gunzip。
compressext:指定在压缩日志文件中使用的扩展名,如果启用压缩。默认值为配置的压缩命令。
compressoptions: 压缩选项,gzip(1)的默认值为“-9”(最大压缩)。
copytruncate: 在创建副本之后,将原始日志文件截断,而不是移动旧的日志文件,并可选择创建新的日志文件。当某些程序不能使用时可以使用它被告知关闭其日志文件,因此可能会继续写入(附加)到以前的日志文件。请注意,复制文件之间有一个非常小的时间片截断它,因此某些日志记录数据可能会丢失。使用此选项时,create选项将不起作用,因为旧日志文件保持原样。
create mode owner group, create owner group :使用指定的创建模式创建新文件,以及文件的权限以及属主和属组
createolddir mode owner group:如果由olddir指令指定的目录不存在,则创建它。以及目录的权限属主属组,可以使用nocreateolddir选项禁用此选项。
daily :日常日志文件每天都会旋转。
dateext :存档旧版本的日志文件,添加像YYYYMMDD这样的日常扩展,而不是简单地添加一个数字。可以使用dateformat选项配置扩展。
dateformat format_string : 使用类似于strftime(3)函数的符号指定dateext的扩展名。只允许%Y%m%d和%s说明符。默认值为 - %Y%m%d。请注意,扩展名中分隔日志名称的字符也是dateformat字符串的一部分。系统时钟必须设置为2001年9月9日,以便%s正常工作。请注意,以此格式生成的日期戳记必须是可排序的(即,首先是年份,然后是当天的月份),例如,2001/12/01可以,但01/12/2001不是,因为01/11 / 2002年将排序较低,而后来)。这是因为当使用rotate选项时,logrotate会对所有旋转的文件名进行排序,以查找哪些日志文件较旧,应该删除。
delaycompress :和compree一起使用将上一个日志文件的压缩推迟到下一个旋转周期。当某些程序无法关闭其日志文件时,可以使用它,因此可能会持续写入上一个日志文件一段时间。
extension ext : 带扩展名的日志文件可以在旋转后保留。如果使用压缩,则分机后会出现压缩扩展(通常为.gz)。例如,您有一个名为mylog.foo的日志文件,并将其旋转到mylog.1.foo.gz而不是mylog.foo.1.gz。
ifempty : 旋转日志文件,即使它是空的也转储,覆盖notifempty选项(ifempty是默认的)。
include file_or_directory:读取作为参数给出的文件,就好像它被包含在include指令出现的inline中一样。如果给出了一个目录,则该目录中的大多数文件将按照字母顺序读取,然后继续处理包含文件。唯一被忽略的文件是不是常规文件(例如目录和命名管道)的文件以及其名称以tabooext指令指定的禁用扩展名之一的文件。 include指令可能不会出现在日志文件定义中。
mail address : 当一个日志被旋转出来,它被邮寄到地址。如果特定日志不应生成邮件,则可以使用nomail指令。
mailfirst : 使用邮件命令时,邮寄刚刚转储的文件,而不是即将到期的文件。
maillast : 使用邮件命令时,邮寄即将到期的文件,而不是刚刚转动的文件(这是默认值)。
maxage : 删除长于<count>天的旋转日志。仅当日志文件要旋转时,才会检查该时间。如果邮件和邮件是文件,这些文件将邮寄到配置的地址。
maxsize size: 即使在额外指定的时间间隔(每天,每周,每月或每年)之间,日志文件的长度也会大于字节数。相关的大小选项是相似的,除了它与时间间隔选项相互排斥,并且它导致日志文件被旋转而不考虑最后的旋转时间。当使用maxsize时,会考虑日志文件的大小和时间戳。
minsize size: 当日志文件长度大于字节大小时,日志文件将被旋转,但不会在额外指定的时间间隔(每天,每周,每月或每年)之间旋转。相关的大小选项是相似的,除了它与时间间隔选项相互排斥,并且它导致日志文件被旋转而不考虑最后的旋转时间。当使用minsize时,会考虑日志文件的大小和时间戳。
missingok: 如果日志文件丢失,请转到下一个文件,不会发出错误消息。
monthly : 日志文件在一个月内首次运行logrotate(这通常在月的第一天)旋转。
nocompress : 旧版本的日志文件未压缩。
nocopy : 不要复制原始日志文件并将其保留。 (这覆盖复制选项)。
nocopytruncate : 创建副本后,请勿将原始日志文件截断(这将覆盖copytruncate选项)。
nocreate : 不会创建新的日志文件(这将覆盖创建选项)。
nocreateolddir : 当logrotate不存在时,不能创建olddir目录。
nodelaycompress : 不要将上一个日志文件的压缩推迟到下一个循环周期(这覆盖了delaycompress选项)。
nodateext : 不要存档具有日期扩展名的旧版本的日志文件(这将覆盖dateext选项)。
nomail : 不要将旧日志文件邮寄到任何地址。
nomissingok : 如果日志文件不存在,则发出错误。 这是默认值。
noolddir:日志在日志通常所在的同一目录中旋转(这覆盖了olddir选项)。
nosharedscripts : 为旋转的每个日志文件运行prerotate和postrotate脚本(这是默认值,并覆盖sharedscripts选项)。 日志文件的绝对路径作为第一个参数传递给脚本。 如果脚本退出并出现错误,则不会仅对受影响的日志执行其余操作。
noshred:删除旧日志文件时请勿使用shred。
notifempty:如果日志为空,则不要旋转日志(这将覆盖ifempty选项)。
olddir directory:日志被移动到目录中进行旋转。该目录必须与正在旋转的日志文件位于相同的物理设备上,并且假定为相对于保存日志文件的目录,除非指定了绝对路径名。当使用此选项时,所有旧版本的日志最终在目录中。该选项可能被noolddir选项覆盖。
postrotate/endscript:在旋转日志文件之后,执行postrotate和endscript之间的行(两者都必须自己出现在行上)(使用/ bin / sh)。这些指令只能出现在日志文件定义中。通常,日志文件的绝对路径作为第一个参数传递给脚本。如果指定了sharedscripts,则将整个模式传递给脚本。
prerotate/endscript: 在旋转日志文件之前,只有在日志实际上被旋转时,才能执行prerotate和endscript之间的线(两者都必须自己出现在行上)(使用/ bin / sh)。这些指令只能出现在日志文件定义中。通常,日志文件的绝对路径作为第一个参数传递给脚本。
firstaction/endscript:在执行预旋转脚本运行之前,只有在至少一个运行之前,firstaction和endscript之间的行(两者必须自己出现在行上)都会一次执行(使用/ bin / sh),然后才能旋转匹配通配符的模式的所有日志文件日志将实际旋转。这些指令只能出现在日志文件定义中。整个模式作为第一个参数传递给脚本。如果脚本出错,则不进行进一步的处理。
lastaction/endscript : 在运行postrotate脚本后,只有至少一个运行后的所有日志文件与通配符匹配的所有日志文件都被旋转之后,lastaction和endscript之间的行(两者都必须自己出现在行上)一次执行(使用/ bin / sh)日志旋转。这些指令只能出现在日志文件定义中。整个模式作为第一个参数传递给脚本。如果脚本出现错误,只显示错误消息(因为这是最后一个操作)。
rotate : 在删除或邮寄到邮件指令中指定的地址之前,日志文件被旋转计数时间。如果count为0,则删除旧版本,而不是旋转。
size size : 日志文件只有当它们变大到大小字节时才会旋转。如果大小后跟k,则大小假定为千字节。如果使用M,则大小以兆字节为单位,如果使用G,则大小为千兆字节。所以尺寸100,尺寸100k,尺寸100M,尺寸100G皆可。
sharedscripts : 通常,对旋转的每个日志运行预旋转和后旋转脚本,并将日志文件的绝对路径作为脚本的第一个参数传递。这意味着对于匹配多个文件(例如/ var / log / news / *示例)的日志文件条目,单个脚本可能会运行多次。如果指定了sharedscripts,脚本只能运行一次,无论有多少个日志与通配符相匹配,而且整个模式都被传递给它们。但是,如果模式中的任何日志都不需要旋转,则脚本将不会运行。如果脚本出现错误,则不会对任何日志执行其余操作。此选项将覆盖nosharedscripts选项,并且意味着创建选项。 shred使用shred -u而不是unlink()删除日志文件。这应该确保日志在计划删除后不可读取;这是默认关闭。
shredcycles count: 要求GNU shred(1)在删除之前覆盖日志文件计数次数。没有此选项,将使用shred的默认值。
start count : 这是用作旋转基数的数字。例如,如果指定0,那么将在原始日志文件中旋转日志时使用.0扩展名创建。如果指定9,将创建日志文件.9,跳过0-8。文件仍将旋转指定的count指令的次数。
weekly : 如果当前工作日小于上次轮换的工作日,或者自上次旋转以来已经过了一周以上,则会轮询每周日志文件。 这通常与在一周的第一天的旋转日志相同,但如果logrotate不是每天晚上都运行,它会更好。
yearly : 如果当前年份与最后一次旋转不同,则每年将记录日志文件。
3.3 logrotate命令参数说明:
-d, --debug:打开调试模式,并表示-v。在调试模式下,不会对日志或logrotate状态文件进行任何更改。
-f, --force : 告诉logrotate强制旋转,即使它不认为这是必要的。有时在向logrotate配置文件添加新条目或者手动删除旧的日志文件时,这将很有用,因为将创建新文件,并且日志记录将继续正常。
-m, --mail <command>: 告诉logrotate在发送日志时使用哪个命令。该命令应接受两个参数:1)消息主题,2)收件人。然后,该命令必须在标准输入上读取消息并将其邮寄给收件人。默认邮件命令为/ bin / mail -s。
-s, --state <statefile>: 告诉logrotate使用备用状态文件。如果以不同的日志文件集合的不同用户运行logrotate,这将非常有用。默认状态文件为/var/lib/logrotate.status。
--usage:打印一个短的使用信息。
--?, --help:打印帮助消息。
-v, --verbose:打开详细模式。
3.4 /etc/logrotate.d/syslog 文件介绍
# cat /etc/logrotate.d/syslog #我们好多系统文件都轮训,主要是这里定义的。
/var/log/cron #这些文件是rsyslog.conf文件中全局配置定义中指定的Target的路径
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts # 共享脚本. 下面的postrotate脚本只运行一次.
postrotate #postrotate指定转储以后的动作
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true #轮换之后重启rsyslog服务
endscript #endscript用来结束postrote部分脚本
}
博文来自:www.51niux.com
四、rsyslog做日志转发:
4.1 最简单的转发设置
客户端的配置:
# cat /etc/rsyslog.conf #在客户端添加下面一句话
*.* @@192.168.1.101:514 #这就表示客户端的所有rsyslog记录的信息,都会以TCP的形式发向192.168.1.101:514端口。
服务端的设置:
# cat /etc/rsyslog.conf #将下面的UDP和TCP的接收端口打开,这样就可以接收日志了。因为我们没有配置要写的目录,默认就会写到服务器对应的日志文件里面去。
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
如:如果涉及到了message日志的记录,就会写到服务器端的/var/log/message里面,也就是客户端自己写一份然后再往服务器端写一份。如涉及到了/var/log/secure的日志记录,也是客户端写一份,另一份记录会传输到服务器端,服务器会写到自己的/var/log/secure日志里面去,也就是说服务器端的/var/log/secure不仅有自身的记录还有客户端的记录。
延伸一下,如果我们只想传送某几项日志记录,而非全部呢,如只想将登陆的验证记录也就是写入到/var/log/secure里面的也发送一份到对端呢?
只需要客户端做下设置:
authpriv.* /var/log/secure
authpriv.* @192.168.1.101:514 #只需要在上面的记录到某个文件下面在添加这么一条,通过udp发送到192.168.1.101的514端口,用udp好点。当然也能指定主机名或域名。
延伸一下,客户端默认在日志里面在主机位置都写的自己的主机名,本地查看还是可以的,如果都汇聚到一个服务器了,如何去判断此条消息是哪个服务器发过来的呢,显然要以IP的形式更好一点,下面来设置一下。
需要在服务器端做设置:
# cat /etc/rsyslog.conf #这就需要修改记录日志的模板配置了
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$template myFormat,"%timestamp% %fromhost-ip% %msg%\n" #做个模板,%timestamp%还是用原来的时间格式,%fromhost-ip% 设置成来源IP而非主机名的形式了,%msg%后面是消息体
$ActionFileDefaultTemplate myFormat #让默认模板变为我们自定义的这个模板。
# tail -f /var/log/secure #服务器端查看一下效果
发现还是有点不一样,貌似少了个标签,如果要输出一致呢?
$template myFormat,"%timestamp% %fromhost-ip% %syslogtag% %msg%\n" #自定义模板加了一个%syslogtag% 定义了记录的标签,也就是什么操作。
4.2 服务器接收到日志后,将日志存放到一个指定的目录里面
服务端的设置:
# cat /etc/rsyslog.conf
$template Source,"/rsyslog/data/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log" #这是只做了一个指向,将发送来的信息发送到/rsyslog/data目录下面的以来源主机IP命名的/来源IP_年-月-日.log
:fromhost-ip, !isequal, "127.0.0.1" ?Source #这是忽略本地的IP不写入此Source模板
$AllowedSender 192.168.1.0/24 #这是只接收来自192.168.1.0段的信息
下面是测试截图:
#注意测试过程中一定要关闭防火墙和selinux,不然你会发现此文件怎么都不会产生的,服务器端和客户端都要关闭。另外日志依旧会写到服务器端的各个日志里面去。
当然关于rsyslog发送日志还有更加精细的用法,还可以配置很多详细的参数,如队列,也可以作为其他非系统日志发送集中到某一个服务器端的一种服务。但是一般生产上面也不会对rsyslog做那么多的操作,一般就是来作为出现问题来进行排查的一种工具。
这里主要是用一个简单的流程做一个简单的记录,作为日志收集来说,有很多的优秀软件来做日志收集的工作,如果对rsyslog这种日志收集感兴趣呢,可以上网搜索一下资料。