一、printk()的介紹
linux系統在開機的過程中我們可以看見很多列印資訊,這都是linux核心內部呼叫printk(level,message)函式列印出來的
其中level是定義的列印優先順序,當優先順序小於console_loglevel時定義的優先順序小於當前日誌的列印級別時,資訊才會列印在控制終端(根據要列印資訊的型別,分為0~7,其中0位最高端別),通常巨集來指示日誌優先順序
#define kern_emerg "<0>" /* system is unusable */
#define kern_alert "<1>" /* action must be taken immediately */
#define kern_crit "<2>" /* critical conditions */
#define kern_err "<3>" /* error conditions */
#define kern_warning "<4>" /* warning conditions */
#define kern_notice "<5>" /* normal but significant */
#define kern_info "<6>" /* informational */
#define kern_debug "<7>" /* debug-level messages */
其中console_loglevel的初始值是default_console_loglevel,可以通過sys_syslog()系統呼叫進行修改,或者修改檔案/proc/sys/kernel/printk下的優先順序,,這個檔案中包含了4個整數值,分別是當前日誌優先順序,未明確指定的日誌級別時的預設日誌優先順序,最小允許的日誌優先順序,引導時的預設日誌優先順序。向該檔案中寫入乙個整數值,就會把當前日誌檔案的優先順序修改為該值,修改方式為
echo 4 > /proc/sys/kernel/printk(linux核心2.6日誌預設的優先順序是4)
message是我們要列印出除錯的資訊
二、訊息被記錄的原理
在核心中有乙個核心自定義的乙個長度為__log_buf_len(在核心配置時為該變數配置值,範圍是4kb~1mb)位元組ring buffer(迴圈緩衝區),linux系統中所有的系統資訊輸出的資訊都是呼叫printk()都被輸出到這裡(包含核心資訊),
通常獲得我們想要的資訊,有兩種方式,一種是直接讀取ring buffer中的資訊,另一種是檢視/var/log下的檔案。
1、直接使用dmesg命令
該命令直接從迴圈緩衝區中讀取資料到stdout
2、通過檢視/var/log下的檔案
在linux中有兩個守護程式,klogd和syslogd
klogd這個程序會通過syslog()這個系統呼叫或者讀取proc檔案系統來得到printk()從ring buffer中得到的資訊,也就是我們的核心資訊。並且klogd也會把資訊傳給syslog這個程序的。
linux系統啟動後,由/etc/init.d/sysklogd先後啟動klogd,syslogd兩個守護程序,其中syslogd通過/etc/syslog.conf這個配置檔案將系統產生的資訊分類記錄到相應的log中,因此這個目錄下會有很多檔案,其中將klogd傳輸過來的核心資訊記錄到/var/log/messgae中。
需要注意的是!!!,syslogd獲取核心資訊依賴程序klogd,因此要想通過syslogd獲得核心的資訊,klogd和syslogd這兩個守護程序必須同時存在(這時無論當前日誌的級別是多少,klogd都會把核心訊息輸出到/var/log/messgae下。這裡我的理解是把列印級別高的輸出到控制台,而把所有的核心資訊,無論列印級別高低,都輸出到/var/log/messgae下),如果klogd沒有執行,核心不會傳遞資訊到使用者空間,因此此時/var/log/messgae不會有資訊,此時只能通過檢視核心專門用來存放列印資訊的目錄/proc/kmsg。
因為迴圈緩衝區的大小是固定的因此不能無限制的儲存日誌資訊,因此當緩衝區滿了之後,printk()函式會從緩衝區的開頭,通過覆蓋之前的日誌資訊繼續儲存最新的資訊,這樣做會導致原來的資訊丟失,但一般之前的資訊對我們的除錯沒什麼作用,因此這樣做是有利的。
為了避免大量的輸出資訊影響除錯,可以通過klogd -f選項指定檔案,將資訊輸出到指定的檔案內,或者強制殺死程序klogd,然後開啟乙個新的終端,使用命令cat /proc/kmsg將資訊顯示在新開啟的終端。
一.檢視日誌方式
命令格式: tail[必要引數][選擇引數][檔案]
這個是我最常用的一種檢視方式
1.tail
-f 迴圈讀取
-q 不顯示處理資訊
-v 顯示詳細的處理資訊
-c《數目》 顯示的位元組數
-n《行數》 顯示行數
-q, --quiet, --silent 從不輸出給出檔名的首部
-s, --sleep-interval=s 與-f合用,表示在每次反覆的間隔休眠s秒
tail -n 10 test.log 查詢日誌尾部最後10行的日誌;
tail -n +10 test.log 查詢10行之後的所有日誌;
tail -fn 10 test.log 迴圈實時檢視最後1000行記錄(最常用的)
//一般還會配合著grep用, 例如 : tail -fn 1000 test.log | grep '關鍵字'
如果一次性查詢的資料量太大,可以進行翻頁檢視,
例如:tail -n 4700 aa.log |more -1000 可以進行多屏顯示(ctrl + f 或者 空格鍵可以快捷鍵)
2.head
head -n 10 test.log //查詢日誌檔案中的頭10行日誌;
head -n -10 test.log //查詢日誌檔案除了最後10行的其他所有日誌;
head其他引數與tail 類似
3.cat
cat 是由第一行到最後一行連續顯示在螢幕上
一次顯示整個檔案 : $ cat filename
從鍵盤建立乙個檔案 : $ cat > filename
將乙個日誌檔案的內容追加到另外乙個 : $cat -n textfile1 > textfile2
清空乙個日誌檔案 $cat : >textfile2
注意:>意思是建立,>>是追加。千萬不要弄混了。
cat其他引數與tail 類似
4.tac
tac 則是由最後一行到第一行反向在螢幕上顯示出來
5.sed
這個命令可以查詢日誌檔案特定的一段 , 也可以根據時間的乙個範圍查詢
//按照行號
sed -n '5,10p' filename //這樣你就可以只檢視檔案的第5行到第10行。
//按照時間段
sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log
6.less
less log.log
shift + g 命令到檔案尾部 然後輸入 ?加上你要搜尋的關鍵字例如 ?1213
shift+n 關鍵字之間進行切換
二.其他會應用到的命令
history // 所有的歷史記錄
history | grep *** // 歷史記錄中包含某些指令的記錄
history | more // 分頁檢視記錄
history -c // 清空所有的歷史記錄
!! 重複執行上乙個命令
查詢出來記錄後選中 : !323
linux日誌檔案說明
/var/log/message 系統啟動後的資訊和錯誤日誌,是red hat linux中最常用的日誌之一
/var/log/secure 與安全相關的日誌資訊
/var/log/maillog 與郵件相關的日誌資訊
/var/log/cron 與定時任務相關的日誌資訊
/var/log/spooler 與uucp和news裝置相關的日誌資訊
/var/log/boot.log 守護程序啟動和停止相關的日誌訊息
/var/log/wtmp 該日誌檔案永久記錄每個使用者登入、登出及系統的啟動、停機的事件
Linux系統日誌目錄下的資訊解讀
1 var log secure 記錄登入系統訪問資料的檔案 例如 pop3,ssh,telnet,ftp 等都會記錄在此。2 ar log btmp 記錄登入這的資訊記錄,被編碼過,所以必須以 last 解析 例如 lastb awk sort uniq c sort nr more3 var l...
java異常資訊日誌輸出
當程式執行異常時,e.printstacktrace 會列印出異常。但是很多時候我們希望將這些異常輸出到日誌中,以便日後可以隨時檢視到,可以通過這些異常快速的找到程式發生異常的 那麼有辦法可以將異常的詳細資訊輸出到檔案嗎?答案是肯定的。程式 public static string gettrace...
linux的日誌系統
linux 的日誌系統 作為一名系統管理員,我們不可能時時刻刻都在伺服器旁邊,而且也不可能為了保證伺服器不被攻擊,這時系統的日誌就顯得很重要了,可以通過分析日子檢查系統的漏洞,提前預防和事後的修復。系統在正常執行的日誌主要有 syslog 程序來提供,syslog 又有syslogd 和klogd ...