syslog相关内容介绍
简介:
syslog server 从网络设备接收系统日志消息,并实时显示它们。
系统日志消息可以使用以下事件进行处理:
1、在滚动窗口中显示消息
2、将消息记录到文本文件
3、将消息转发到另一个系统日志服务器
4、记录到ODBC数据库
5、记录到NT应用程序事件日志
6、通过SMTP将消息通过电子邮件发送给某人
7、运行外部程序,如寻呼通知系统
8、发送SNMP陷阱消息
系统syslog内容的相关介绍
安装源码包,既不影响系统里面运行的syslog,也由于二者容易冲突,所以选择源码安装
版本:rsyslog-7.4.10
1、安装依赖包,参考官方文档
yum install git valgrind autoconf automake flex bison python-docutils python-sphinx json-c-devel libuuid-devel libgcrypt-devel zlib-devel openssl-devel libcurl-devel gnutls-devel mysql-devel postgresql-devel libdbi-dbd-mysql libdbi-devel net-snmp-devel
yum install autogen libtool
export PKG_CONFIG_PATH=/lib64/pkgconfig/ #设置环境变量
yum install libestr-devel -y
yum install liblogging-devel-1.0.4-2.gf.el6.x86_64.rpm liblogging-1.0.4-2.gf.el6.x86_64.rpm
2、./autogen.sh
运行这个来生成所有的初始makefiles等,运行这个脚本之后就会有configure这个工具了
接下来可以使用./congure --enable...添加各种插件功能,插件目录在/rsyslog-7.4.10/plugins/下,使用-h查看支持的选项
make && make install
3、配置相应的功能之后就启动服务了
/usr/local/rsyslog/sbin/rsyslogd --help #查看相应的服务启动参数
配置和相关文档的说明
man8手册的说明:http://man7.org/linux/man-pages/man8/rsyslogd.8.html
OPTIONS
-D 配置解析器在调试模式下运行,通常在很难发现配置错误的情况下使用
-d 在debug模式下运行
-f 指定配置文件运行,默认在/etc/rsyslog.conf
-i 指定pid文件运行,如果是多实例的话,需要指定不同的pid文件
-n 默认是由init进程进行守护运行
-N level 以检查配置文件的方式运行,默认是0级别
rsyslogd -f ../sample.conf -N 1 -i /var/run/rsyslogd1.pid
-C 改变root目录的方式运行
-v 打印版本信息
SIGNALS
Rsyslogd接受一些信号的响应
示例:kill -SIGNAL $(cat /var/run/rsyslogd.pid)
将SIGNAL替换成相应的信号值
HUP 让rsyslogd执行关闭所有打开的文件。
TERM,INT,QUIT 停止rsyslog的运行
USR1 当rsyslog运行在debug的时候有用,可以用来切换状态
CHLD 略
security threats
rsyslogd守护进程可能被用作拒绝服务攻击的管道,且在本机开启UDP端口容易导致机器风险。
1、使用防火墙来限制哪些机器可以访问514端口
2、将保存的信息存放在非根文件系统的位置,确保不会损害当前的机器。
3、以非root用户运行
FILES
/etc/rsyslog.conf 配置rsyslogd运行的配置文件
/dev/log Unix域套接字读取本地syslog消息
/var/run/rsyslogd.pid rsyslogd运行的pid文件
prefix/lib/rsyslog rsyslogd rsyslogd 目录,默认编译的路径
man5关于rsyslog配置文件的详细说明
http://man7.org/linux/man-pages/man5/rsyslog.conf.5.html#top_of_page
MODULES
im开头的输入模块,om开头的输出模块
ommysql 输出到mysql的模块
imfile 文本文件输入模块
imudp udp输入模块
imtcp tcp输入模块
imrelp RELP协议输入插件
...
BASIC STRUCTURE
Global directives
全局指令用来设置rsyslog的运行全局属性,譬如message的队列尺寸等。
Templates
Templates 可以将message处理成指定的格式,必须在rules之前被定义好。
Output channels
为用户可能需要的任何类型的输出提供了..
Rules(selector + action)
每一个rules都包含了这两个字段,这两个字段由一个或多个空格或制表符分隔。
selector字段指定属于指定动作的facilities和priorities的模式。
SELECTORS
facility和priority由点号分隔,不区分大小写。
facility由以下几个关键字组成:
auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security等
你可以通过这些关键字来重定向这些消息。
priority由以下几个关键字组成:
debug, info, notice, warning, warn, err, crit, alert, emerg, panic等
可以用来定义消息的优先级
1、* 表示所有facility或priority
2、可以在相同的priority指定多个facility,使用,来分隔。
3、多个selectors可以指定单个action,通过;号分隔,选择器字段中的每个选择器都可以覆盖前面的选择器。
4、扩展语法,=指定单一的priority,!表示忽略所有priorities。
ACTIONS
作为一个规则表示如何处理消息,一般会是写入文本文件或数据库等操作。
Regular file
*.* /var/log/traditionalfile.log;RSYSLOG_TraditionalFileFormat
#以指定的格式写入指定的文件
Named pipes
支持将输出记录到命名管道(fifos),通过将管道符号‘|‘预先添加到文件的名称,可以将fifo或命名管道用作日志消息的目的地。
fifo必须在rsyslogd启动之前使用mkfifo命令创建。
一边写一边读,类似python中的queue,会阻塞。
Terminal and console
可以将输出重定向到终端,/dev/console
Remote machine
输出到远程主机上,@表示udp,@@表示tcp,如果采用RELP协议,需要在远程主机前加上:omrelp:。
*.* @192.168.0.1
#将消息发送到192.168.0.1的514端口(默认端口)
action(type="omfwd" Target="192.168.0.1" Device="eth0" Port=514 Protocol="udp")
#通过omfwd可以指定更多属性
*.* :omrelp:192.168.0.1:2514
#使用RELP协议,需要先加载模块后才可以使用
List of users
通常会将一些严重的信息通知给系统用户
:omusrmsg:root,user1,user2
Everyone logged on
一些紧急的消息需要发送给所有用户,这时候可以使用*来表示
:omusrmsg:*
Database table
利用相应的输出模块将message信息输出到数据库中
Discard
将不需要的消息进行丢弃
*.* stop #stop表示丢弃动作,也可以使用~来表示
Output channel
将输出通道定义绑定到此操作,必须以$开头,支持模板定义。
Shell execute
略
FILTER CONDITIONS
提供3种条件过滤的类型
1、基于selectors的severity和facility
2、基于property
3、基于expression(表达式)
Selectors是传统的过滤方式syslog的消息。
保持了传统的语法, 如果只需要根据facility和priority进行筛选,则应该使用Selectors进行筛选。
Property-Based Filters
允许过滤任何属性,例如HOSTNAME, syslogtag and msg等
必须以:开头,后面接属性名,一个逗号,一个比较操作符,另一个逗号,然后是比较的值,这个值必须被引用。
示例:
:property, [!]compare-operation, "value"
以下是compare-operation操作的支持情况:
contains: 检查值中包含的字符串是否包含在属性中
isequal: 比较提供的"值"字符串和属性内容。 这两个值必须完全相等。
startswith:检查值是否刚好在属性值的起始处找到。
regex: 将该属性与提供的正则表达式进行比较。
Expression-Based Filters
参考官方文档
TEMPLATES
每一个rsyslog的输出都是用templates,适用于文件,用户信息等。
如果你不指定一个templates的话,默认会使用一个预置的模板,被硬编码在代码之中。
template由一个template指令,一个名称,实际模板文本和可选的选项
$template MyTemplateName,"\7Text %property% some more text\n",<options>
$template TraditionalFormat,"%timegenerated% %HOSTNAME% %syslogtag%%msg%\n"
\斜杠是转义,\7是一个ASCII字符,除了百分号以外的东西,模板中的所有文本都是字面使用的。
%%里面是属性值,可以访问消息的内容,通过property replacer去访问。
templates可以用来生成selector行的动态文件名。
$template DynFile,"/var/log/system-%HOSTNAME%.log"
Template options
请务必不要将模板选项与属性选项相混淆-后者由property replacer处理,仅应用于单一属性而不是整个模板。
sql:格式化适合于MySQL格式的SQL语句的字符串,这将在每个字段内用单引号"‘"和反斜线字符"‘"和"\"替换反斜线字符。
stdsql:提供标准的sql语句格式
如果你将信息写入数据库中,一定要注意sql注入的问题。
Template examples
模板不能实际上被分割成多行。
一个传统的模板输出:
$template TraditionalFormat,"%timegenerated% %HOSTNAME%%syslogtag%%msg:::drop-last-lf%\n"
复杂一点的模板
$template precise,"%syslogpriority%,%syslogfacility%,%timegenerated%,%HOSTNAME%,%syslogtag%,%msg%\n"
RFC 3164 format的模板
$template RFC3164fmt,"<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag%%msg%"
传统的模板格式用于用户信息
$template usermsg," XXXX%syslogtag%%msg%\n\r"
OUTPUT CHANNELS
$outchannel name,file-name,max-size,action-on-max-size
$outchannel name表示outchannel名称
file-name表示写入文件名
max-size表示写入最大的尺寸
action-on-max-size在达到最大尺寸的时候执行的动作,这个命令总是只有一个参数。
*.* :omfile:$mychannel
PROPERTY REPLACER
property replacer是rsyslog输出系统的核心组成部分,一个message有很多properties,通过property replacer访问。
Accessing Properties
系统日志消息属性在模板中使用,通过百分比标志之间的访问,属性可以由属性替换器修改。完整的语法如下:
%propname:fromChar:toChar:options% #propname为访问属性名
Available Properties
msg message的MSG部分
rawmsg 从socket接受的消息,一般用于debug
HOSTNAME message中的hostname
FROMHOST 接收到message的主机来源
syslogtag message的TAG部分
programname tag的static部分,当TAG is "named[12345]", programname is "named".
PRI message的PRI部分-未解码(单一值)
PRI-text message的PRI部分,以文本的形式
IUT 略
syslogfacility message的facility,以数字的形式
syslogfacility-text message的facility,以文本的形式
syslogseverity message的severity,以数字的形式
syslogseverity-text message的severity,以文本的形式
timegenerated message被接收到时候的时间戳
timereported message里面的timestamp
TIMESTAMP timereported的别名
PROTOCOL-VERSION 略
STRUCTURED-DATA 略
APP-NAME 略
PROCID 略
MSGID MSGID的内容
$NOW 当前的日期格式,YYYY-MM-DD
$YEAR The current year (4-digit)
$MONTH The current month (2-digit)
$DAY The current day of the month (2-digit)
$HOUR The current hour in military (24 hour) time (2-digit)
$MINUTE The current minute (2-digit)
这些不是源于消息,而是内部生成的。
Character Positions
FromChar and toChar被用于建立子串,指定的字符串被拷贝出来。
"%msg:1:2%" #提取前两个字符
"%msg:::lowercase%" #所有字符串转换成小写
%msg:10:$% #提取第十到结尾的字符
正则的支持
"%msg:R:.*Sev:. \(.*\) \[.*--end%" #使用正则需要R开头
基于字段
"%msg:F:3%"
"%msg:F,59:3%" #F指定分隔符
Property Options
uppercase 将属性转换为小写
lowercase 属性的文本转换为大写
drop-last-lf 删除message结尾的LF
date-mysql mysql的时间格式
date-rfc3164 RFC 3164时间格式
date-rfc3339 RFC 3339时间格式
escape-cc 替换控制字符
space-cc 替换控制字符为空格
drop-cc 结果字符串将不包含控制字符,转义序列或空间的任何其他替换字符。
操作系统版本syslog的使用情况
rpm -ql rsyslog-5.8.10-8.el6.x86_64
/etc/logrotate.d/syslog #用于logrotate的配置
/etc/pki/rsyslog
/etc/rc.d/init.d/rsyslog #rsyslog的服务管理脚本
/etc/rsyslog.conf #主配置文件
/etc/rsyslog.d #配置文件包含目录
/etc/sysconfig/rsyslog #rsyslogd选项
/lib64/rsyslog #库文件目录
/sbin/rsyslogd #运行的二进制文件
/usr/share/doc/rsyslog-5.8.10 #帮助文档
/etc/rsyslog.conf配置内容简介:
$ModLoad imuxsock #本地系统日志的输入支持(e.g. via logger command)
$ModLoad imklog #提供内核日志输入支持
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat #默认模板
$IncludeConfig /etc/rsyslog.d/*.conf #配置文件包含目录
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
...
将各种日志的各种级别进行输出重定向到文件
/etc/logrotate.d/syslog
利用syslog将系统各种信息输出到指定的各个文件之后,再利用logrotate去对日志进行滚动压缩等操作
示例:
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
#在进行日志滚动的时候需要发送HUP信号给syslogd进程,关闭打开的所有文件
endscript
}
logrotate
可以基于日志的大小或时间进行滚动,支持压缩,拷贝等众多功能。
rpm -ql logrotate-3.7.8-17.el6.x86_64
/etc/cron.daily/logrotate #由cron定时任务管理器来启动logrotate
/etc/logrotate.conf #logrotate主配置文件
/etc/logrotate.d #logrotate配置文件目录
/usr/sbin/logrotate #logrotate运行的二进制文件
/usr/share/doc/logrotate-3.7.8 #关于logrotate的文档信息
/etc/logrotate.conf配置文件简介:
compress #全局指定,日志进行压缩处理。
"/var/log/httpd/access.log" /var/log/httpd/error.log {
rotate 5 #轮转5个日志,之前的会被移除
mail [email protected] #发送邮件信息
size 100k #按照大小进行轮转
sharedscripts # 如果指定了sharedscripts,那么脚本只运行一次,因为在多个日志进行轮转的时候只需要执行一次重载服务即可。
postrotate
/usr/bin/killall -HUP httpd
endscript #在postrotate和endcript之间的内容,在日志文件轮转后执行(使用/bin/sh)。
}
cron定时任务
logrotate由cron进行定时触发执行,而logrotate作为syslog的工具对日志进行滚动,syslog进行日志分类收集存储。
rpm -ql crontabs-1.10-33.el6.noarch
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab
/usr/bin/run-parts
/usr/share/man/man4/crontabs.4.gz
rpm -ql cronie-1.4.4-15.el6_7.1.x86_64
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/rc.d/init.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/sbin/crond
Cron在crontab文件中搜索/var/spool/cron,这些文件以/etc/passwd中的帐户命名; 找到的crontabs被加载到内存中。
Cron还会搜索/etc/anacrontab和/etc/cron.d目录中具有不同格式的任何文件(请参阅crontab(5))。
使用modtime选项时,Cron会每分钟检查一次crontables的modtimes以检查是否有任何更改,并重新加载已更改的crontables。
Cron检查的目录如下:
/etc/crontab #系统的crontab,现在文件默认是空的。通过读取/etc/anacrontab配置文件的anacron运行。
/etc/cron.d/ #包含为不同用户存储的系统cron job的目录。
/var/spool/cron #包含由crontab命令创建的用户crontables的目录。