常见日志类型分为:
• auth # 主要与认证 / 授权有关的机制,例如 login, ssh, su
• authpriv # 与 auth 类似,但记录较多账号私人的信息
• cron # 定时任务相关
• kern # 内核产生的日志
• mail # 邮件收发信息
• lpr # 打印产生的日志
• user # 用户程序产生的日志信息
日志级别用来指出消息的优先等级,即消息的重要程度。其优先级别如下(数字等级越小,优先级越高,消息越重要,但记录的信息越少):
0 emerg (紧急):会导致系统不可用的情况,一般是硬件出现问题
1 alert (警告):必须马上采取措施解决的问题。
2 crit (严重):严重的错误。
3 err (错误):运行出现错误。
4 warning (提醒):可能影响系统功能,需要提醒用户的重要事件。
5 notice (注意):不会影响正常功能,但是需要注意的事件。
6 info (信息):一般信息。
7 debug (调试):程序或系统调试信息等。
除此之外, " 日志类型 " 与 " 日志级别 " 可以使用星号( * )代表所有,因此 *.* 就表示来自所有类型的所有级别的消息。
"执行动作 " 字段则用来定义如何处理接收到的消息,可以指定如下几项内容:
/PATH/FILENAME 将消息存储到指定的文件中,文件必须以斜线( / )开头的绝对路径命名;
:omusrmsg:USERNAME 将消息发送给指定的已经登录的用户;
@HOSTNAME 将消息转发到指定的日志服务器;一个 @ 表示通过 UDP 发送,两个 @ 表示通过 TCP 发送
:omusrmsg:* 将消息发送给所有已经登录的用户。
*.info;mail.none;authpriv.none;cron.none :由于 mail, authpriv, cron 等类别产生的讯息
较多, 且已经写入底下的几个文件中,因此在 /var/log/messages 里面就不记录这些内容。除此之外的其他讯息都写入/var/log/messages 中
预设规则解读
• authpriv.* :认证方面的讯息均写入 /var/log/secure 文件;
• mail.* :邮件方面的讯息则均写入 /var/log/maillog 文件;
• cron.* :计划任务均写入 /var/log/cron 文件;
• *.emerg :当产生最严重的错误等级时,将该等级的讯息广播给所有在系统登录的账号,要这么做的原因是希望在线的用户能够赶紧通知系统管理员来处理错误。
• uucp,news.crit : uucp 是早期 Unix-like 系统进行数据传递的通讯协议,后来常用在新闻组的
用途中。 news 则是新闻组。当新闻组方面的信息有严重错误时就写入 /var/log/spooler 文件中;
• local7.* :将本机开机时应该显示到屏幕的讯息写入到 /var/log/boot.log 文件中;
自定义日志采集格式
$template 自定义格式名 , "%timegenerated% %FROMHOST-IP% %syslogtag% %msg%\n"
"%timegenerated% # 显示日志时间
%FROMHOST-IP% # 显示主机 IP
%syslogtag% # 日志记录目标
%msg% # 日志内容
\n # 换行
日志类型 . 日志级别 执行动作 ; 自定义格式名 # 在指定的日志中采用自定义格式
$ActionFileDefaultTemplate 自定义格式名 # 修改系统默认日志采集格式为自定义格式
# 根据客户端的 IP 单独存放主机日志在不同目录,设置远程日志存放路径及文件名格式
$template Remote, "/var/log/syslog/%fromhost-ip%/%fromhost-ip%_% $YEAR %-% $MONTH %-
% $DAY %.log"
# 排除本地主机 IP 日志记录,只记录远程主机日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
# 注意此规则需要在其它规则之前,否则配置没有意义,远程主机的日志也会记录到 Server 的日志文件中
# 忽略之前所有的日志,远程主机日志记录完之后不再继续往下记录
& ~
journalctl :日志查看工具
-n 3 ## 查看最近 3 条日志
-p err ## 查看错误日志
-o verbose ## 查看日志的详细参数
--since ## 查看从什么时间开始的日志
--until ## 查看到什么时间为止的日志
_PID = pid # 只输出指定 PID 号码的信息
_UID = uid # 只输出指定 UID 号码的信息
如何使用 systemd-journald 保存系统日志,默认 systemd-journald 是不保存系统日志到硬盘的
那么关机后再次开机只能看到本次开机之后的日志,关机之前的日志时无法查看的,想要保存日志需要进行如下操作
mkdir /var/log/journal
chgrp systemd-journal /var/log/journal
chmod g + s /var/log/journal
killall -1 systemd-journald
ls /var/log/journal
日志切割(轮循)
日志切割指的是当应用程序或操作系统的日志文件满足设定的触发条件,对其进行切割 / 分割处理。切割后的日志会在原有日志的基础上多出一个新的日志文件,且后续产生的日志也会被写入到新的日志文件中,直到下一次满足设定的触发条件时。
一般情况下,我们习惯于将各种应用程序 (Web 端程序、应用服务、数据库等 ) 软件部署在 Linux 操作系统上,但众多软件部署后运行时会产生对应的日志记录,以便于出现故障后能够及时排查问题原因。
但久而久之,随着时间的推长,应用程序的日志文件可能会变得很庞杂,这对于运维、管理、故障排查等来说非常不方便,因此,及时对日志进行定期切割和清理时非常有必要的。
Linux 操作系统上切割日志可以通过 logrotate 来实现。
相比其他日志切割软件来看,使用 logrotate 有以下优点:
- logrotate 是Linux操作系统上自带的一款开源的日志切割软件,因此你无需安装
- logrotate 自身已经集成进操作系统的定时任务中,因此无需再配置定时任务
- logrotate 自身支持日志压缩
logrotate 的全局配置文件为 /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly # 表示每周轮转一次,常见用法有 daily 、 weekly 、 monthly 、 yearly
# keep 4 weeks worth of backlogs
rotate 4 # 保留的日志副本数
# 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 # 日志轮转时会加载 /etc/logrotate.d/ 目录下的所有配置文件
( ps :该目录下的配置必须在操作系统中有 rpm 包存在)
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
#/var/log/btmp 和 /var/log/wtmp 两个日志因为在操作系统中没有对应的 rpm 包,因此被当作 " 孤
儿 " 日志,配置在 /etc/logrotate.conf 全局配置中。
# system-specific logs may be also be configured here.
倘若操作系统上新部署了一项应用程序,或需要对其他的日志文件配置切割规则,你可以自定义
logrotate 的配置文件使其生效。这里以 /var/log/audit/audit.log 日志为例
[root@hostname ~] # cat /etc/logrotate.d/audit
/var/log/audit/*.log {
missingok # 日志切割时缺少该日志不会报错
weekly # 每周切割一次
rotate 10 # 切割后最多保留 10 个文件
size + 100M # 当前日志容量超过 100M 时 , 立即进行日志切割
compress # 切割后的日志进行压缩
dateext # 切割后的日志以时间 ' 年月日 ' 为后缀
notifempty # 日志为空时不进行切割
create 0600 root root # 切割时创建一个新日志文件 , 模式为 0600, 日志属组为 root
root
}
logrotate --debug --force /etc/logrotate.d/audit # 测试配置文件是否合法
-v :启动显示模式,会显示日志切割时的运作过程
-f :不论是否符合配置文件的数据,强制登录档进行切割的动作!
给日志文件添加 a 属性后日志切割时的设置
[root@localhost ~] # cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure/var/log/spooler
{
sharedscripts # 使用脚本
prerotate # 在日志切割之前要做的事
/usr/bin/chattr -a /var/log/messages # 执行了 chattr -a
endscript # 脚本结束
sharedscripts # 使用脚本
postrotate # 在日志切割之后要做的事
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2 > /dev/null || true # 重启rsyslog
/usr/bin/chattr + a /var/log/messages # 执行了 chattr +a
endscript # 脚本结束
}