Linux journalctl 命令详解

📅 发布时间:2026/7/16 17:18:42 👁️ 浏览次数:
Linux journalctl 命令详解
Linux journalctl命令详解journalctl是systemd系统中用于查询和显示systemd日志journald的命令。与传统的syslog不同journald以二进制格式存储日志提供了更强大的查询和过滤功能。一、基本概念journald vs syslog存储格式二进制 vs 纯文本索引内置索引查询更快结构化日志包含元数据PID、UID、服务名等持久化可配置持久化或临时存储集成与systemd深度集成日志存储位置/var/log/journal/持久化日志/run/log/journal/临时日志重启后丢失二、基本语法journalctl[选项][匹配条件]三、常用选项基础选项-n, --linesN显示最后N行默认10行-f, --follow实时跟踪日志类似tail -f-r, --reverse反向显示最新的在前-e, --pager-end立即跳到日志末尾-k, --dmesg仅显示内核消息-b, --boot[ID]显示特定启动的日志-u, --unitUNIT显示特定服务单元的日志-p, --priorityLEVEL按优先级过滤输出格式-o, --outputFORMAT指定输出格式short默认格式short-isoISO 8601时间戳short-precise微秒精度jsonJSON格式json-pretty格式化的JSONverbose显示所有字段cat只显示消息正文时间范围--sinceTIME显示此时间之后的日志--untilTIME显示此时间之前的日志日志级别0-70 emerg系统不可用1 alert必须立即采取行动2 crit临界条件3 err错误4 warning警告5 notice注意6 info信息7 debug调试四、实际案例案例1查看系统启动日志# 查看当前启动的日志journalctl -b# 查看上一次启动的日志journalctl -b -1# 查看倒数第二次启动的日志journalctl -b -2# 列出所有启动记录journalctl --list-boots输出示例-2 3c5d7f8... Mon 2026-02-10 08:15:23 CST—Mon 2026-02-10 18:30:45 CST -1 4d6e8f9... Tue 2026-02-14 09:00:12 CST—Tue 2026-02-14 23:45:30 CST 0 5e7f9fa... Sat 2026-02-15 08:30:00 CST—Sat 2026-02-15 14:25:18 CST案例2查看特定服务的日志# 查看nginx服务日志journalctl -u nginx# 查看nginx最新50行日志journalctl -u nginx -n50# 实时跟踪nginx日志journalctl -u nginx -f# 查看nginx今天的日志journalctl -u nginx --since today# 查看多个服务journalctl -u nginx -u mysql输出示例Feb 15 10:30:15 webserver nginx[1234]: 2026/02/15 10:30:15 [notice] 1234#1234: signal process started Feb 15 10:30:16 webserver nginx[1234]: 192.168.1.100 - - [15/Feb/2026:10:30:16 0800] GET / HTTP/1.1 200 Feb 15 10:30:20 webserver nginx[1234]: 192.168.1.101 - - [15/Feb/2026:10:30:20 0800] POST /api HTTP/1.1 500案例3按时间范围查询# 查看最近1小时的日志journalctl --since1 hour ago# 查看最近30分钟的日志journalctl --since30 min ago# 查看今天的日志journalctl --since today# 查看昨天的日志journalctl --since yesterday --until today# 查看指定时间段journalctl --since2026-02-15 09:00:00--until2026-02-15 10:00:00# 查看从某个时间点到现在journalctl --since2026-02-15 08:00:00# 相对时间格式journalctl --since2 days agojournalctl --since1 week ago案例4按日志级别过滤# 只显示错误及以上级别0-3journalctl -p err# 显示警告及以上级别0-4journalctl -p warning# 指定具体级别journalctl -p3# 只显示错误# 指定级别范围journalctl -p err..warning# 错误和警告# 查看某服务的错误journalctl -u apache2 -p err --since today输出示例Feb 15 11:20:30 server systemd[1]: Failed to start MySQL Community Server. Feb 15 11:20:30 server systemd[1]: mysql.service: Unit entered failed state. Feb 15 11:25:45 server kernel: Out of memory: Kill process 5678 (java) score 920案例5按进程ID查询# 查看特定PID的日志journalctl_PID1234# 查看某进程的所有日志journalctl$(whichsshd)# 查看当前shell的日志journalctl_PID$$案例6内核消息# 查看所有内核消息等同于dmesgjournalctl -k# 查看当前启动的内核消息journalctl -k -b# 查看内核错误journalctl -k -p err# 实时监控内核消息journalctl -k -f输出示例Feb 15 08:30:01 server kernel: Linux version 5.15.0-91-generic Feb 15 08:30:01 server kernel: Command line: BOOT_IMAGE/boot/vmlinuz-5.15.0-91 Feb 15 10:45:32 server kernel: usb 2-1: new high-speed USB device number 5 Feb 15 11:20:15 server kernel: sd 0:0:0:0: [sda] Sense Key : Medium Error案例7按用户过滤# 查看特定用户的日志journalctl_UID1000# 查看root用户的日志journalctl_UID0# 查看某用户组的日志journalctl_GID1000# 结合用户名查看journalctl_UID$(id-u username)案例8磁盘空间管理# 查看日志占用空间journalctl --disk-usage# 清理日志只保留最近2天journalctl --vacuum-time2d# 限制日志总大小为500Mjournalctl --vacuum-size500M# 只保留最近100个日志文件journalctl --vacuum-files100# 验证日志完整性journalctl --verify输出示例Archived and active journals take up 1.5G in the file system. Deleted archived journal /var/log/journal/.../systemxxx.journal (56.0M). Deleted archived journal /var/log/journal/.../user-1000xxx.journal (23.5M). Vacuuming done, freed 79.5M of archived journals from /var/log/journal/...案例9高级过滤和组合# 多条件组合nginx错误且在最近1小时journalctl -u nginx -p err --since1 hour ago# 排除某些单元journalctl -u nginx -u apache2 --since today# 使用通配符journalctl -usystemd-*# 查看特定字段journalctlSYSLOG_IDENTIFIERsshd# 自定义输出只显示时间和消息journalctl -o short-precise -n100|awk{print $1, $2, $3, $NF}案例10故障排查实例场景1服务启动失败# 查看服务启动失败的详细信息journalctl -xeu nginx.service# -x: 显示额外的说明信息# -e: 跳到日志末尾# -u: 指定服务单元输出示例Feb 15 12:00:15 server systemd[1]: Starting A high performance web server... -- Subject: Unit nginx.service has begun start-up -- Defined-By: systemd -- Support: http://www.ubuntu.com/support -- -- Unit nginx.service has begun starting up. Feb 15 12:00:15 server nginx[5678]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) Feb 15 12:00:15 server systemd[1]: nginx.service: Control process exited, codeexited status1 Feb 15 12:00:15 server systemd[1]: nginx.service: Failed with result exit-code. Feb 15 12:00:15 server systemd[1]: Failed to start A high performance web server. -- Subject: Unit nginx.service has failed场景2系统性能问题# 查看最近的OOM事件journalctl -p warning --since24 hours ago|grep-iout of memory# 查看CPU/内存相关告警journalctl -p warning --since today|grep-ECPU|memory|load# 查看磁盘I/O错误journalctl -k -p err|grep-Esd|nvme|I/O场景3安全审计# 查看SSH登录记录journalctl -u sshd --since today|grepAccepted\|Failed# 查看sudo使用记录journalctl|grepsudo|grepCOMMAND# 查看用户切换记录journalctl|grepsession opened\|session closed# 查看认证失败journalctl_SYSTEMD_UNITsshd.service -p warning --since today输出示例Feb 15 09:15:23 server sshd[1234]: Failed password for root from 192.168.1.100 port 54321 ssh2 Feb 15 09:15:28 server sshd[1234]: Failed password for root from 192.168.1.100 port 54321 ssh2 Feb 15 09:20:45 server sshd[2345]: Accepted publickey for admin from 192.168.1.200 port 12345 ssh2 Feb 15 10:30:12 server sudo[3456]: admin : TTYpts/0 ; PWD/home/admin ; USERroot ; COMMAND/bin/systemctl restart nginx案例11导出和分析# 导出为JSON格式便于分析journalctl -u nginx --since today -o jsonnginx_logs.json# 导出为JSON-Pretty格式可读性更好journalctl -u nginx -n100-o json-prettynginx_logs_pretty.json# 导出特定时间段的所有日志journalctl --since2026-02-15 00:00:00--until2026-02-15 23:59:59daily_logs.txt# 使用jq处理JSON日志journalctl -u nginx -o json --since today|jq -rselect(.MESSAGE | contains(error)) | .MESSAGE案例12实时监控面板# 实时监控所有错误journalctl -f -p err# 实时监控特定服务的所有日志journalctl -u nginx -f --outputshort-precise# 实时监控多个服务journalctl -f -u nginx -u mysql -u redis# 彩色实时监控带级别标识journalctl -f --outputshort-iso-precise -p info五、配置文件/etc/systemd/journald.conf# 编辑配置文件sudovim/etc/systemd/journald.conf关键配置项[Journal] # 存储模式persistent(持久化), volatile(临时), auto(自动) Storagepersistent # 日志压缩 Compressyes # 最大日志大小 SystemMaxUse1G # 所有日志文件总大小上限 SystemKeepFree500M # 至少保留的磁盘空间 SystemMaxFileSize100M # 单个日志文件大小上限 # 日志保留时间 MaxRetentionSec1month # 转发到syslog ForwardToSyslogyes ForwardToWallno # 日志同步间隔 SyncIntervalSec5m # 日志分割 #RateLimitIntervalSec30s #RateLimitBurst1000重启服务使配置生效sudosystemctl restart systemd-journald六、高级技巧1. 创建自定义日志过滤脚本#!/bin/bash# 文件名journal-monitor.sh# 监控关键服务的错误echo 关键服务错误 journalctl -u nginx -u mysql -u redis -p err --since1 hour ago--no-pager# 监控认证失败echo-e\n SSH认证失败 journalctl -u sshd --since1 hour ago--no-pager|grepFailed password# 监控系统资源告警echo-e\n 系统资源告警 journalctl -p warning --since1 hour ago--no-pager|grep-Ememory|CPU|disk# 监控内核错误echo-e\n 内核错误 journalctl -k -p err --since1 hour ago--no-pager2. 日志分析统计# 统计各服务的日志条数journalctl --since today --no-pager|awk{print $5}|sort|uniq-c|sort-rn|head-20# 统计错误最多的服务journalctl -p err --since today --no-pager|grep-oP(?\[)\d(?\])|sort|uniq-c|sort-rn# 按小时统计日志量journalctl --since today -o short-iso|awk{print $1}|cut-dT-f2|cut-d:-f1|sort|uniq-c3. 集成到监控系统# 检查是否有critical级别的日志ifjournalctl -p crit --since5 min ago--no-pager|grep-q.;thenechoCRITICAL: 发现严重错误journalctl -p crit --since5 min ago--no-pager|mail -s系统告警adminexample.comfi4. 日志轮转策略# 每周清理一次只保留最近7天cat/etc/cron.weekly/journal-cleanupEOF #!/bin/bash journalctl --vacuum-time7d journalctl --verify EOFchmodx /etc/cron.weekly/journal-cleanup七、常用组合命令# 查看系统启动耗时分析systemd-analyze blame# 配合journalctl查看慢启动服务的日志systemd-analyze blame|head-5|awk{print $2}|xargs-I{}journalctl -u{}-b# 查看服务依赖关系systemctl list-dependencies nginx.service# 查看服务状态和最近日志systemctl status nginx -l --no-pager# 持续监控系统状态watch-n1journalctl -p err --since 1 min ago --no-pager | tail -20八、注意事项权限要求普通用户只能查看自己的日志查看系统日志需要sudo权限性能影响频繁查询大量日志可能影响性能建议使用时间范围限制磁盘空间定期清理日志避免占满磁盘日志持久化默认配置可能不持久化需要检查配置文件时区问题注意日志时间戳的时区使用--utc可转换为UTC时间二进制格式日志文件损坏时可使用--verify验证九、与其他工具对比特性journalctlsyslogdmesg存储格式二进制文本内存环形缓冲区索引速度快慢快结构化查询强弱弱持久化可配置是否需保存日志范围全系统全系统仅内核journalctl是现代Linux系统日志管理的核心工具掌握它能大大提高系统故障诊断和日志分析的效率。