linux學習-systemd-journald.service 簡介


過去只有 rsyslogd 的年代中,由於 rsyslogd 必須要開機完成並且執行了 rsyslogd 這個 daemon 之 后,登錄文件才會開始記錄。所以,核心還得要自己產生一個 klogd 的服務, 才能將系統在開機過 程、啟動服務的過程中的信息記錄下來,然后等 rsyslogd 啟動后才傳送給它來處理

現在有了 systemd 之后,由於這玩意兒是核心喚醒的,然后又是第一支執行的軟件,它可以主動呼 叫 systemd-journald 來協助記載登錄文件~ 因此在開機過程中的所有信息,包括啟動服務與服務若 啟動失敗的情況等等,都可以直接被記錄到 systemd-journald 里頭去!

不過 systemd-journald 由於是使用於內存的登錄文件記錄方式,因此重新啟動過后,開機前的登錄文 件信息當然就不會被記載了。

為此,我們還是建議啟動 rsyslogd 來協助分類記錄!也就是說, systemd-journald 用來管理與查詢這次開機后的登錄信息,而 rsyslogd 可以用來記錄以前及現在的所
以數據到磁盤文件中,

使用 journalctl 觀察登錄信息

那么 systemd-journald.service 的數據要如何叫出來查閱呢?很簡單!就透過 journalctl 即可!

[root@study ~]# journalctl [-nrpf] [--since TIME] [--until TIME] _optional
選項與參數:
預設會秀出全部的 log 內容,從舊的輸出到最新的訊息
-n :秀出最近的幾行的意思~找最新的信息相當有用
-r :反向輸出,從最新的輸出到最舊的數據
-p :秀出后面所接的訊息重要性排序!請參考前一小節的 rsyslogd 信息
-f :類似 tail -f 的功能,持續顯示 journal 日志的內容(實時監測時相當有幫助!)
--since --until:設定開始與結束的時間,讓在該期間的數據輸出而已 
_SYSTEMD_UNIT=unit.service :只輸出 unit.service 的信息而已
_COMM=bash :只輸出與 bash 有關的信息
_PID=pid :只輸出 PID 號碼的信息
_UID=uid :只輸出 UID 為 uid 的信息
SYSLOG_FACILITY=[0-23] :使用 syslog.h 規范的服務相對序號來呼叫出正確的數據!

范例一:秀出目前系統中所有的 journal 日志數據
[root@study ~]# journalctl
-- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 00:01:01 CST. --
Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max 
 142.4M, leaving 213.6M of free 1.3G, current limit 142.4M).
Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max
 142.4M, leaving 213.6M of free 1.3G, current limit 142.4M).
Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpuset
Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpu
.....(中間省略).....
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19268]: finished 0anacron
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19270]: starting 0yum-hourly.cron
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19274]: finished 0yum-hourly.cron
# 從這次開機以來的所有數據都會顯示出來!透過 less 一頁頁翻動給管理員查閱!資料量相當大!

范例二:(1)僅顯示出 2015/08/18 整天以及(2)僅今天及(3)僅昨天的日志數據內容
[root@study ~]# journalctl --since "2015-08-18 00:00:00" --until "2015-08-19 00:00:00" 
[root@study ~]# journalctl --since today
[root@study ~]# journalctl --since yesterday --until today

范例三:只找出 crond.service 的數據,同時只列出最新的 10 筆即可
[root@study ~]# journalctl _SYSTEMD_UNIT=crond.service -n 10

范例四:找出 su, login 執行的登錄檔,同時只列出最新的 10 筆即可
[root@study ~]# journalctl _COMM=su _COMM=login -n 10

范例五:找出訊息嚴重等級為錯誤 (error) 的訊息!
[root@study ~]# journalctl -p err

范例六:找出跟登錄服務 (auth, authpriv) 有關的登錄文件訊息
[root@study ~]# journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10

有 journalctl 就真的可以搞定你的訊息數據啰!全部的資料都在這里面耶~再來假設一下, 你想要了解到登錄檔的實時變化, 那又該如何處置呢?現在,請開兩個終端機,讓我們來處理處理!

# 第一號終端機,請使用底下的方式持續偵測系統!
[root@study ~]# journalctl -f
# 這時系統會好像卡住~其實不是卡住啦!是類似 tail -f 在持續的顯示登錄文件信息的!

# 第二號終端機,使用底下的方式隨便發一封 email 給系統上的賬號!
[root@study ~]# echo "testing" | mail -s 'tset' dmtsai
# 這時,你會發現到第一號終端機竟然一直輸出一些訊息吧!沒錯!這就對了!

logger 指令的應用

上面談到的是叫出登錄檔給我們查閱,那換個角度想,『如果你想要讓你的數據儲存到登錄文件當中』 呢?那該如何是好? 好用的家伙了!這個家伙可以傳輸很多信息,不過, 我們只使用最簡單的本機信息傳遞~

[root@study ~]# logger [-p 服務名稱.等級] "訊息"
選項與參數:
服務名稱.等級

范例一:指定一下,讓 dmtsai 使用 logger 來傳送數據到登錄文件內
[root@study ~]# logger -p user.info "I will check logger command"
[root@study ~]# journalctl SYSLOG_FACILITY=1 -n 3
-- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 18:03:17 CST. --
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29710]: starting 0yum-hourly.cron
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29714]: finished 0yum-hourly.cron
Aug 19 18:03:17 study.centos.vbird dmtsai[29753]: I will check logger command

現在,讓我們來瞧一瞧,如果我們之錢寫的 backup.service 服務中,如果使用手動的方式來備份,亦 即是使用 "/backups/backup.sh log" 來執行備份時, 那么就透過 logger 來記錄備份的開始與結束的 時間!該如何是好呢?這樣作看看!

[root@study ~]# vim /backups/backup.sh
#!/bin/bash

if [ "${1}" == "log" ]; then
        logger -p syslog.info "backup.sh is starting"
fi
source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backup.log
if [ "${1}" == "log" ]; then
        logger -p syslog.info "backup.sh is finished"
fi

[root@study ~]# /backups/backup.sh log
[root@study ~]# journalctl SYSLOG_FACILITY=5 -n 3
Aug 19 18:09:37 study.centos.vbird dmtsai[29850]: backup.sh is starting
Aug 19 18:09:54 study.centos.vbird dmtsai[29855]: backup.sh is finished

保存 journal 的方式

systemd-journald.servicd 的訊息是不會放到下一次開機后的,所以,重新啟動后, 那之前的記錄通通會遺失。雖然我們大概都有啟動 rsyslogd 這個服務來進行后續的登錄檔放置,不 過如果你比較喜歡 journalctl 的存取方式,那么可以將這些數據儲存下來喔!

systemd-journald.service 的配置文件主要參考 /etc/systemd/journald.conf 的內容,因為預設的情況底下,配置文件的內容應該已經符合我 們的需求,所以這邊就不再修改配置文件了。只是如果想要保存你的 journalctl 所讀取的登錄檔, 那么就得要建立一個 /var/log/journal 的目錄,並且處理一下該目錄的權限,那么未來重新啟動 systemd-journald.service 之后, 日志登錄文件就會主動的復制一份到 /var/log/journal 目錄下.

# 1. 先處理所需要的目錄與相關權限設定
[root@study ~]# mkdir /var/log/journal
[root@study ~]# chown root:systemd-journal /var/log/journal
[root@study ~]# chmod 2775 /var/log/journal

# 2. 重新啟動 systemd-journald 並且觀察備份的日志數據!
[root@study ~]# systemctl restart systemd-journald.service
[root@study ~]# ll /var/log/journal/
drwxr-sr-x. 2 root systemd-journal 27 Aug 20 02:37 309eb890d09f440681f596543d95ec7a


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM