一、概述
syslogd是Linux系统的日志服务守护进程,通过配置文件/etc/syslog.conf可以配置日志等级和要日志被记录的文件。
rsyslog是syslogd的多线程增强版,Gentoo发行版使用syslogd, Ubuntu发行版和Centos 6版本以上发行版均使用rsyslog
syslog-ng 也是syslogd 的一种增强版本。
二、syslog配置文件语法:
1.基本语法说明
#开头的为注释
facility.level action
说明 :facility.[=,!]level为选择条件,消息类型.日志级别,之间用一个小数点"."分隔。action和facility.level之间使用TAB隔开。
=和!为可选,只有点:输出大于等于某等级的日志; .=等于某等级; .!不等于某等级的所有
facility.level可以有多组,直接用分号;隔开
消息类型和日志级别也可以分别有多个,之间用逗号,隔开
如:
*.=debug;auth,authpriv.none;mail.none -/var/log/debug
-表示延迟写入
2.消息类型主要有以下几种:
kern 内核信息,首先通过 klogd 传递;
user 用户进程;
mail 邮件;
daemon 后台进程;
authpriv 授权信息;
syslog 系统日志;
lpr 打印信息;
news 新闻组信息;
uucp 由uucp生成的信息
cron 计划和任务信息。
mark syslog 内部功能用于生成时间戳
local0 - local7 自定义程序使用,例如使用 local5 做为 ssh 功能
-
通配符代表除了 mark 以外的所有功能
3.日志级别主要有以下几种:
emerg 或 panic 该系统不可用(最紧急消息)
alert 需要立即被修改的条件(紧急消息)
crit 阻止某些工具或子系统功能实现的错误条件(重要消息)
err 阻止工具或某些子系统部分功能实现的错误条件(出错消息)
warning 预警信息(警告消息)
notice 具有重要性的普通条件(普通但重要的消息)
info 提供信息的消息(通知性消息)
debug 不包含函数条件或问题的其他信息(调试级-信息量最多)
none 没有重要级,通常用于排错(不记录任何日志消息)
-
所有级别,除了none
4.action 动作域:
动作域支持三类:日志信息可以分别记录到多个文件里,还可以发送到命名管道、其他程序甚至另一台机器。
file 指定文件的绝对路径
terminal 或 print 完全的串行或并行设备标志符
@host(@IP地址) 远程的日志服务器
* 所有用户,如:*.emery *
|/dev/console 通过管道发送到控制台
5.常用日志文件说明:
/var/log/lastlog : 记录每个使用者最近签入系统的时间
/var/run/utmp : 记录每个使用者签入系统的时间, who, users, finger 等指令会查这个档案.
/var/log/wtmp : 记录每个使用者签入及签出的时间, last 这个指令会查这个档案. 这个档案也记录 shutdown 及 reboot 的动作.
/var/log/secure : 登录系统的信息
/var/log/maillog : 记录 sendmail 及 pop 等相关讯息.
/var/log/cron : 记录 crontab 的相关讯息 ,定时器的信息
/var/log/dmesg : /bin/dmesg 会将这个档案显示出来, 它是开机时的画面讯息.
/var/log/xferlog : 记录那些位址来 ftp 拿取那些档案.
/var/log/messages : 系统大部份的讯息皆记录在此, 包括 login, check password , failed login, ftp, su 等.
系统产生的日志文件/var/log/messages, /var/log/syslog, /var/log/kernel, 其中内容多有重复。
系统产生的日志中这3个文件最大,占用存储空间较多。Ubuntu16.04版本中只打开了syslog和kernel;红帽发行版中关闭了syslog,打开了messages;
我们平时常用的是messages,可以关闭/var/log/syslog系统日志。
关闭方法:
修改syslogd的主配置文件/etc/syslog.conf,注释掉其中的
.;auth,authpriv.none -/var/log/syslog
三、rsyslog配置文件语法
1.配置文件结构
配置文件/etc/rsyslog.conf大概分为三个部分:
####MODULES####
这个部分是针对接收配置的,主要是指定接收日志的协议和端口。若要配置日志服务器,则需要将相应的配置项去掉注释。
####GLOBAL DIRECTIVES####
这个部分主要用来配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。
RULES
这一部分是规则文件,每行配置分两个字段,第一字段是说明要记录哪类日志(包括消息类型和等级),第二字段是说明日志存放位置(action),可以是本地文件,也可以是远程服务器。
filter action
rsyslog发现符合 filter 规则的日志后,会将日志发送到 action 指定的动作进行处理。
1> Filter
在rsyslog中,提供了三种方式的过滤器方法:
(1) 基于设施/优先级的过滤器(Facility/Priority-based filters)
这部分同syslog配置文件
(2) 基于属性的过滤器
语法:
:PROPERTY, [!]COMPARE_OPERATION, “STRING”
:PROPERTY是要比较的日志属性,COMPARE_OPERATION为要执行的比较操作,这个的!表示取反的意思,"STRING"为比较的值。
可以使用的比较操作有:
比较操作 描述
contains 匹配提供的字符串值是否是属性的一部分,如果不区分大小写,使用contains_i
isequal 比较属性和值是否相等
startswith 属性是否以指定字符串开始(startswith_i)
regex 正则表达式(POSIX BRE 基本正则)匹配
ereregex 正则表达式(POSIX ERE 扩展正则)匹配
isempty 判断属性是否为空,不需要 value
使用范例:
:msg, contains, “error”
:hostname, isequal, “host1”
:msg, !regex, “fatal .* error”
(3) 基于表达式的过滤器
基于表达式的过滤器使用了rsyslog自定义的脚本语言RainerScript构建复杂的filter,这里暂时不对这种方法进行讲述。
2> Action
Action定义了当匹配指定的 filter 的时候,执行什么操作。
如果要指定多个 ACTION, 使用&连接多个 ACTION。
例如:
kern.=crit user1
& @192.168.0.1
local3.* ^/tmp/a.sh # ^号后跟可执行脚本或程序的绝对路径
在 ACTION 后面追加;模板名称可以为指定的 action 使用该模板格式化日志。
kern.=crit user1
& ^test-program;temp
这里的;temp指定了传递日志给 test-program 程序时(^开头表明日志发送给该可执行文件), 使用它 temp 模板格式化日志。
(1)保存日志到日志文件
语法:
FILTER PATH
这里的PATH指定了日志要保存到的文件。
例如cron.* /var/log/cron.log指定了所有的定时任务日志都写入到/var/log/cron.log文件。
默认情况下,每次生成 syslog 的时候,日志信息会同步到日志文件。可以在文件路径前使用-指定忽略同步(如果系统崩溃,会丢失日志,但是这样可以提高日志性能)。
(2)动态生成日志文件。
上述方法记录日志可认为是"静态"的;可以通过,模板配置生成特定的文件名(如带有时间戳)
模板可以用来生成动态文件名,在使用动态文件名的时候,需要在 ACTION 中的模板名称前增加?表明该文件名是动态生成的。
例如:
$template DynamicFile,“/var/log/test_logs/%timegenerated%-test.log” # 预定义模板
FILTER ?DynamicFile # 使用模板
DynamicFile是预定义的输出路径模板; timegenerated属性从日志信息中提取出消息的时间戳,这样可以为每个日志生成唯一文件名称。
(3)通过网络发送syslog
rsyslog可以使用网络将日志消息发送或者接受日志,使用这个特性,可以实现使用单一的日志服务器统一管理多台服务器日志。
@[(zNUMBER)]HOST:[PORT]
这里的@告诉syslog使用UDP协议发送日志,要使用TCP的话,使用@@。可选值zNUMBER设置了是否允许使用zlib对日志压缩(压缩级别1-9)。
使用范例
*.* @192.168.0.1 # 使用 UDP 发送,默认端口514
*.* @@example.com:18 # 使用 TCP 发送到端口18, 默认10514
*.* @(z9)[2001:db8::1] # UDP, ipv6,使用zlib级别9压缩
(4)丢弃日志
要丢弃日志消息,使用~动作。
FILTER ~
例如:
cron.* ~
2.其他语法
1>模板
任何rsyslog生成的日志都可以根据需要使用模板进行格式化,要创建模板,使用如下指令
t
e
m
p
l
a
t
e
T
E
M
P
L
A
T
E
N
A
M
E
,
"
t
e
x
t
解释:
template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION] 解释:
templateTEMPLATENAME,"text解释:template指令表明了接下来的内容定义了一个模板,TEMPLATE_NAME是模板的名称,接下来双引号之间的内容为模板的内容。
可选选项 OPTION 指定了模板的功能,支持选项为sql和stdsql,在使用数据库存储的时候会用到。
2>全局指令
全局指令是rsyslogd守护进程的配置指令。
所有的全局指令必须以$开始,每行只能有一个指令,例如:
$MainMsgQueueSize 50000
在新的配置格式中(rsyslog v6),已经不在使用这种方式的指令,但是它们仍然是可用的。
四、syslog日志服务的使用
1.C接口
syslog(LOG_USER | LOG_INFO, “syslog test message generated in program %s \n”, argv[0]);
2.shell命令接口
logger -p kern.info “it will add to messages file”
五、syslogd
注意:busybox中的syslogd可能自带转储功能,所以不需要logrotate关心,该转储功能是由syslogd自身实现的
root@Austin:~# fuser /var/log/messages
145
root@Austin:~# ps | grep 145
145 root 0:08 /sbin/syslogd -n
root@Austin:~# syslogd --help
BusyBox v1.35.0 (2023-10-11 16:26:24 CST) multi-call binary.
Usage: syslogd [OPTIONS]
System logging utility
(this version of syslogd ignores /etc/syslog.conf)
-n Run in foreground
-R HOST[:PORT] Log to HOST:PORT (default PORT:514)
-L Log locally and via network (default is network only if -R)
-O FILE Log to FILE (default: /var/log/messages, stdout if -)
-s SIZE Max size (KB) before rotation (default 200KB, 0=off)
-b N N rotated logs to keep (default 1, max 99, 0=purge)
-l N Log only messages more urgent than prio N (1-8)
-S Smaller output
-t Strip client-generated timestamps