《UNIX/Linux系统管理技术手册-读书笔记-第十章

日志

1. 日志概述

概念 说明 能做什么
日志消息 时间戳+事件类型+严重程度+进程名/PID+消息内容 记录系统运行状态、故障排查、安全审计
日志管理任务 ①收集 → ②查询/分析/过滤 → ③保留与过期管理 从海量消息中提取可操作信息
syslog 传统日志系统(IETF标准协议),消息分类+分发 集中管理日志,写入文件或网络转发
systemd journal systemd的二进制日志系统,索引化、可搜索 快速过滤查询,保留元数据
集中式日志 将全网日志汇总到中央服务器 跨系统统一查询、安全审计、合规留存

日志位置:默认/var/log,建议独立分区防止日志写满根文件系统。

2. systemd journal(Linux systemd 原生日志)

2.1 核心特性

特性 说明
二进制格式 所有消息属性被索引,搜索更快
数据来源 /dev/log(syslog兼容)、/dev/kmsg(内核)、套接字(服务stdout/API)、audit
持久化 默认auto(需/var/log/journal存在才持久),建议改为persistent

2.2 journalctl 常用命令

命令 功能
journalctl 查看所有日志
journalctl -u ssh 查看特定服务单元日志
journalctl -f 实时跟踪(类似tail -f)
journalctl -b 本次引导的日志
journalctl -b -1 上一次引导的日志
journalctl --list-boots 列出所有引导会话(带ID)
journalctl --since=yesterday --until=now 按时间段过滤
journalctl -n 100 /usr/sbin/sshd 特定程序最近100条
journalctl --disk-usage 查看日志占用磁盘空间
journalctl --verify 检查日志文件完整性

2.3 journald配置(持久化 + 密封)

配置文件:/etc/systemd/journald.conf + /etc/systemd/journald.conf.d/*.conf

关键配置项:

选项 值 说明
Storage persistent 强制持久化(推荐)
Storage=auto 默认 需要手动创建/var/log/journal
Seal yes 启用前向安全密封(FSS),防止篡改
Compress yes 压缩日志
MaxRetentionSec 时间 最大保留期限

启用持久化:

1
2
mkdir -p /var/log/journal
systemctl restart systemd-journald

或通过配置文件:

1
2
3
mkdir -p /etc/systemd/journald.conf.d
echo -e "[Journal]\nStorage=persistent" > /etc/systemd/journald.conf.d/storage.conf
systemctl restart systemd-journald

FSS密钥(防篡改):

1
journalctl --setup-keys   # 生成密钥对

3. syslog / rsyslog

3.1 rsyslog 概述

概念 说明
rsyslog syslog的现代实现(默认Linux),支持模块化、过滤、网络转发、TLS加密
架构 输入模块→过滤器→输出模块(事件流处理)
配置文件 /etc/rsyslog.conf + /etc/rsyslog.d/*.conf
FreeBSD 默认传统syslogd,可切换至rsyslog(ports安装)

3.2 rsyslog 配置语法(三种)

语法 说明 推荐度
sysklogd格式 传统facility.severity action ✅ 简单规则仍可用
遗留指令($开头) 如$ModLoad、$WorkDirectory ⚠️ 逐步废弃,但仍有必要
RainerScript 现代语法,支持表达式、条件、函数 ⭐ 推荐用于新配置

3.3 设施(Facility)与严重级别(Severity)

设施(信息来源) :

设施 用途 设施 用途
auth 安全/授权 authpriv 敏感授权(sudo等)
cron cron守护进程 daemon 系统守护进程
kern 内核 local0-7 本地自定义(8种)
mail 邮件系统 news Usenet新闻(已废弃)
syslog syslog内部 user 用户进程(默认)
ftp FTP(已废弃) lpr 打印系统

严重级别(递减) :

级别 含义 级别 含义
emerg 系统不可用 alert 立即行动
crit 临界状态 err 错误
warning 警告 notice 需调查
info 信息 debug 调试

3.4 常见配置示例

1. 基础配置(sysklogd格式) :

# 所有认证消息写入auth.log
auth.*                          /var/log/auth.log

# 所有设施.info及以上,排除mail/authpriv/cron
*.info;mail.none;authpriv.none;cron.none  /var/log/messages

# 内核关键消息写入控制台
kern.crit                       /dev/console

2. 网络转发客户端(RainerScript) :

# 转发所有syslog消息到中央服务器(TCP)
*.*  @@logs.admin.com

# 通过imfile导入Apache日志
module(load="imfile" mode="inotify")
input(type="imfile" Tag="apache-access" File="/var/log/apache2/access.log")

# 转发带标签的日志
if $programname contains 'apache' then {
    action(type="omfwd" Target="logs.admin.com" Port="514" Protocol="tcp")
}

3. 中央日志服务器 :

# 载入TCP输入模块
module(load="imtcp" MaxSessions="500")
input(type="imtcp" port="514")

# 按程序名分文件存储
if $programname == 'apache-access' then {
    action(type="omfile" file="/var/log/site/apache/access.log")
} else {
    action(type="omfile" file="/var/log/site/syslog")
}

3.5 syslog + TLS加密

服务器端:

global(
    defaultNetstreamDriver="gtls"
    defaultNetstreamDriverCAFile="/etc/ssl/ca/ca.pem"
    defaultNetstreamDriverCertFile="/etc/ssl/certs/server.pem"
    defaultNetstreamDriverKeyFile="/etc/ssl/private/server.key"
)
module(load="imtcp" streamDriver.name="gtls" streamDriver.mode="1")
input(type="imtcp" port="6514")

客户端:

global(defaultNetstreamDriver="gtls" ...)
*.* action(type="omfwd" Protocol="tcp" Target="logs.admin.com" Port="6514"
          StreamDriverMode="1" StreamDriver="gtls")

3.6 调试与测试

1
2
3
4
5
6
7
8
# 测试日志发送
logger -p local5.warning "test message"

# 重启rsyslog使配置生效
systemctl restart rsyslog

# 查看rsyslog自身日志
journalctl -u rsyslog

4. 内核与引导日志

命令/机制 功能
dmesg 查看内核环形缓冲区(引导/运行期间)
journalctl -k 或 journalctl --dmesg systemd下查看内核日志
dmesg -n 2 设置控制台日志级别(数字越小越严重,7=debug,1=panic)
/var/log/dmesg 有些系统保存的引导日志副本

控制台日志级别:1=panic,2=alert,3=crit,4=err,5=warning,6=notice,7=info,8=debug

5. 日志轮替(Log Rotation)

5.1 logrotate(Linux主流)

概念 说明
配置文件 /etc/logrotate.conf(主)+ /etc/logrotate.d/*(分软件包配置)
调度 cron每日运行
关键选项 见表10.8

常用选项:

选项 含义
rotate 5 保留5个旧版本
daily/weekly/monthly 轮替周期
size 100M 按大小轮替(超过100M)
compress / delaycompress 压缩/延迟压缩(防止进程仍在写入)
notifempty 空文件不轮替
missingok 文件不存在不报错
copytruncate 先复制再截断(适用于不方便重开的进程)
postrotate / endscript 轮替后执行的命令(如发HUP信号)
sharedscripts 多个日志文件只执行一次postrotate
olddir /path 旧日志移到指定目录

示例:

/var/log/messages {
    rotate 5
    weekly
    postrotate
        /bin/kill -HUP `cat /var/run/rsyslogd.pid`
    endscript
}

/var/log/samba/*.log {
    notifempty
    copytruncate
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/lock/samba/*.pid`
    endscript
}

5.2 FreeBSD newsyslog

对比 logrotate(Linux) newsyslog(FreeBSD)
配置文件 /etc/logrotate.conf + /etc/logrotate.d/ /etc/newsyslog.conf
调度 cron每日 cron每小时
语法 较复杂 相对简单

6. 大规模日志管理

6.1 ELK Stack(Elasticsearch + Logstash + Kibana)

组件 功能
Elasticsearch 分布式搜索引擎+数据库,存储和索引日志
Logstash 数据管道:从多来源接收→解析/过滤→输出到Elasticsearch
Kibana Web可视化前端,搜索、图表、仪表板
Filebeat 轻量级日志托运者(log shipper),替代syslog转发

数据流:应用日志 → Filebeat/rsyslog → Logstash → Elasticsearch → Kibana

适用规模:单节点到数十节点集群,每秒数千事件

6.2 Graylog

特性 说明
存储引擎 Elasticsearch
优势 UI更简洁,内置RBAC+LDAP集成,企业特性更友好

6.3 商业/云日志服务

服务 说明
Splunk 最成熟,功能强大,费用高
Sumo Logic / Loggly / Papertrail SaaS日志服务,原生syslog集成
AWS CloudWatch Logs AWS原生日志收集+监控
logz.io ELK即服务(托管ELK)

7. 日志记录策略(合规与留存)

7.1 关键设计问题

  • 涉及多少系统/应用?存储基础设施?
  • 日志留存多长时间?(PCI DSS要求:在线3个月,归档1年)
  • 哪些类型的事件重要?(失败登录、敏感数据修改、权限变更等)

7.2 应记录的关键信息

信息项 说明
用户名/UID 谁做的
事件成败 成功/失败
源地址 网络事件来源IP
时间戳 需NTP同步(便于跨系统关联)
敏感数据变更 增/删/改的内容
事件详情 具体操作描述

7.3 集中式日志的门槛

建议:20台以上服务器考虑集中式日志。小于此规模,做好本地轮替+监控即可。

7.4 安全与访问控制

  • 限制中央日志服务器的shell访问(仅管理员+安全团队)
  • 访问日志文件本身也应记入日志
  • 使用TLS加密网络日志传输(rsyslog + gtls)
  • 使用FSS(Forward Secure Sealing)防篡改

8. 本章核心命令速查表

命令/文件 用途 平台
journalctl -u service -f 实时查看服务日志 Linux(systemd)
journalctl -b -1 查看上次引导日志 Linux
journalctl --since "1 hour ago" 按时间过滤 Linux
dmesg | tail -50 查看内核最后50条消息 全平台
logger "test msg" 向syslog发送测试消息 全平台
logger -p auth.warning "test" 指定设施+级别 全平台
systemctl restart rsyslog 重启rsyslog(使配置生效) Linux
logrotate -f /etc/logrotate.conf 手动强制轮替 Linux
logrotate -d /etc/logrotate.conf 调试模式(不实际操作) Linux
tail -f /var/log/syslog 实时查看syslog文件 Debian/Ubuntu
tail -f /var/log/messages 实时查看syslog文件 RHEL/CentOS
last 查看wtmp登录历史 全平台
lastlog 查看每个用户最后登录时间 全平台
/etc/rsyslog.conf / /etc/rsyslog.d/ rsyslog配置 Linux
/etc/systemd/journald.conf journald配置 Linux
/etc/logrotate.conf / /etc/logrotate.d/ logrotate配置 Linux
/etc/newsyslog.conf newsyslog配置 FreeBSD

DBA视角补充:

  • 数据库日志是DBA的第一道防线:MySQL的error.log、slow.log、binlog,PostgreSQL的postgresql.log,Oracle的alert.log都应纳入监控和轮替策略。建议使用logrotate管理这些日志,避免磁盘写满导致数据库hang住。
  • 慢查询日志是性能调优的核心数据源,应配置足够长的保留周期(如30天)以便周期性分析。
  • 审计日志(如MySQL的audit插件、PostgreSQL的pgAudit)满足合规要求,但会产生大量数据,需评估存储成本与留存策略。
  • binlog/redo log是数据库恢复的关键,不能使用logrotate轮替,由数据库自身管理。不要混淆应用日志和事务日志。
  • 集中式日志价值:多数据库实例(如分库分表环境)的日志汇总到ELK,可大幅提升跨库问题排查效率。慢查询日志统一收集后可进行全局TOP N分析。
  • 日志级别调优:生产数据库建议warning级别以上,debug级别会严重影响性能;排查问题时临时开启,事毕立即恢复。