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