日志管理 #
一、日志系统概述 #
1.1 Linux 日志架构 #
text
应用/服务
↓
rsylog/journald
↓
日志文件
↓
日志分析工具
1.2 主要日志服务 #
| 服务 | 说明 |
|---|---|
| rsyslog | 传统日志服务 |
| journald | systemd 日志 |
| syslog-ng | 高级日志服务 |
1.3 主要日志文件 #
bash
/var/log/syslog # 系统日志
/var/log/auth.log # 认证日志
/var/log/kern.log # 内核日志
/var/log/dmesg # 启动日志
/var/log/messages # 消息日志
/var/log/daemon.log # 守护进程日志
/var/log/nginx/ # Nginx 日志
/var/log/apache2/ # Apache 日志
二、rsyslog 配置 #
2.1 rsyslog 基础 #
bash
# 查看 rsyslog 状态
systemctl status rsyslog
# 配置文件
cat /etc/rsyslog.conf
# 模块配置
$ModLoad imuxsock
$ModLoad imklog
$ModLoad imudp
$UDPServerRun 514
# 规则配置
*.info;mail.none;authpriv.none /var/log/messages
authpriv.* /var/log/secure
mail.* /var/log/maillog
cron.* /var/log/cron
2.2 日志规则 #
bash
# 格式
# facility.priority action
# facility(设施)
auth # 认证
authpriv # 认证(私有)
cron # 定时任务
daemon # 守护进程
kern # 内核
lpr # 打印
mail # 邮件
user # 用户
local0-7 # 本地设施
# priority(优先级)
debug # 调试
info # 信息
notice # 注意
warn # 警告
err # 错误
crit # 严重
alert # 警报
emerg # 紧急
# action(动作)
/var/log/file # 写入文件
@remotehost # 发送到远程
* # 所有用户
2.3 远程日志 #
bash
# 客户端配置
sudo vim /etc/rsyslog.conf
# 发送规则
*.* @@remote-server:514
# 重启服务
sudo systemctl restart rsyslog
# 服务端配置
sudo vim /etc/rsyslog.conf
# 启用模块
$ModLoad imtcp
$InputTCPServerRun 514
# 接收规则
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
# 重启服务
sudo systemctl restart rsyslog
三、journald 配置 #
3.1 journald 基础 #
bash
# 查看 journald 配置
cat /etc/systemd/journald.conf
# 常用配置项
[Journal]
SystemMaxUse=500M
RuntimeMaxUse=200M
SystemMaxFileSize=50M
MaxRetentionSec=30day
ForwardToSyslog=yes
3.2 journald 管理 #
bash
# 查看日志
journalctl
# 查看启动日志
journalctl -b
# 查看上次启动
journalctl -b -1
# 查看指定服务
journalctl -u nginx
journalctl -u nginx -u mysql
# 按时间过滤
journalctl --since "2024-01-01"
journalctl --until "2024-01-02"
journalctl --since "1 hour ago"
# 按优先级
journalctl -p err
journalctl -p warning..emerg
# 实时跟踪
journalctl -f
3.3 journald 优化 #
bash
# 清理日志
journalctl --vacuum-size=100M
journalctl --vacuum-time=7d
# 查看磁盘使用
journalctl --disk-usage
# 设置大小限制
sudo vim /etc/systemd/journald.conf
[Journal]
SystemMaxUse=1G
RuntimeMaxUse=500M
四、日志轮转 #
4.1 logrotate 配置 #
bash
# 安装
sudo apt install logrotate
# 查看配置
cat /etc/logrotate.conf
# 查看子配置
ls /etc/logrotate.d/
4.2 logrotate 语法 #
bash
# 基本配置示例
/var/log/nginx/*.log {
daily # 每天轮转
missingok # 忽略错误
rotate 14 # 保留 14 个文件
compress # 压缩旧文件
delaycompress # 延迟压缩
notifempty # 不轮转空文件
create 0640 www-data adm # 创建新文件权限
sharedscripts # 共享脚本
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
4.3 常用选项 #
| 选项 | 说明 |
|---|---|
| daily | 每天轮转 |
| weekly | 每周轮转 |
| monthly | 每月轮转 |
| rotate N | 保留 N 个文件 |
| compress | 压缩旧文件 |
| delaycompress | 延迟压缩 |
| missingok | 忽略错误 |
| notifempty | 不轮转空文件 |
| create mode owner group | 新文件权限 |
| size SIZE | 按大小轮转 |
| maxage DAYS | 最大保留天数 |
| postrotate/endscript | 轮转后执行的脚本 |
| prerotate/endscript | 轮转前执行的脚本 |
4.4 自定义配置 #
bash
# 创建自定义配置
sudo vim /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 myapp myapp
sharedscripts
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
# 测试配置
sudo logrotate -d /etc/logrotate.d/myapp
# 强制执行
sudo logrotate -f /etc/logrotate.d/myapp
五、日志分析 #
5.1 日志统计 #
bash
# 统计日志行数
wc -l /var/log/syslog
# 统计错误数量
grep -c "error" /var/log/syslog
grep -c "ERROR" /var/log/nginx/error.log
# 统计访问量
wc -l /var/log/nginx/access.log
# 统计独立 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq | wc -l
5.2 常用分析命令 #
bash
# 登录失败分析
sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -10
# SSH 攻击分析
sudo grep "Invalid user" /var/log/auth.log | awk '{print $10}' | sort | uniq -c | sort -nr | head -10
# Nginx 访问分析
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
# 磁盘空间分析
du -sh /var/log/* | sort -hr | head -10
# 日志大小分析
ls -lhS /var/log/*.log | head -10
5.3 日志工具 #
bash
# 安装 goaccess
sudo apt install goaccess
# 实时分析 Nginx 日志
goaccess /var/log/nginx/access.log
# 生成 HTML 报告
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED
# 安装 logwatch
sudo apt install logwatch
# 生成报告
sudo logwatch --output stdout --detail high --range Today --service nginx
5.4 日志搜索 #
bash
# 按关键词搜索
grep "error" /var/log/syslog
# 按正则搜索
grep -E "error|warning|critical" /var/log/syslog
# 多文件搜索
grep -r "error" /var/log/nginx/
# 显示上下文
grep -C 3 "error" /var/log/syslog
# 忽略大小写
grep -i "error" /var/log/syslog
六、应用日志 #
6.1 Nginx 日志 #
bash
# 配置文件
/var/log/nginx/access.log # 访问日志
/var/log/nginx/error.log # 错误日志
# 日志格式配置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 条件日志
map $request_uri $loggable {
~healthcheck 0;
default 1;
}
access_log /var/log/nginx/access.log main if=$loggable;
6.2 MySQL 日志 #
bash
# 查看日志配置
SHOW VARIABLES LIKE 'log%';
# 错误日志
# /var/log/mysql/error.log
# 查询日志(生产环境关闭)
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/query.log';
# 慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL long_query_time = 2;
6.3 应用日志最佳实践 #
bash
# 1. 使用结构化日志
# JSON 格式
{"timestamp":"2024-01-01T10:00:00Z","level":"error","message":"Connection failed","host":"server1"}
# 2. 日志级别
DEBUG # 调试信息
INFO # 一般信息
WARNING # 警告
ERROR # 错误
FATAL # 致命错误
# 3. 日志轮转配置
# Python logging
import logging
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('/var/log/myapp.log', maxBytes=10485760, backupCount=10)
logging.getLogger().addHandler(handler)
# 4. 集中式日志
# ELK Stack
# Filebeat → Elasticsearch ← Kibana
七、日志安全 #
7.1 保护日志 #
bash
# 限制日志权限
sudo chmod 640 /var/log/auth.log
sudo chmod 640 /var/log/secure
# 保护日志不被删除
sudo chattr +a /var/log/auth.log
sudo chattr +i /var/log/auth.log
# 只读日志
sudo mount -o remount,ro /var/log
# 检查日志篡改
sudo aide --check
7.2 日志备份 #
bash
# 备份脚本
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/logs"
mkdir -p $BACKUP_DIR
# 压缩日志
tar -czf $BACKUP_DIR/logs_$DATE.tar.gz /var/log/*.log /var/log/nginx/*.log
# 清理旧备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +90 -delete
# 添加到 crontab
# 0 2 * * * /usr/local/bin/backup-logs.sh
八、实践练习 #
8.1 练习一:日志查看 #
bash
# 1. 查看系统日志
journalctl -xe
# 2. 查看最近日志
journalctl -n 50
# 3. 查看错误日志
journalctl -p err -b
# 4. 实时跟踪
journalctl -f
8.2 练习二:日志轮转 #
bash
# 1. 创建测试日志
mkdir -p /var/log/myapp
echo "test" > /var/log/myapp/test.log
# 2. 创建配置
sudo vim /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
}
# 3. 测试
sudo logrotate -d /etc/logrotate.d/myapp
# 4. 强制执行
sudo logrotate -f /etc/logrotate.d/myapp
# 5. 查看结果
ls -la /var/log/myapp/
8.3 练习三:日志分析 #
bash
# 1. 安装 goaccess
sudo apt install goaccess
# 2. 生成报告
sudo goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED
# 3. 查看报告
# 访问 http://server/report.html
九、小结 #
本章学习了 Linux 日志管理的核心内容,包括 rsyslog、journald、日志轮转和日志分析。
关键要点:
- rsyslog 是传统的日志服务
- journald 是 systemd 的日志组件
- logrotate 管理日志轮转
- 使用专业工具进行日志分析
- 日志安全需要特别注意
下一章预告: 自动化运维 - 学习自动化运维工具和技术。
最后更新:2026-03-27