# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。