Orange的运维学习日记–15.Linux日志管理
文章目录
系统日志记录是操作与维护 Linux 服务器的核心。通过审计、故障排查、安全监控等多种方式,日志为我们描绘了系统行为的全貌。下面从本地日志、集中式日志和系统化日志三个维度,深入剖析 Linux 日志管理实践。
本地日志管理
Linux 下大部分日志存放于 /var/log
目录,以纯文本方式保存。常见工具 tail
、less
、grep
、awk
等可快速定位和过滤有价值的信息。
rsyslog 服务架构
- systemd-journald
收集 Linux 内核消息、引导早期输出、守护进程日志以及来自传统 syslog 的消息,统一格式化后写入二进制索引。 - rsyslog
从 journald 或内核接收消息,按规则写入文本文件、转发至远端服务器或输出到终端。模块化设计支持加密、数据库存储与自定义模板。
配置文件概览
/etc/rsyslog.conf
主配置,通常包含/etc/rsyslog.d/*.conf
中的细分规则。/etc/rsyslog.d/*.conf
可并行编写多份子配置,如应用专属日志规则或远程转发规则。
日志记录规则
每条日志根据设备类型(facility)和优先级(priority)分类,格式如下:
facility[连接符]priority 处理方式
Syslog 设备类型(facility)
代号 | 描述 |
---|---|
kern | 内核消息 |
user | 用户级消息 |
邮件系统 | |
daemon | 系统守护进程 |
auth | 验证消息 |
authpriv | 私有验证消息 |
syslog | 日志守护进程 |
lpr | 打印子系统 |
news | 新闻子系统 |
uucp | UUCP 子系统 |
cron | 定时作业系统 |
ftp | FTP 守护进程 |
local0-7 | 本地自定义(0–7) |
优先级(priority)
等级 | 描述 |
---|---|
emerg | 系统不可用 |
alert | 必须立即采取措施 |
crit | 严重 |
err | 错误 |
warning | 警告 |
notice | 正常但重要 |
info | 信息 |
debug | 调试 |
连接符说明
符号 | 含义 |
---|---|
. | 指定单个优先级 |
; | 指定多个优先级 |
= | 精确匹配 |
! | 排除指定优先级 |
* | 通配所有优先级 |
处理方式
- 写入日志文件
- 发送到终端(console)
- 转发到远端服务器
日志轮转与归档
默认通过 logrotate
定期归档 /var/log
下日志,避免单个文件过大。
- 主配置位于
/etc/logrotate.conf
- 子配置目录
/etc/logrotate.d/
- 关键参数:
rotate
保留份数size
超过指定大小即轮转compress
是否压缩旧日志postrotate
轮转后重启服务
示例:每天轮转 /var/log/messages
,保留 7 天并压缩
/var/log/messages {
daily
rotate 7
compress
missingok
notifempty
sharedscripts
postrotate
systemctl reload rsyslog.service > /dev/null 2>&1
endscript
}
自定义日志记录
某些应用需要额外日志文件,可在 /etc/rsyslog.d/
中新增规则。例如,把 local5
级别日志写入专属文件:
local5.* /var/log/myapp.log
重启 rsyslog
后,用 logger -p local5.info "message"
测试记录
logger -p local5.info "test my log"
cat /var/log/myapp.log
# Nov 10 10:32:26 centos7 xxx: test my log
日志安全与权限
- 确保
/var/log
下文件仅 root 或相应服务用户可写 - 使用
chmod
、chown
强化权限 - 可结合 SELinux 强制执行策略
- 转发日志到远端或数据库时,建议启用 TLS 加密模块(
imtcp
+omrelp
+gtls
)
集中式日志管理
在多机部署场景下,将各主机日志集中到一台或多台日志服务器,便于统一检索、报警与审计。
服务端配置
-
在上级日志服务器启用接收模块
# /etc/rsyslog.conf module(load="imtcp") # 启用 TCP input(type="imtcp" port="514") # 监听 514 端口
-
按主机存放日志,可用模板自动生成路径
template(name="PerHost" type="string" string="/var/log/hosts/%HOSTNAME%/%PROGRAMNAME%.log") *.* ?PerHost & stop
-
重启并关闭防火墙
systemctl restart rsyslog systemctl disable --now firewalld
客户端配置
在各主机上,将日志转发到上级服务器:
# /etc/rsyslog.d/remote.conf
*.* @@logserver.example.com:514
双 @
表示 TCP;单 @
表示 UDP。重启 rsyslog 后,所有本地日志即推送至集中服务器。
systemd-journald 日志
二进制存储优势
- 索引化结构,支持快速查询、按字段过滤
- 可保存完整元数据,如 _PID、_UID、_COMM、_EXE、_CMDLINE 等
- 自动淘汰策略(可配置最大空间和保留期限)
日志持久化
编辑 /etc/systemd/journald.conf
,设置 Storage:
参数 | 描述 |
---|---|
persistent | 存储在 /var/log/journal ,重启后保留 |
volatile | 存储在 /run/log/journal ,运行时保留 |
auto | 自动选择:若存在持久目录则持久化 |
vim /etc/systemd/journald.conf
# 修改为持久化
Storage=persistent
systemctl restart systemd-journald
高级检索
- 实时跟踪:
journalctl -f
- 按时间:
--since
、--until
- 按优先级:
-p err
- 按服务:
-u sshd.service
- 按字段:
_PID=1234
或SYSLOG_IDENTIFIER=kernel
- 导出 JSON:
journalctl -o json-pretty
日志清理
- 按空间限制:
SystemMaxUse
- 按文件数:
SystemMaxFiles
- 手动清理:
journalctl --vacuum-size=200M
或--vacuum-time=2weeks
日志分析
# 列出所有日志条目
journalctl
# 动态跟踪
journalctl -f
# 按启动次数
journalctl -b 0 # 本次启动
journalctl -b 1 # 上次启动
# 最近 5 条
journalctl -n 5
# 错误级别
journalctl -p err
# 时间过滤
journalctl --since today
journalctl --since "2025-07-28 14:00:00" --until "2025-07-28 15:00:00"
journalctl --since "-1 hour"
# 详细格式
journalctl -o verbose
# 指定单元
journalctl -u sshd.service
故障模拟
配置文件丢失
mv /etc/ssh/sshd_config .
systemctl restart sshd
使用 journalctl -f
发现:
/etc/ssh/sshd_config: No such file or directory
恢复文件并重启:
mv sshd_config /etc/ssh/sshd_config
systemctl restart sshd
SSH 配置参数错误
echo 'PermitRootLogin hahaha' >> /etc/ssh/sshd_config
systemctl restart sshd
日志提示:
unsupported option "hahaha"
移除错误行并重启:
sed -i '/hahaha/d' /etc/ssh/sshd_config
systemctl restart sshd
Apache 配置参数错误
yum install -y httpd
sed -i 's/Listen 80/Listen 80000/g' /etc/httpd/conf/httpd.conf
systemctl restart httpd
日志提示:
AH00526: Syntax error on line 42 of /etc/httpd/conf/httpd.conf: Invalid address or port
恢复端口并重启:
sed -i 's/Listen 80000/Listen 80/g' /etc/httpd/conf/httpd.conf
systemctl restart httpd