了解、分析登錄檔 - log
了解、分析登錄檔 - log
前言
本文大綱
- 登錄檔 log 如何運作
- logrotate.conf-定義記錄檔的循環的週期
- 哪些登錄檔log應該定期檢視
- 常見的登錄檔
- Ubuntu下 /var/log/ 下各個日誌檔案的說明
- 登錄檔所需相關服務 (daemon) 與程式
- 登錄檔內容的一般格式
- 分析登錄檔
- 使用Gnome Logs日誌檢視器查看登錄檔!
- 使用指令查看登錄檔
- 使用 GoAccess 分析 Nginx 網頁記錄檔,即時監控伺服器狀態
- Ubuntu日誌管理方法
登錄檔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 網頁登錄檔,即時監控伺服器狀態
使用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]
使用 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 對於其他的 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 會立即分析指定的記錄檔,隨即產生這樣的文字報表。
這個報表的內容很詳細,包含訪客人數、請求網址、靜態檔案、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日誌管理方法
連線時間的日誌
- # 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,
留言
張貼留言
Aron阿龍,謝謝您的留言互動!