了解、分析登錄檔 - log

了解、分析登錄檔 - log

前言

當你的 Linux 系統出現不明原因的問題時,很多人都告訴你,你要查閱一下登錄檔才能夠知道系統出了什麼問題了,所以說, 了解登錄檔是很重要的事情呢。登錄檔可以記錄系統在什麼時間、哪個主機、哪個服務、出現了什麼訊息等資訊, 這些資訊也包括使用者識別資料、系統故障排除須知等資訊。如果你能夠善用這些登錄檔資訊的話,你的系統出現錯誤時, 你將可以在第一時間發現,而且也能夠從中找到解決的方案,而不是昏頭轉向的亂問人呢。 此外,登錄檔所記錄的資訊量是非常大的,要人眼分析實在很困難。此時利用 shell script 或者是其他軟體提供的分析工具來處理複雜的登錄檔,可以幫助你很多很多喔!

本文大綱

登錄檔log如何運作

有的登錄檔紀錄的是系統訊息,稱為「系統登錄檔」。而有的登錄檔是紀錄某個特定的服務之使用情況,稱為「服務登錄檔」。通常,這兩者都由系統所提供的一項服務來統一管理(若在傳統Linux系統下這個服務名為syslog,若在ubuntu等系統中則名為rsyslog),不過也有些大型軟體所提供的服務,其登錄檔不受syslog(或rsyslog)來管理,而有其特別的管理方式。

syslog(或rsyslog)可以設定「哪個類型的系統事件,要寫在哪個登錄檔中」,這些設定被寫在設定檔中。其所在位置如下表:

系列 管理登錄檔的服務 設定檔位置
傳統Linux系統
(如Fedora、centOS、RedHat…等)
syslog /etc/syslog.conf
Ubuntu等系統 rsyslog 設定檔:/etc/rsyslog.conf
個別設定檔所在目錄: /etc/rsyslog.d/

訊息等級

是指該事件、所發出之該訊息的種類,依據「危險指數」分成七種(登錄檔所記錄的每一項訊息都依此分成七種)。危險指數越低,表示此訊息所透露出的事實會對系統造成越大的傷害、越須緊急處理。訊息等級的值如下表:

危險指數 訊息種類的值 附註說明
7 debug 用來 debug (除錯) 時產生的訊息資料。
6 info 代表此訊息僅只是在「說明情況」,無危險可言。
5 notice 代表此訊息僅只是在「說明一些值得注意的情況」,無危險可言。
4 warning或warn 警示的訊息,可能有問題,但是還不至於影響到某個 daemon 運作的資訊;
基本上, info, notice, warn 這三個訊息都是在告知一些基本資訊而已,應該還不至於造成一些系統運作困擾;
3 error或err 表示發生了一般錯誤,通常系統可以自行處理。
例如設定檔的某些設定值造成該服務服法啟動的資訊說明,
通常藉由 err 的錯誤告知,應該可以瞭解到該服務無法啟動的問題呢!
2 crit 比 error 還要嚴重的錯誤資訊,這個 crit 是臨界點 (critical) 的縮寫,這個錯誤已經很嚴重了喔!
1 alert 警告警告,已經很有問題的等級,比 crit 還要嚴重!
0 emerg 疼痛等級,意指系統已經幾乎要當機的狀態! 很嚴重的錯誤資訊了。
通常大概只有硬體出問題,導致整個核心無法順利運作,就會出現這樣的等級的訊息吧!

logrotate.conf

  • 另外在 "/etc/logrotate.conf" 之中,我們可以定義記錄檔的循環的週期。

哪些登錄檔log應該定期檢視? 

這必須看使用者對系統的規劃。以系統預設的記錄檔而言,都放在 "/var/log/",而沒有在 "syslog" 當中指定位置的紀錄檔,都會被放到 "/var/log/message"(Ubuntu為 : /var/log/syslog)之中。

此外、若該主機作為郵件伺服器使用,則有 "/var/log/maillog" 也是必須定期檢查的檔案。若是只作為網站伺服器,則必須查看 "/var/log/httpd/access_log" 或是 "/var/log/apache2/access_log "。

常見的登錄檔:

lastlog

  • 位置在 "/var/log/lastlog" , 記錄每個使用者最近一次的登入時間和每個用戶的來源位址。這不是一個ASCII檔案,因此需要用 lastlog 命令檢視內容。
  • 當一個使用者登入到Linux系統時,註冊程式會在 "lastlog" 當中查找該用戶的uid,如果該程式找到該使用者的uid,系統就會顯示最後一次登入的時間和 TTY(終端機號)。

utmp

  • 位置在 "/var/run/utmp" ,utmp紀錄以前登入到該系統的所有使用者。
  • 這個記錄檔隨著使用者進入及離開系統而不斷的變化,他還會對系統中的使用者保持很長的歷史紀錄。可以使用指令 w  和  who  來看,但其他的一些指令也會使用到這個檔案記錄,如 : finger。

wtmp

  • 位置在 "/var/log/wtmp" ,這個記錄檔使用者登入和登出時間。使用wtmp可以找出誰正在登陸進入系統,誰使用命令顯示這個檔案或資訊等。
  • 他和utmp類似,但它隨著登入的次數的增加他會變得越來越大,有些系統的FTP連接資訊也記錄在這個記錄檔中,同時他也紀錄正常的系統退出時間,可以使用 last 來查看內容。

message

  • 位置在 "/var/log/message" ,(Ubuntu中,則是命名為 : /var/log/syslog),透過查看  "/etc/syslog.conf" 我們可以知道紀錄些什麼,大多數的程式記錄都是由他來掌控。在 "syslog" 中沒有特別指定的紀錄,都會被送到這個檔案來。

sulog

  • 位置在 "/var/log/message( /var/log/syslog)" ,用來記載使用者使用 "su" 這個指令的記錄。

網站相關log

  • /var/log/httpd/access_log" 或是 
  • /var/log/apache2/access.log
  • /var/log/apache2/error.log

Ubuntu下 /var/log/ 下各個日誌檔案的說明

  • /var/log/boot.log :
    • 包含系統啟動時的日誌。開機的時候系統核心會去偵測與啟動硬體,接下來開始各種核心支援的功能啟動等。這些流程都會記錄在 /var/log/boot.log 裡面哩! 不過這個檔案只會存在這次開機啟動的資訊,前次開機的資訊並不會被保留下來!
  • /var/log/cron:
    • 任務排程crontab!你的 crontab 排程有沒有實際被進行? 進行過程有沒有發生錯誤?你的 /etc/crontab 是否撰寫正確?在這個登錄檔內查詢看看。
  • /var/log/dmesg :
    • 記錄系統在開機的時候核心偵測過程所產生的各項資訊。包含核心緩衝資訊(kernel ringbuffer),在系統啟動時,顯示螢幕上的與硬體有關的資訊、記錄一份在這個檔案中。
  • /var/log/lastlog :
    • 可以記錄系統上面所有的帳號最近一次登入系統時的相關資訊。這不是一個ASCII檔案,因此需要用lastlog命令檢視內容。
  • /var/log/maillog 或 /var/log/mail/*:
    • 記錄郵件的往來資訊,其實主要是記錄 postfix (SMTP 協定提供者) 與 dovecot (POP3 協定提供者) 所產生的訊息啦。 SMTP 是發信所使用的通訊協定, POP3 則是收信使用的通訊協定。 postfix 與 dovecot 則分別是兩套達成通訊協定的軟體。 
  • /var/log/mail.err    -類似於上面的
  • /var/log/messages(Ubuntu: /var/log/syslog):
    • 這個檔案相當的重要,幾乎系統發生的錯誤訊息 (或者是重要的資訊) 都會記錄在這個檔案中; 如果系統發生莫名的錯誤時,這個檔案是一定要查閱的登錄檔之一。
  • /var/log/secure:
    • 基本上,只要牽涉到『需要輸入帳號密碼』的軟體,那麼當登入時 (不管登入正確或錯誤) 都會被記錄在此檔案中。 包括系統的 login 程式、圖形介面登入所使用的 gdm 程式、 su, sudo 等程式、還有網路連線的 ssh, telnet 等程式, 登入資訊都會被記載在這裡。
  • /var/log/wtmp, /var/log/faillog:
    • 這兩個檔案可以記錄正確登入系統者的帳號資訊 (wtmp) 與錯誤登入時所使用的帳號資訊 (faillog) ! 我們在第十章談到的 last 就是讀取 wtmp 來顯示的, 這對於追蹤一般帳號者的使用行為很有幫助!
    • /var/log/wtmp  :包含登入資訊。使用wtmp可以找出誰正在登陸進入系統,誰使用命令顯示這個檔案或資訊等。
    • /var/log/faillog  : 包含使用者登入失敗資訊。此外,錯誤登入命令也會記錄在本檔案中。
  • /var/log/alternatives.log :
    • 更新替代資訊都記錄在這個檔案中
  • /var/log/apport.log :
    • 應用程式崩潰記錄
  • /var/log/apt/  : 
    • 用apt-get安裝解除安裝軟體的資訊
  • /var/log/auth.log :
    • 登入認證log
  • /var/log/btmp :
    • 記錄所有失敗啟動資訊
  • /var/log/Consolekit : 
    • 記錄控制檯資訊
  • /var/log/cpus :
    • 涉及所有列印資訊的日誌
  • /var/log/dist-upgrade :
    • dist-upgrade這種更新方式的資訊
  • /var/log/dpkg.log  :
    • 包括安裝或dpkg命令清除軟體包的日誌。
  • /var/log/faillog :
    • 包含使用者登入失敗資訊。此外,錯誤登入命令也會記錄在本檔案中。
  • /var/log/fontconfig.log
    • 與字型配置有關的log。
  • /var/log/fsck  
    • 檔案系統日誌
  • /var/log/faillog  
    • 包含使用者登入失敗資訊。此外,錯誤登入命令也會記錄在本檔案中。
  • /var/log/kern.log 
    • 包含核心產生的日誌,有助於在定製核心時解決問題。
  • /var/log/samba/
    • 包含由samba儲存的資訊。
  • /var/log/xorg.*.log
    •  來自X的日誌資訊。
  • /var/log/httpd/access_log
  • /var/log/apache2/access.log
  • /var/log/apache2/error.log
  • /var/log/hp/ 
  • /var/log/install/
  • /var/log/jokey.log
  • /var/log/lightdm/
  • /var/log/news/
  • /var/log/pm-powersave.log
  • /var/log/syss.log
  • /var/log/speech-dispacher/
  • /var/log/udev
  • /var/log/ufw.log
  • /var/log/upstart/
  • /var/log/uattended-upgrades/

登錄檔所需相關服務 (daemon) 與程式

那麼這些登錄檔是怎麼產生的呢?基本上有兩種方式,一種是由軟體開發商自行定義寫入的登錄檔與相關格式, 例如 WWW 軟體 apache 就是這樣處理的。另一種則是由 Linux distribution 提供的登錄檔管理服務來統一管理。 你只要將訊息丟給這個服務後,他就會自己分門別類的將各種訊息放置到相關的登錄檔去! rsyslog.service 這個服務來統一管理登錄檔喔!

不過要注意的是,如果你任憑登錄檔持續記錄的話,由於系統產生的資訊天天都有,那麼你的登錄檔的容量將會長大到無法無天~ 如果你的登錄檔容量太大時,可能會導致大檔案讀寫效率不佳的問題 (因為要從磁碟讀入記憶體,越大的檔案消耗記憶體量越多)。 所以囉,你需要對登錄檔備份與更新。那...需要手動處理喔?當然不需要,我們可以透過 logrotate (登錄檔輪替) 這玩意兒來自動化處理登錄檔容量與更新的問題喔!

所謂的 logrotate 基本上,就是將舊的登錄檔更改名稱,然後建立一個空的登錄檔,如此一來, 新的登錄檔將重新開始記錄,然後只要將舊的登錄檔留下一陣子,嗯!那就可以達到將登錄檔『輪轉』的目的啦! 此外,如果舊的記錄 (大概要保存幾個月吧!) 保存了一段時間沒有問題,那麼就可以讓系統自動的將他砍掉, 免得佔掉很多寶貴的硬碟空間說!

總結一下,針對登錄檔所需的功能,我們需要的服務與程式有:

  • systemd-journald.service:最主要的訊息收受者,由 systemd 提供的;
  • rsyslog.service:主要登錄系統與網路等服務的訊息;
  • logrotate:主要在進行登錄檔的輪替功能。

登錄檔內容的一般格式

一般來說,系統產生的訊息經過記錄下來的資料中,每條訊息均會記錄底下的幾個重要資料:

  • 事件發生的日期與時間;
  • 發生此事件的主機名稱;
  • 啟動此事件的服務名稱 (如 systemd, crond...等) 或指令與函式名稱 (如 su, login..);
  • 該訊息的實際資料內容。
當然,這些資訊的『詳細度』是可以修改的,而且,這些資訊可以作為系統除錯之用呢!

我們拿登錄時一定會記載帳號資訊的 /var/log/secure 為例好了:

  • #cat /var/log/secure

我們拿第一筆資料 (共兩行) 來說明好了,該資料是說:『在 08/17 的 18:38 左右,在名為 study 的這部主機系統上,由 login 這個程式產生的訊息,內容顯示 root 在 tty1 登入了,而相關的權限給予是透過 pam_unix 模組處理的 (共兩行資料)。』有夠清楚吧!那請您自行翻譯一下後面的幾條訊息內容是什麼喔!

其實還有很多的資訊值得查閱的呢!尤其是 /var/log/messages(Ubuntu: /var/log/syslog), 的內容。

解析Ubuntu: /var/log/syslog:

  • #tail -f /var/log/syslog

記得一個好的系統管理員, 要常常去『巡視』登錄檔的內容喔!尤其是發生底下幾種情況時:

  • 當你覺得系統似乎不太正常時;
  • 某個 daemon 老是無法正常啟動時;
  • 某個使用者老是無法登入時;
  • 某個 daemon 執行過程老是不順暢時;
  • 還有很多啦!反正覺得系統不太正常,就得要查詢查詢登錄檔就是了。

分析登錄檔

登錄檔的分析是很重要的!你可以自行以 vim 或者是 journalctl 進入登錄檔去查閱相關的資訊。而系統也提供一些軟體可以讓你從登錄檔中取得資料, 例如之前談過的 last, lastlog, dmesg 等等指令。不過,這些資料畢竟都非常的分散,如果你想要一口氣讀取所有的登錄資訊, 其實有點困擾的。

圖片來源: Log Analytics, Log Mining and Anomaly Detection with Deep Learning

這裡,我們以三種方式說明:

  • Gnome Logs登錄檔檢視器(圖形)
  • 指令查看登錄檔
  • 使用 GoAccess 分析 Nginx 網頁登錄檔,即時監控伺服器狀態

參考 : How to View System Log Files on Ubuntu 20.04 LTS

使用Gnome Logs日誌檢視器查看登錄檔! 

  • 按 Windows 鍵 :搜索/瀏覽程序、搜尋 log。可找到系統日誌檢視器。

他已經幫你分類: 重要(Important)、全部(All)、應用程式(Applications)、系統(System)、安全性(Security)、硬體(Hardware)。

您可以右上角搜尋窗口執行以下操作:

  • 通過單擊顯示日誌的內容。
  • 通過單擊搜尋,然後在搜索欄中提供關鍵字來搜索日誌。搜索欄還提供了許多過濾器
    • Log的欄位作為過濾條件: 例如,PID,UID,GID,訊息、程序名稱....
    • Log時間戳範圍:

  • 您還可以通過單擊“日誌”窗口右上角的導出按鈕將日誌導出到文件。然後,您可以通過指定名稱和位置來保存日誌文件。

指令查看登錄檔

使用cat命令

  • $cat /var/log/syslog

此命令會將日誌從syslog文件打印到屏幕上。您將再次觀察到,該命令將打印所有信息,並且瀏覽起來並不容易。同樣,您可以在此處使用“ grep”和“ less”過濾器來顯示所需的輸出,如下所示:

  • $ cat |grep [keyword] [location]
  • $ cat |less [location]

使用監看指令: tail 跟隨模式

  • $tail -f /var/log/lastlog   
  • tail 是一個類似 cat 的指令,不過它只會輸出檔案的最後幾行(預設是 10 行),如果加上 -f 參數啟用跟隨模式時,它就會在輸出檔案的最後幾行後,持續等待新增加的檔案內容,只要有新內容加入時,就會自動將其輸出。 -F 參數,它跟 -f 類似,不過它會在檔案讀取失敗(的檔案不存在)後自動等待並重試。在這種狀況下,就算輸出檔案後來才被建立,或是中途被刪除又重建,也可以正常抓到最新的程式輸出訊息。

使用監看指令: less 跟隨模式

  • less 是用來快速查看文字檔的小工具,而它也有支援跟隨模式,可以即時將新加入的內容顯示出來,
  • $less /var/log/lastlog   
  • 接著在 less 的模式下按下 Shift + f,這樣就會切換到跟隨模式。

使用dmesg命令

此命令從內核緩衝區中提取所有訊息。

搜索包含特定關鍵字的消息

  • $dmesg |grep [keyword]
例如,如果要搜索所有包含單詞core的消息,則可以使用以下命令:
  • $dmesg |grep core

使用 GoAccess 分析 Nginx 網頁記錄檔,即時監控伺服器狀態

GoAccess 是一個開放原始碼的網頁伺服器記錄檔分析工具,可以產生網頁版或文字版的動態統計報表,讓系統管理者可以查看即時的系統狀態,其涵蓋的資訊非常詳細,而且產生報表的方式相當簡潔,只要一行指令就可以馬上產生報表,對於 Linux 系統與指令比較熟悉的人而言,是一個非常方便的工具。

安裝 GoAccess

我這裡以 Ubuntu Linux 的環境來示範如何安裝 GoAccess。最簡單的安裝方式就是直接使用 apt 從 Ubuntu Linux 官方的套件庫安裝:

更新套件列表,並安裝最新的 GoAccess 套件:

  • $sudo apt update
  • $sudo apt install goaccess

如果您會需要訪客來源國家的資訊,就要再安裝 GeoIP 資料庫:

  • $sudo apt install geoip-database
這樣 GoAccess 就安裝完成了。

GoAccess 對於其他的 Linux 與 Mac OS X 等系統的支援性也相當高,關於各種其他系統的安裝方式,請參考: GoAccess 的安裝說明

使用 GoAccess 分析 Nginx 記錄檔

因為不同的網頁伺服器會有不同的記錄檔格式,在使用 GoAccess 之前,我們要將 GoAccess 的解析設定調整成適合自己伺服器的格式。

1. 設定 GoAccess 分析 Nginx 記錄檔
開啟 /etc/goaccess.conf 這個 GoAccess 的設定檔,根據自己的網頁伺服器設定檔格式進行調整,如果您是使用 Apache 或 Nginx 預設的設定(也就是沒有特別去改記錄檔的格式的話),只要把 GoAccess 設定檔中對應的設定註解拿掉即可,這裡我以 Nginx 預設的記錄檔格式設定來示範。

  • 首先調整時間格式:
# The following time format works with any of the
 # Apache/NGINX's log formats below.
 time-format %H:%M:%S
  • 接著是日期格式:
# The following date format works with any of the
# Apache/NGINX's log formats below.
date-format %d/%b/%Y
  • 記錄內容的格式:
# NCSA Combined Log Format
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

設定好記錄檔的格式之後,就可以開始使用 GoAccess 分析資料了。

2.GoAccess 文字報表

  • GoAccess 最直接的方式就是使用 -f 參數指定要分析的記錄檔:
goaccess -f /var/log/nginx/access.log
  • 執行之後,GoAccess 會立即分析指定的記錄檔,隨即產生這樣的文字報表。
GoAccess 文字版動態報表

這個報表的內容很詳細,包含訪客人數、請求網址、靜態檔案、404 錯誤網址、來源 IP 位址、訪客作業系統與瀏覽器版本、瀏覽時間、引介網站(referring sites)、訪客來源國家等各種統計資料,使用者可以用上下鍵捲動來查看。

另外它的內容是會動態更新的(類似 top 指令的畫面),所以管理者可以使用 SSH 這類的連線方式連上主機之後,執行這樣的指令後放著監看即時的系統狀態,而不要看的時候就直接關閉,完全不需要為了監控伺服器而啟動任何背景的系統服務,不會造成系統不必要的負擔。

  • 如果要看比較長期性的統計數據,可以將 /var/log/nginx/ 下面的 access.log.* 檔整理出來,一次全部丟給 GoAccess 來分析:
cat access.log.* | goaccess

這樣就可以產生好幾天以上的統計資料。

GoAccess 文字版報表

  • 也可以配合 zcat 一次將所有的記錄檔全部交給 GoAccess 分析:
zcat -f /var/log/nginx/access.log* | goaccess

3.GoAccess 網頁報表

  • 如果您感覺文字模式的報表不好看,GoAccess 也可以產生漂亮的網頁報表,只要把 goaccess 指令的輸出導向檔案,就會輸出 html 的報表:
cat access.log.* | goaccess > output.html

Ubuntu日誌管理方法

連線時間的日誌

連線時間日誌一般由/var/log/wtmp和/var/run/utmp這兩個檔案記錄,不過這兩個檔案無法直接cat檢視,並且該檔案由系統自動更新,可以通過如下進行檢視: w,who,finger,id,last,lastlog,ac ...

  • # who
  • # w
  • # ac -p      //檢視每個使用者的連線時間
  • # ac -a       //檢視所有使用者的連線時間
  • # ac -d       //檢視使用者每天的連線時間

程序監控日誌

程序統計監控日誌在監控使用者的操作指令是非常有效的。當伺服器最近發現經常無故關機或者無故被人刪除檔案等現象時,可以通過使用程序統計日誌檢視:

  • # accton /var/account/pacct          //開啟程序統計日誌監控
  • # lastcomm           //檢視程序統計日誌情況
  • # accton         //關閉程序統計日誌監控

系統和服務日誌

系統日誌服務是由一個名為syslog的服務管理的,如一下日誌檔案都是由syslog日誌服務驅動的

  • /var/log/lastlog :記錄最後一次使用者成功登陸的時間、登陸IP等資訊
  • /var/log/messages :記錄Linux作業系統常見的系統和服務錯誤資訊
  • /var/log/secure :Linux系統安全日誌,記錄使用者和工作組變壞情況、使用者登陸認證情況
  • /var/log/btmp :記錄Linux登陸失敗的使用者、時間以及遠端IP地址
  • /var/log/cron :記錄crond計劃任務服務執行情況
使用指令
  • # cat /var/log/lastlog

參考資料

特色、摘要,Feature、Summary:

關鍵字、標籤,Keyword、Tag:

  • Ubuntu,Linux,Security,





留言

這個網誌中的熱門文章

Ubuntu 常用指令、分類與簡介

iptables的觀念與使用

網路設定必要參數IP、netmask(遮罩)、Gateway(閘道)、DNS

Python 與SQLite 資料庫

Blogger文章排版範本

Pandas 模組

如何撰寫Shell Script

查詢指令或設定 -Linux 線上手冊 - man

下載網頁使用 requests 模組