您好,登录后才能下订单哦!
# Linux下journalctl命令怎么使用
## 一、journalctl简介
`journalctl`是Linux系统中用于查询和显示systemd日志的强大工具。作为systemd生态系统的一部分,它提供了对系统日志的统一查看方式,替代了传统的syslog服务。
### 1.1 journalctl与传统日志系统的区别
| 特性 | 传统syslog | journalctl |
|------------|-------------------------|----------------------------|
| 存储格式 | 纯文本文件 | 二进制索引格式 |
| 日志存储位置 | /var/log/目录下多个文件 | 集中存储在/run/log/journal/ |
| 查询能力 | 需结合grep等工具 | 内置强大过滤和查询功能 |
| 元数据支持 | 有限 | 丰富的元数据(如单元、PID等)|
### 1.2 journald服务
journalctl实际上是与`systemd-journald`服务交互的前端工具。该服务在系统启动早期就开始运行,能够收集内核、早期启动过程以及所有系统服务的日志。
查看服务状态:
```bash
systemctl status systemd-journald
不加任何参数时,显示所有日志记录:
journalctl
输出示例:
-- Logs begin at Mon 2023-05-01 09:00:00 CST, end at Wed 2023-05-03 15:30:45 CST. --
May 01 09:00:01 server01 systemd[1]: Starting Daily apt upgrade and clean activities...
May 01 09:00:15 server01 systemd[1]: Started Daily apt upgrade and clean activities.
...
类似于tail -f
的功能:
journalctl -f
查看特定时间段的日志:
# 查看今天日志
journalctl --since today
# 查看最近2小时日志
journalctl --since "2 hours ago"
# 指定时间范围
journalctl --since "2023-05-01 14:00:00" --until "2023-05-01 15:30:00"
时间格式支持: - “YYYY-MM-DD HH:MM:SS” - “yesterday”, “today”, “tomorrow” - “-1h” (1小时前) - “1 week ago”
查看特定systemd单元的日志:
# 查看sshd服务日志
journalctl -u sshd
# 查看多个服务
journalctl -u nginx -u mysql
# 查看服务从启动开始的完整日志
journalctl -u apache2 -b
使用优先级(Priority)过滤日志,优先级定义如下:
数值 | 优先级 | 说明 |
---|---|---|
0 | emerg | 紧急/系统不可用 |
1 | alert | 需要立即采取行动 |
2 | crit | 严重情况 |
3 | err | 错误条件 |
4 | warn | 警告条件 |
5 | notice | 正常但重要的情况 |
6 | info | 信息性消息 |
7 | debug | 调试级消息 |
示例:
# 只显示错误及以上级别
journalctl -p err -b
# 显示警告到错误级别
journalctl -p warn..err
# 查看指定PID的日志
journalctl _PID=1234
# 查看父进程为systemd的进程日志
journalctl _PPID=1
# 查看特定用户进程的日志
journalctl _UID=1000
# 查看root用户日志
journalctl _UID=0
journalctl /usr/sbin/sshd
# 组合时间、服务和优先级
journalctl -u nginx --since "1 hour ago" -p err
journalctl -k
# 或
journalctl -k -b # 本次启动的内核日志
journalctl -o short
适合程序解析:
journalctl -o json
显示所有可用字段:
journalctl -o verbose
示例输出:
Tue 2023-05-02 10:30:15.123456 CST [s=abcdef123456]
_TRANSPORT=syslog
PRIORITY=6
_UID=0
_GID=0
_COMM=sshd
_EXE=/usr/sbin/sshd
_CMDLINE=sshd: root@pts/0
MESSAGE=Accepted password for root from 192.168.1.100 port 54322 ssh2
# 显示最后20行
journalctl -n 20
# 不显示分页
journalctl --no-pager
# 持续输出新日志(类似tail -f)
journalctl -f
journalctl --disk-usage
输出示例:
Archived and active journals take up 1.2G in the file system.
# 只保留最近2天的日志
journalctl --vacuum-time=2d
# 限制日志大小不超过500MB
journalctl --vacuum-size=500M
# 保留最多1000个日志文件
journalctl --vacuum-files=1000
默认情况下,日志存储在/run/log/journal/中,重启后会丢失。要永久保存:
sudo mkdir -p /var/log/journal
sudo chown root:systemd-journal /var/log/journal
sudo chmod 2755 /var/log/journal
sudo systemctl restart systemd-journald
# 查看本次启动的所有日志
journalctl -b
# 查看上次启动的日志(如果已保存)
journalctl -b -1
# 查看启动过程中的错误
journalctl -b -p err..alert
# 查看服务从启动到现在的完整日志
journalctl -u mysql --no-pager -n 1000
# 实时监控服务日志
journalctl -u nginx -f
# 查看所有SSH登录
journalctl _COMM=sshd -o verbose | grep "Accepted password"
# 查看特定用户的登录
journalctl _COMM=sshd | grep "Accepted publickey for username"
# 查看高优先级消息
journalctl -p err..emerg --since "1 hour ago"
# 查看磁盘相关错误
journalctl -k | grep -i "disk\|io\|scsi"
如果发现日志被截断:
journalctl --no-tail
使用UTC时间:
journalctl --utc
确保已启用持久化存储(见5.3节),然后检查:
sudo journalctl --list-boots
sudo journalctl --verify
如果发现损坏:
sudo rm -rf /var/log/journal/*
sudo systemctl restart systemd-journald
journalctl
作为systemd的日志工具,提供了比传统syslog更强大的查询和分析能力。通过熟练掌握各种过滤条件和输出格式,可以高效地诊断系统问题。关键点总结:
通过本文介绍的各种技巧和实例,您应该能够充分利用journalctl来监控和排查Linux系统问题。
提示:在生产环境中,考虑将重要日志转发到远程日志服务器或ELK等集中式日志管理系统,以实现长期存储和更复杂的分析需求。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。