服务简述
在 CentOS 6.x 中日志服务已经由 rsyslogd 取代了原先的 syslogd 服务。Redhat 认为 syslogd 已经不能满足在工作中的需求,rsyslogd 相比 syslogd 具有一些新的特点:
- 基于 TCP 网络协议传输日志信息;
- 更安全的网络传输方式;
- 有日志消息的及时分析框架;
- 后台数据库;
- 配置文件中可以写简单的逻辑判断;
- 与 syslog 配置文件相兼容;
日志文件
日志文件路径 | 日志说明 |
---|---|
/var/log/cron | 记录了系统定时任务相关的日志 |
/var/log/cups/ | 记录打印信息的日志 |
/var/log/dmesg | 记录了系统在开机时内核自检的信息;使用 dmesg 命令直接查看内核自检信息 |
/var/log/btmp | 二进制文件,记录错误登录的日志;使用 lastb 命令查看 |
/var/log/lastlog | 二进制文件,记录系统中所有用户最后一次的登录时间的日志;使用lastlog 命令查看 |
/var/log/mailog | 记录邮件信息 |
/var/log/message | 记录系统重要信息的日志;如果系统出现问题时,首先要检查的就应该是这个日志文件 |
/var/log/secure | 记录验证和授权方面的信息 |
/var/log/wtmp | 二进制文件,永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、 关机事件;使用last 命令查看 |
/var/run/utmp | 二进制文件,记录当前已经登录的用户的信息;随着用户的登录和注销 而不断变化,只记录当前登录用户的信息;使用w 等命令查看 |
其他 | /var/log/httpd/、/var/log/samba/等通过rpm方式安装的系统服务也会记录在/var/log中,不过是由自己的日志管理文档来记录日志的 |
文件格式
由日志服务 rsyslogd 记录的日志文件,他们的格式是一样的,基本日志格式包含以下四列:
- 事件产生的时间;
- 发生事件的服务器的主机名;
- 产生事件的服务名或程序名;
- 事件的具体信息。
配置文件
/etc/rsyslog.conf:配置文件路径
文件格式:服务名称[连接符号]日志等级-----日志记录位置
# Log cron stuff
cron.* /var/log/cron
rsyslogd 服务代管的服务日志:
服务名称 | 服务说明 |
---|---|
auth(LOG_AUTH) | 安全和认证相关消息(不推荐使用 authpriv 替代) |
authpriv(LOG_AUTHPRIV) | 安全和认证相关消息(私有的) |
cron(LOG_CRON) | 系统定时任务 cront 和 at 产生的日志 |
daemon(LOG_DAEMON) | 和各个守护进程相关的日志 |
ftp(LOG_FTP) | ftp 守护进程产生的日志 |
kern(LOG_KERN) | 内核产生的日志(不是用户进程产生的) |
local0-local7(LOG_LOCAL0-7) | 为本地使用预留的服务 |
lpr(LOG_LPR) | 打印产生的日志 |
mail(LOG_MAIL) | 邮件收发信息 |
news(LOG_NEWS) | 与新闻服务器相关的日志 |
syslog(LOG_SYSLOG) | 有 syslogd 服务产生的日志信息虽然服务名称已经改为rsyslogd,但是很多配置都还是沿用了 syslogd 的,这里 并没有修改服务名。 |
user(LOG_USER) | 用户等级类别的日志信息 |
uucp(LOG_UUCP) | uucp 子系统的日志信息,uucp 是早期 linux 系统进行数 据传递的协议,后来也常用在新闻组服务中。 |
连接符号:
日志的格式:日志服务[连接符号]日志等级 日志记录位置
连接符号说明:
-
“.”代表只要比后面的等级高的(包含该等级)日志都记录下来。比如:“cron.info”代表 cron 服务产生的日志,只要日志等级大于等于 info 级别,就记录
-
“.=”代表只记录所需等级的日志,其他等级的都不记录。比如:“*.=emerg”代表任何日志服务产生的日志,只要等级是 emerg 等级就记录
-
“.!”代表不等于,也就是除了该等级的日志外,其他等级的日志都记录。
日志等级
等级名称 | 等级说明 |
---|---|
debug(LOG_DEBUG) | 一般的调试信息说明 |
info(LOG_INFO) | 基本的通知信息 |
notice(LOG_NOTICE) | 普通信息,但是有一定的重要性 |
warning(LOG_WARNING) | 警告信息,但是还不回影响到服务或系统的运行 |
err(LOG_ERR) | 错误信息,一般达到 err 等级的信息以及可以影响到服务或系 统的运行了 |
crit(LOG_CRIT) | 临界状况信息,比 err 等级还要严重 |
alert(LOG_ALERT) | 警告状态信息,比 crit 还要严重。必须立即采取行动 |
emerg(LOG_EMERG) | 疼痛等级信息,系统已经无法使用了 |
* | 代表所有日志等级 |
none | 忽略这个日志服务,该服务的 所有日志都不再记录。 |
记录位置
日志记录位置就是当前日志输出到哪个日志文件中保存,当然也可以把日志输出到打印机打印,或者输出到远程日志服务器上(当然日志服务器要允许接收才行)。
- 日志文件的绝对路径。这是最常见的日志保存方法,如“/var/log/secure”就是保存系统验证和授权信息日志的。
- 系统设备文件。如“/dev/lp0”代表第一台打印机,如果日志保存位置是打印机设备的话,当有日志时就会在打印机打印。
- 转发给远程主机。因为可以选择使用 TCP 协议和 UDP 协议传输日志信息,所以有两种发送格式。如使用“@192.168.0.210:514”,就会把日志内容使用 UDP 协议发送到192.168.0.210 的 UDP 514 端口上;如果使用“@@192.168.0.210:514”就会把日志内容使用 TCP 协议发送到 192.168.0.210 的 TCP 514 端口上,其中 514 是日志服务默认端口。当然只要 192.168.0.210 同意接收此日志,就可以把日志内容保存在日志服务器上。
- 用户名。如“root”,就会把日志发送给 root 用户,当然 root 要在在线,否则就收不到日志信息了。发送日志给用户时,可以使用*代表发送给所有在线用户,如“mail.**”就会把 mail 服务产生的所有级别的日志发送给所有在线用户。如果需要把日志发送给多个在线用户,用户名之间用“,”分隔。忽略或丢弃日志。如果接受日志的对象是“~”,代表这个日志不会记录,而被直接丢弃。如“local3.*~”代表忽略 local3 服务类型所有的日志都不记录。
rsyslog.conf
# rsyslog 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 #### ----------加载的模块
# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
# ----加载imuxsock模块,为本地系统登陆提供支持
$ModLoad imjournal # provides access to the systemd journal
# imjournal支持对系统日志的访问
#$ModLoad imklog # reads kernel messages (the same are read from journald)
# imklog 模块,为内核登录提供支持
#$ModLoad immark # provides --MARK-- message capability
# immark模块,提供标记信息的能力
# Provides UDP syslog reception -----------------UPD 模块,允许使用 UDP 的 514 端口接收采用 UDP 协议转发的日志
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception------------------TCP 模块,允许使用 TCP 的 514 端口接收采用 TCP 协议转发的日志
#$ModLoad imtcp
#$InputTCPServerRun 514
#### GLOBAL DIRECTIVES ####----------------------全局定义设置
# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog # ---------------服务的工作目录
# 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 --------------------------文件同步功能,默认没有开启
# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf # -----------------------包含子配置文件
# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on #-----------------------省略本地登陆
# File to store the position in the journal
$IMJournalStateFile imjournal.state
#### RULES #### ------------------日志文件保存规则
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console--------------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 # -----所有服务.info 以上级别的日志保存在/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 :omusrmsg:*# ------------所有日志服务的疼痛等级日志对所有在线用户广播
# 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
# ### 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.
#$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 ###
操作实践
定义自己的日志:把所有服务的info级别的日志都保存在/var/log/info.log中
# 修改配置文件:vim /etc/rsyslog.conf
vim /etc/rsyslog.conf
# 添加以下规则
*.=info /var/log/info.log
# 重启服务
systemctl restart rsyslog
# 验证是否生成了相关文件
日志轮替
日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除。那么旧的日志文件改名
之后,如何命名呢?主要依靠 /etc/logrotate.conf 配置文件中“dateext”参数:
-
如果配置文件中拥有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如 “secure-20180605”。这样的话日志文件名不会重叠,所以也就不需要日
志文件的改名, 只需要保存指定的日志个数,删除多余的日志文件即可。
-
如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新
建“secure”日志, 用来保存新的日志。当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”, 当前的“secure”日志会自动改名为“secure.1”,然后也
会新建“secure”日志,用来保存新的日志,以此类推。
logrotate 配置文件:
[root@yunmx log]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly #---------------------每周对日志进行一次轮替
# keep 4 weeks worth of backlogs
rotate 4 # -------保存 4 个日志文件,也就是说如果进行了 5 次日志轮替,就会删除第一个备份日志
# create new (empty) log files after rotating old ones
create # -------在日志轮替时,自动创建新的日志文件
# use date as a suffix of the rotated file
dateext # -------使用日期作为日志轮替文件的后缀
# uncomment this if you want your log files compressed
#compress # -------日志文件是否压缩
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d # -----------包含的其他子配置文件
# no packages own wtmp and btmp -- we'll rotate them here --------以下有自己独立的参数配置,独立参数优先级更高
/var/log/wtmp {
monthly # 每月轮替
create 0664 root utmp # 建立新的日志文件,并赋予相关权限
minsize 1M # 日志轮替的大小是1M,超过1M才轮替
rotate 1 # 保留一个月
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
主要的参数说明:
参数 | 参数说明 |
---|---|
daily | 日志的轮替周期是每天 |
weekly | 日志的轮替周期是每周 |
monthly | 日志的轮替周期是每月 |
rotate 数字 | 保留的日志文件的个数;0 表示没有备份 |
compress | 日志轮替时,旧的日志进行压缩 |
create mode owner group | 建立新日志,同时指定新日志的权限与所有者和所属组 |
mail address | 当日志轮替时,输出内容通过邮件发送到指定的邮件地址 |
missingok | 如果日志不存在,则忽略该日志的警告信息 |
notifempty | 如果日志为空文件,则不进行日志轮替 |
minsize 大小 | 日志轮替的最小值。也就是日志一定要达到这个最小值才会轮 替,否则就算时间达到也不轮替 |
size 大小 | 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。 如 size 100k |
dateext | 使用日期作为日志轮替文件的后缀 |
sharedscripts | 在此关键字之后的脚本只执行一次 |
prerotate/endscript | 在日志轮替之前执行脚本命令。endscript 标示 prerotate 脚本结束 |
postrotate/endscript | 在日志轮替之后执行脚本命令。endscript 标示 postrotate 脚本结束 |
prerotate 和 postrotate 主要用于在日志轮替的同时,执行指定的脚本,一般用于日志轮替之后的重启服务。
举例说明:如果要把nginx服务的日志加入日志轮替,在postrotate/endscript之间就要执行重启rsyslog服务和ngnx服务的脚本。
logrotate 命令
我们日志轮替之所以可以在指定的时间备份日志,其实也要依赖系统定时任务;/etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件,
logrotate 通过这个文件依赖定时任务执行的。
命令格式:logrotate [选项] 配置文件名
选项:
- -v: 显示日志轮替过程。加了-v 选项,会显示日志的轮替的过程
- -f: 强制进行日志轮替。不管日志轮替的条件是否已经符合,强制配置文件中所有 的日志进行轮替