Skip to Content
文档运维系统管理日志与 journalctl

日志与 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(最详细):

级别名称说明
0emerg系统无法使用
1alert需要立即处理
2crit严重错误
3err错误
4warning警告
5notice正常但重要
6info信息
7debug调试
# 只显示错误及更严重的日志 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.logAPT 操作历史
/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 & stop

logrotate 日志轮转

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 -100
Last updated on