系统日志

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