Linux系統擁有非常靈活和強大的日志功能,可以保存幾乎所有的操作記錄,並可以從中檢索出我們需要的信息。
大部分Linux發行版默認的日志守護進程為 syslog,位於 /etc/syslog
或 /etc/syslogd
或 /etc/rsyslog.d
,默認配置文件為 /etc/syslog.conf
或 rsyslog.conf
,任何希望生成日志的程序都可以向 syslog 發送信息。
Linux系統內核和許多程序會產生各種錯誤信息、警告信息和其他的提示信息,這些信息對管理員了解系統的運行狀態是非常有用的,所以應該把它們寫到日志文件中去。
完成這個過程的程序就是syslog。syslog可以根據日志的類別和優先級將日志保存到不同的文件中。
例如,為了方便查閱,可以把內核信息與其他信息分開,單獨保存到一個獨立的日志文件中。默認配置下,日志文件通常都保存在/var/log
目錄下。
日志類型
下面是常見的日志類型,但並不是所有的Linux發行版都包含這些類型:
類型 | 說明 |
---|---|
auth | 用戶認證時產生的日志,如login命令、su命令。 |
authpriv | 與 auth 類似,但是只能被特定用戶查看。 |
console | 針對系統控制台的消息。 |
cron | 系統定期執行計划任務時產生的日志。 |
daemon | 某些守護進程產生的日志。 |
ftp | FTP服務。 |
kern | 系統內核消息。 |
local0.local7 | 由自定義程序使用。 |
lpr | 與打印機活動有關。 |
郵件日志。 | |
mark | 產生時間戳。系統每隔一段時間向日志文件中輸出當前時間,每行的格式類似於 May 26 11:17:09 rs2 -- MARK --,可以由此推斷系統發生故障的大概時間。 |
news | 網絡新聞傳輸協議(nntp)產生的消息。 |
ntp | 網絡時間協議(ntp)產生的消息。 |
user | 用戶進程。 |
uucp | UUCP子系統。 |
日志優先級
常見的日志優先級請見下標:
優先級 | 說明 |
---|---|
emerg | 緊急情況,系統不可用(例如系統崩潰),一般會通知所有用戶。 |
alert | 需要立即修復,例如系統數據庫損壞。 |
crit | 危險情況,例如硬盤錯誤,可能會阻礙程序的部分功能。 |
err | 一般錯誤消息。 |
warning | 警告。 |
notice | 不是錯誤,但是可能需要處理。 |
info | 通用性消息,一般用來提供有用信息。 |
debug | 調試程序產生的信息。 |
none | 沒有優先級,不記錄任何日志消息。 |
常用日志文件
系統日志是由一個名為syslog的服務管理的,如以下日志文件都是由syslog日志服務驅動的:
/var/log/boot.log
:錄了系統在引導過程中發生的事件,就是Linux系統開機自檢過程顯示的信息。
/var/log/lastlog
:記錄最后一次用戶成功登陸的時間、登陸IP等信息。
/var/log/messages
:記錄Linux操作系統常見的系統和服務錯誤信息。
/var/log/secure
:Linux系統安全日志,記錄用戶和工作組變化情況、用戶登陸認證情況。
/var/log/btmp
:記錄Linux登陸失敗的用戶、時間以及遠程IP地址。
/var/log/syslog
:只記錄警告信息,常常是系統出問題的信息,使用lastlog查看。
/var/log/wtmp
:該日志文件永久記錄每個用戶登錄、注銷及系統的啟動、停機的事件,使用last命令查看。
/var/run/utmp
:該日志文件記錄有關當前登錄的每個用戶的信息。如 who、w、users、finger等就需要訪問這個文件。
/var/log/syslog 或 /var/log/messages
:存儲所有的全局系統活動數據,包括開機信息。基於 Debian 的系統如 Ubuntu 在 /var/log/syslog
:中存儲它們,而基於 RedHat 的系統如 RHEL 或 CentOS 則在 /var/log/messages
中存儲它們。
/var/log/secure
:與安全相關的日志信息
/var/log/maillog
:與郵件相關的日志信息
/var/log/cron
:與定時任務相關的日志信息
/var/log/spooler
:與UUCP和news設備相關的日志信息
/var/log/auth.log 或 /var/log/secure
:存儲來自可插拔認證模塊(PAM)的日志,包括成功的登錄,失敗的登錄嘗試和認證方式。Ubuntu 和 Debian 在 /var/log/auth.log
中存儲認證信息,而 RedHat 和 CentOS 則在 /var/log/secure
中存儲該信息。
日志文件詳細介紹
- /var/log/boot.log
該文件記錄了系統在引導過程中發生的事件,就是Linux系統開機自檢過程顯示的信息:
[^[[32m OK ^[[0m] Started Show Plymouth Boot Screen.^M
[^[[32m OK ^[[0m] Reached target Paths.^M
[^[[32m OK ^[[0m] Started Forward Password Requests to Plymouth Directory Watch.^M
[^[[32m OK ^[[0m] Reached target Basic System.^M
^[%G^[%G[^[[32m OK ^[[0m] Found device /dev/mapper/centos-root.^M
Starting File System Check on /dev/mapper/centos-root...^M
[^[[32m OK ^[[0m] Started File System Check on /dev/mapper/centos-root.^M
[^[[32m OK ^[[0m] Started dracut initqueue hook.^M
Mounting /sysroot...^M
[^[[32m OK ^[[0m] Reached target Remote File Systems (Pre).^M
[^[[32m OK ^[[0m] Reached target Remote File Systems.^M
[^[[32m OK ^[[0m] Mounted /sysroot.^M
[^[[32m OK ^[[0m] Reached target Initrd Root File System.^M
Starting Reload Configuration from the Real Root...^M
[^[[32m OK ^[[0m] Started Reload Configuration from the Real Root.^M
[^[[32m OK ^[[0m] Reached target Initrd File Systems.^M
[^[[32m OK ^[[0m] Reached target Initrd Default Target.^M
- /var/log/syslog
要讓系統生成該日志文件,在/etc/syslog.conf
文件中加上:*.warning /var/log/syslog
該日志文件能記錄當用戶登錄時login記錄下的錯誤口令、Sendmail的問題、su命令執行失敗等信息。
該日志文件記錄最近成功登錄的事件和最后一次不成功的登錄事件,由login生成。在每次用戶登錄時被查詢,該文件是二進制文件,需要使用lastlog命令查看,根據UID排序顯示登錄名、端口號和上次登錄時間。如果某用戶從來沒有登錄過,就顯示為"Never logged in"。該命令只能以root權限執行。簡單地輸入lastlog命令后就會看到以下信息:
[root@k8s-test01 /var/log]# lastlog
Username Port From Latest
root pts/1 192.168.172.1 Mon Nov 29 10:13:59 +0800 2021
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
halt **Never logged in**
mail **Never logged in**
operator **Never logged in**
games **Never logged in**
ftp **Never logged in**
nobody **Never logged in**
systemd-network **Never logged in**
dbus **Never logged in**
polkitd **Never logged in**
sshd **Never logged in**
postfix **Never logged in**
tss **Never logged in**
chrony **Never logged in**
rpc **Never logged in**
rpcuser **Never logged in**
nfsnobody **Never logged in**
nginx **Never logged in**
apache **Never logged in**
- /var/log/wtmp
該日志文件永久記錄每個用戶登錄、注銷及系統的啟動、停機的事件。因此隨着系統正常運行時間的增加,該文件的大小也會越來越大,增加的速度取決於系統用戶登錄的次數。該日志文件可以用來查看用戶的登錄記錄,last命令就通過訪問這個文件獲得這些信息,並以反序從后向前顯示用戶的登錄記錄,last也能根據用戶、終端tty或時間顯示相應的記錄。
- /var/run/utmp
該日志文件記錄有關當前登錄的每個用戶的信息。因此這個文件會隨着用戶登錄和注銷系統而不斷變化,它只保留當時聯機的用戶記錄,不會為用戶保留永久的記錄。系統中需要查詢當前用戶狀態的程序,如 who、w、users、finger等就需要訪問這個文件。該日志文件並不能包括所有精確的信息,因為某些突發錯誤會終止用戶登錄會話,而系統沒有及時更新 utmp記錄,因此該日志文件的記錄不是百分之百值得信賴的。
以上提及的3個文件(/var/log/wtmp
、/var/run/utmp
、/var/log/lastlog
)是日志子系統的關鍵文件,都記錄了用戶登錄的情況。這些文件的所有記錄都包含了時間戳。這些文件是按二進制保存的,故不能用less、cat之類的命令直接查看這些文件,而是需要使用相關命令通過這些文件而查看。其中,utmp和wtmp文件的數據結構是一樣的,而lastlog文件則使用另外的數據結構,關於它們的具體的數據結構可以使用man命令查詢。
每次有一個用戶登錄時,login程序在文件lastlog中查看用戶的UID。如果存在,則把用戶上次登錄、注銷時間和主機名寫到標准輸出中,然后login程序在lastlog中記錄新的登錄時間,打開utmp文件並插入用戶的utmp記錄。該記錄一直用到用戶登錄退出時刪除。utmp文件被各種命令使用,包括who、w、users和finger。
下一步,login程序打開文件wtmp附加用戶的utmp記錄。當用戶登錄退出時,具有更新時間戳的同一utmp記錄附加到文件中。wtmp文件被程序last使用。
last命令
常用參數說明:
-a 把從何處登入系統的主機名稱或ip地址,顯示在最后一行。
-d 指定記錄文件。指定記錄文件。將IP地址轉換成主機名稱。
-f <記錄文件> 指定記錄文件。
-n <顯示列數>或-<顯示列數> 設置列出名單的顯示列數。
-R 不顯示登入系統的主機名稱或IP地址。
-x 顯示系統關機,重新開機,以及執行等級的改變等信息
查看所有的重啟、關機記錄:
last | grep reboot
last | grep shutdown
history
列出所有的歷史記錄:
[root@k8s-test01 ~]# history
只列出最近10條記錄:
[root@k8s-test01 ~]# history 10 (注,history和10中間有空格)
使用命令記錄號碼執行命令,執行歷史清單中的第99條命令:
[root@k8s-test01 ~]#!99 (!和99中間沒有空格)
重復執行上一個命令:
[root@k8s-test01 ~]#!!
執行最后一次以rpm開頭的命令(!? ?代表的是字符串,這個String可以隨便輸,Shell會從最后一條歷史命令向前搜索,最先匹配的一條命令將會得到執行。)
[root@k8s-test01 ~]#!rpm
逐屏列出所有的歷史記錄:
[root@k8s-test01 ~]# history | more
立即清空history當前所有歷史命令的記錄:
[root@k8s-test01 ~]# history -c
cat, tail 和 watch
系統所有的日志都在 /var/log 下面自己看(具體用途可以自己查,附錄列出一些常用的日志)
cat /var/log/syslog 等
cat /var/log/*.log
tail -f
如果日志在更新,如何實時查看:tail -f /var/log/messages
還可以使用watch -d -n 1 cat /var/log/messages
-d表示高亮不同的地方,-n表示多少秒刷新一次。
該指令,不會直接返回命令行,而是實時打印日志文件中新增加的內容,
這一特性,對於查看日志是非常有效的。如果想終止輸出,按 Ctrl+C
即可。
除此之外還有more, less ,dmesg|more
,這里就不作一一列舉了,因為命令太多了,關鍵看個人喜好和業務需求。個人常用的就是以上那些。