日志与 journalctl
systemd-journald 是 Ubuntu 26.04 的系统日志服务,它收集并管理来自内核、服务和应用程序的所有日志。journalctl 是查询和分析这些日志的命令行工具。
journalctl 基本用法
查看日志
# 查看所有日志
journalctl
# 查看最新日志(末尾)
journalctl -e
# 实时跟踪新日志(类似 tail -f)
journalctl -f
# 查看最近 N 条日志
journalctl -n 50
# 不分页直接输出
journalctl --no-pager
# 反向排序(最新的在前面)
journalctl -r输出格式
# 简短格式(默认)
journalctl -o short
# 详细格式(显示所有字段)
journalctl -o verbose
# JSON 格式
journalctl -o json
# JSON 格式(每行一条,便于脚本处理)
journalctl -o json-lines
# 仅输出消息内容
journalctl -o cat日志过滤
按服务过滤
# 查看特定服务的日志
journalctl -u nginx.service
# 查看多个服务的日志
journalctl -u nginx.service -u php-fpm.service
# 实时跟踪特定服务的日志
journalctl -u myapp.service -f按时间过滤
# 查看本次启动的日志
journalctl -b
# 查看上次启动的日志
journalctl -b -1
# 列出所有启动记录
journalctl --list-boots
# 指定时间范围
journalctl --since "2026-03-24 10:00:00"
journalctl --since "2026-03-24 10:00:00" --until "2026-03-24 12:00:00"
# 使用相对时间
journalctl --since "1 hour ago"
journalctl --since "30 min ago"
journalctl --since today
journalctl --since yesterday --until today按优先级过滤
日志优先级从 0(最严重)到 7(最详细):
| 级别 | 名称 | 说明 |
|---|---|---|
| 0 | emerg | 系统无法使用 |
| 1 | alert | 需要立即处理 |
| 2 | crit | 严重错误 |
| 3 | err | 错误 |
| 4 | warning | 警告 |
| 5 | notice | 正常但重要 |
| 6 | info | 信息 |
| 7 | debug | 调试 |
# 只显示错误及更严重的日志
journalctl -p err
# 只显示警告级别
journalctl -p warning
# 显示指定范围的优先级
journalctl -p warning..err按其他条件过滤
# 按进程 PID
journalctl _PID=1234
# 按用户 ID
journalctl _UID=1000
# 按可执行文件路径
journalctl _EXE=/usr/bin/python3
# 按组合条件
journalctl _SYSTEMD_UNIT=nginx.service -p err --since today
# 内核日志
journalctl -k
journalctl --dmesg搜索日志内容
# 使用 grep 过滤
journalctl -u nginx.service | grep "error"
# 使用 journalctl 自带的匹配
journalctl -g "failed|error|timeout"日志存储配置
配置文件
journald 的配置文件位于 /etc/systemd/journald.conf:
sudo nano /etc/systemd/journald.conf常用配置项:
[Journal]
# 日志存储方式:persistent(持久化到磁盘)、volatile(仅内存)、auto(默认)
Storage=persistent
# 磁盘日志最大占用空间
SystemMaxUse=500M
# 单个日志文件最大大小
SystemMaxFileSize=50M
# 保留日志的最长时间
MaxRetentionSec=1month
# 内存日志最大占用空间
RuntimeMaxUse=100M
# 日志压缩
Compress=yes
# 转发到 syslog
ForwardToSyslog=yes
# 限速:每个服务每 30 秒最多记录 10000 条
RateLimitIntervalSec=30s
RateLimitBurst=10000应用配置更改:
sudo systemctl restart systemd-journald确保日志持久化
默认情况下,如果 /var/log/journal/ 目录不存在,日志只保存在内存中。要启用持久化:
# 创建持久化日志目录
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
# 或在配置文件中设置
# Storage=persistent
# 重启服务
sudo systemctl restart systemd-journald日志轮转与清理
手动清理日志
# 按时间清理:只保留最近 7 天的日志
sudo journalctl --vacuum-time=7d
# 按大小清理:只保留 500MB 日志
sudo journalctl --vacuum-size=500M
# 按文件数量清理:只保留最近 5 个日志文件
sudo journalctl --vacuum-files=5
# 查看当前日志占用的磁盘空间
journalctl --disk-usage验证日志完整性
# 检查日志文件一致性
journalctl --verify与 syslog 的关系
systemd-journald 可以与传统的 syslog(如 rsyslog)协同工作:
# 查看 rsyslog 是否安装
dpkg -l rsyslog
# rsyslog 的日志文件位于 /var/log/ 下
ls /var/log/syslog
ls /var/log/auth.log
ls /var/log/kern.log传统日志文件
| 文件 | 说明 |
|---|---|
/var/log/syslog | 通用系统日志 |
/var/log/auth.log | 认证相关日志 |
/var/log/kern.log | 内核日志 |
/var/log/dpkg.log | 软件包安装日志 |
/var/log/apt/history.log | APT 操作历史 |
/var/log/boot.log | 启动日志 |
配置 rsyslog
# 主配置文件
sudo nano /etc/rsyslog.conf
# 自定义规则放在此目录
ls /etc/rsyslog.d/rsyslog 规则示例(将 nginx 日志写到单独文件):
# /etc/rsyslog.d/nginx.conf
if $programname == 'nginx' then /var/log/nginx/syslog.log
& stoplogrotate 日志轮转
logrotate 管理传统日志文件的轮转:
# 主配置文件
cat /etc/logrotate.conf
# 应用配置目录
ls /etc/logrotate.d/自定义 logrotate 配置示例:
sudo nano /etc/logrotate.d/myapp/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 myapp myapp
sharedscripts
postrotate
systemctl reload myapp.service > /dev/null 2>&1 || true
endscript
}# 手动测试 logrotate
sudo logrotate -d /etc/logrotate.d/myapp # dry-run
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行实用技巧
监控服务启动失败
# 创建一个脚本监控失败的服务
journalctl -p err -u "*.service" --since "5 min ago" --no-pager -o cat导出日志
# 导出为文本文件
journalctl -u nginx.service --since today > /tmp/nginx-today.log
# 导出为二进制格式(可用 journalctl 读取)
journalctl -u nginx.service -o export > /tmp/nginx.export查看磁盘 I/O 相关日志
journalctl -k | grep -i "i/o\|error\|disk\|sda"开机启动分析
# 查看启动过程中各服务的日志
journalctl -b --no-pager | head -100Last updated on