Linux系統的輸出的日誌資訊檢視

2021-08-27 20:43:47 字數 4389 閱讀 4530

一、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 ...