工具
Web 开发
Web 服务
系统日志
CentOS 5 及之前的系统日志主要有 2 个组成部分:syslogd
记录应用程序日志,klogd
记录 Linux 内核日志。日志格式为:
Datetime Hostname Process[pid] EventLog
CentOS 6 之后 ryslogd
替代了传统的 syslogd。rsyslogd 支持多线程、TCP/UDP/TLS 等多种协议,可以将日志存储在 MySQL 等数据库;有强大的过滤功能,支持自定义日志格式等。
常用日志命令与文件
CentOS 系统日志文件:
-
/var/log/message
- 标准系统日志 -
/var/log/maillog
- 邮件系统日志 -
/var/log/cron
- crond 计划任务日志 -
/var/log/secure
- sshd 登录日志等 -
/var/log/dmesg
- Linux 系统启动过程中的日志 - /
var/log/lastlog
- 用户最近登录日志 -
/var/log/wtmp
- 用户登录、注销、系统启动等日志 -
/var/log/btmp
- 失败或错误的登录日志
查看系统引导过程中的日志 /var/log/dmesg
:
$ dmesg
查看系统所有用户最近一次登录系统的时间 /var/log/lastlog
:
$ lastlog
查看当前成功登录系统的日志 /var/log/wtmp
:
$ last
查看当前成功登录系统的日志 /var/log/btmp
:
$ sudo lastb
syslog 的基础概念
Facility - 日志的分类,常见分类:
-
auth
(认证) -
authpriv
(授权) -
cron
,daemon
,kern
-
lpr
,mail
,news
-
security
,user
-
uucp
(文件 copy 相关) local 0-7
Priority - 系统日志级别:
- 0 -
emerg
- 1 -
alert
- 2 -
crit
- 3 -
err
- 4 -
warning
- 5 -
notice
- 6 -
info
- 7 -
debug
logger
生成一条日志:
$ logger 'test logger tool by idleworks'
查看日志:
$ sudo tail -f /var/log/messages
Nov 6 15:28:23 HOSTNAME USER[128616]: test logger tool by idleworks
macOS
macOS 下的日志文件与 Linux 不同,可以用 console.app 查看。
编程语言中的 syslog
PHP
写入 /var/log/messages
文件:
syslog(LOG_WARNING, 'Log from PHP warning tips');
Python
写入 /var/log/messages
文件:
import syslog
syslog.syslog(syslog.LOG_ERR, 'Log from Python warning tips')
写入 /var/log/maillog
文件:
syslog.openlog(facility = syslog.LOG_MAIL)
syslog.syslog('Python syslog test: E-mail processing initiated...')
rsyslogd
rsyslogd 从多个来源获取日志数据,经过处理、过滤,再将日志输出到不同的地方,因此逻辑上它分为:input, pre-processor, parser & Filter, output 这几个部分。
查看 rsyslog 服务的状态:
$ systemctl status rsyslog.service
rsyslogd 默认在 514 端口监听:
$ netstat -nlpt -v4
查看 rsyslogd 的版本以及运行时信息:
$ rsyslogd -v
查看 rsyslog 的配置文件:
$ cat /etc/rsyslog.conf
查看 rsyslog 打开了哪些文件:
$ sudo lsof -c rsyslog
查看状态文件:
$ sudo cat /var/lib/rsyslog/imjournal.state && echo
rsyslogd 配置文件
rsyslogd 配置文件分为三部分:
- Modules - 模块
- Directives - 指令
- Rules - 规则
rsyslogd Modules
- 输入模块以
im
打头(input modules),如imklg
,imsock
,imfile
等。 - 输出模块以
om
打头(output modules),如omudp
,omtcp
,omfile
等。 - 预处理模块主要是处理各种 syslog 协议实现的差异。
rsyslogd Rules
Rules 的格式:
facility.priority; facility.priority; ... target
target
指将日志输出到哪里去:
- 写入文件,文件名前面的
-
符号表示异步写入 - 用户名,将日志发送给用户终端显示
- 网络发送,
@
表示通过 UDP 发送日志,@@
表示通过 TCP 发送日志。 - 管道,日志将由其他命令处理
查看 rsyslogd 配置文件中的默认 Rules:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
解析:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
表示所有 info
级别的日志都往 /var/log/messages
写,但 mail, authpriv, cron
这几个除外 — 因为它们各自有自己专属的日志文件:
-
authpriv
-/var/log/secure
-
mail
-/var/log/maillog
-
cron
-/var/log/cron
所以 sshd 的日志文件在哪里?查看 sshd 的配置文件,找到关于日志记录的配置:
$ sudo cat /etc/ssh/sshd_config | grep log
SyslogFacility AUTHPRIV
从这里可见 sshd 的日志属于 AUTHPRIV
,可以从 /var/log/secure
文件查看。
systemd-journald
查看 systemd-journald 的配置文件:
$ cat /etc/systemd/journald.conf
注意到几个配置选项。
-
Storage=auto
, Storage 表示日志存储方式-
volatile
- 只存储于内存,即/run/log/journal/
-
persistent
- 只存储于磁盘,即/var/log/journal/
-
auto
- 存储于内存或磁盘,取决于/var/log/journal/
路径是否存在 -
none
- 不存储日志,全部 drop
-
查看 journald 文件占用的磁盘空间:
$ du -sh /var/log/journal/
journalctl
滚动显示系统日志(类似 tail -f file
):
$ sudo journalctl -f
查看指定进程的日志:
$ ps -e | grep rsys
1384 ? 00:00:11 rsyslogd
$ sudo journalctl _PID=1384
查看指定用户的日志:
$ id root
uid=0(root) gid=0(root) 组=0(root)
$ sudo journalctl _UID=0
查看指定服务的日志:
$ sudo journalctl -u httpd.service
$ sudo journalctl -u rsyslog.service --since today
$ sudo journalctl -u rsyslog.service --since '2022-11-05'
查看指定级别的日志:
$ sudo journalctl -p err
以 JSON 格式输出:
$ sudo journalctl -p err -o json
$ sudo journalctl -p err -o json-pretty
查看日志占用磁盘空间:
$ sudo journalctl --disk-usage
查看 journal 二进制文件:
$ journalctl --file /var/log/journal/3a96.journal
读取一个日志目录下的所有 journal 文件:
$ journalctl -D /var/log/journal/
logrotate
查看 logrotate 配置文件:
$ cat /etc/logrotate.conf
$ cat /etc/logrotate.d/*
$ ls /etc/logrotate.d/
bootlog btmp chrony dnf exim firewalld httpd lsyncd mariadb nginx php-fpm psacct redis samba sssd syslog up2date wtmp
logrotate 基于 cron 运行,其脚本为:
$ cat /etc/cron.daily/logrotate