UNIX/Linux系统管理技术手册-读书笔记-第十章
《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 |
时间 | 最大保留期限 |
启用持久化:
或通过配置文件:
FSS密钥(防篡改):
|
|
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 调试与测试
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级别会严重影响性能;排查问题时临时开启,事毕立即恢复。
文章作者 会写代码的小郎中
上次更新 2011-06-20
许可协议 CC BY-NC-ND 4.0