級別: 中級 Martin C. Brown (questions@mcslp.com), 自由作家兼顧問, MC
2008 年 4 月 15 日 在典型的 UNIX® 或 Linux® 計算機操作過程中會創建許多日誌文件。其中一些日誌文件包含有用的信息;還有一些可幫助您進行容量和資源規劃。本文重點介紹不同日誌文件中記錄的基本信息、它們的位置以及如何使用該信息確定系統的運行情況。 關於本系列 典型的 UNIX 管理員擁有一套經常用於輔助管理過程的關鍵實用工具、訣竅和系統。有一些重要的實用程序、命令行以及腳本可用來簡化各種處理過程。其中一些工具來自於操作系統,而大部分的訣竅則來源於長期的經驗積累和減輕系統管理員工作壓力的要求。本系列文章主要專註於最大限度地利用各種 UNIX 環境中可用的工具,包括簡化異構環境中的管理任務的方法。
日誌文件 所有系統都會生成不同數量的日誌文件,這些文件用於跟蹤和記錄關於計算機的不同信息。這些文件的內容和效用因系統而異,但是文件提供的核心信息通常是一致的。 例如,所有的 UNIX 和 Linux 計算機都使用 syslog(操作系統、應用程序和服務用來記錄信息的通用日誌記錄系統)來記錄信息。syslog 一般會記錄大量的數據,其中包括由不同硬體和系統報告的登錄、性能信息和故障。除 syslog 外,系統還有用來記錄關於計算機及其操作信息的各種服務、環境和應用程序日誌。 儘管分析和提取日誌文件內容的信息可能非常耗時和複雜,但是不能忽略這些日誌中信息的價值。日誌文件可以提供關於潛在問題、錯誤和安全漏洞等方面的提示,如果使用正確,甚至可以提供關於伺服器負載和容量方面的警告。
| 回頁首 | |
日誌位置 各種日誌文件的位置因系統而異。在大多數的 UNIX 和 Linux 系統上,大部分日誌文件都位於 /var/log 中。例如,清單 1 顯示了 Gentoo Linux 系統上的日誌文件列表。 清單 1. Linux /var/log 目錄內容 $ ll /var/log total 3312 -rw-r----- 1 root root 8218 2007-11-03 06:21 dmesg -rw-rw---- 1 portage portage 650111 2008-02-02 13:01 emerge.log -rw------- 1 root root 24024 2007-11-05 07:26 faillog -rw-r--r-- 1 root root 386032 2007-09-28 14:39 genkernel.log drwxr-xr-x 2 root root 4096 2007-11-03 06:47 iptraf/ -rw-r--r-- 1 root root 292292 2008-02-03 08:07 lastlog -rw------- 1 root root 1346931 2008-02-03 08:50 messages drwxr-xr-x 2 root root 4096 2006-08-30 17:04 news/ drwxr-xr-x 3 root root 4096 2007-09-28 13:22 portage/ drwxrwx--- 2 root portage 4096 2007-11-03 06:40 sandbox/ drwxrwx--- 2 snort snort 4096 2007-10-13 11:34 snort/ -rw-rw-r-- 1 root utmp 496896 2008-02-03 08:07 wtmp -rw-rw-rw- 1 root mc 61189 2007-06-10 11:37 Xorg.0.log -rw-rw-rw- 1 root root 61189 2007-06-10 10:40 Xorg.0.log.old | 在 Solaris®、IBM® AIX® 和 HP-UX® 上,主要 syslog 和其它大多數日誌文件都寫入 /var/adm 目錄中的文件(清單 2)。 清單 2. 傳統 UNIX /var/adm 內容 $ ls -al /var/adm total 230 drwxrwxr-x 9 root sys 512 Feb 3 15:30 . drwxr-xr-x 48 root sys 1024 Feb 3 15:32 .. drwxrwxr-x 5 adm adm 512 Feb 2 16:13 acct -rw------- 1 uucp bin 0 Jan 12 18:49 aculog drwxr-xr-x 2 adm adm 512 Feb 2 16:03 exacct -r--r--r-- 1 root root 2856 Feb 3 16:10 lastlog drwxr-xr-x 2 adm adm 512 Feb 2 16:03 log -rw-r--r-- 1 root root 69065 Feb 3 16:08 messages drwxr-xr-x 2 root sys 512 Feb 2 16:09 pool drwxrwxr-x 2 adm sys 512 Feb 2 16:13 sa drwxr-xr-x 2 root sys 512 Feb 2 17:03 sm.bin -rw-rw-rw- 1 root bin 0 Jan 12 18:47 spellhist drwxr-xr-x 2 root sys 512 Feb 2 16:03 streams -rw------- 1 root root 93 Feb 3 16:08 sulog -rw-r--r-- 1 root bin 3720 Feb 3 16:14 utmpx -rw-r--r-- 1 adm adm 29760 Feb 3 16:10 wtmpx | 另外,某些非系統級別的消息和信息都寫入位於 /var/log 中的日誌中(清單 3)。例如,在 Solaris 上,郵件調試項在預設情況下寫入 /var/log/syslog。 清單 3. Solaris 上 /var/log 中的其他日誌 $ ls -al /var/log/ total 48158 drwxr-xr-x 7 root sys 512 Feb 3 16:07 . drwxr-xr-x 48 root sys 1024 Feb 3 15:32 .. -rw------- 1 root sys 0 Jan 12 18:48 authlog -rw-r--r-- 1 root other 27 Feb 2 16:17 brlog drwxr-xr-x 2 root root 512 Feb 2 16:39 gdm drwxr-xr-x 2 root sys 512 Feb 2 16:09 pool -rw-r--r-- 1 root sys 24480410 Feb 3 12:51 postrun.log drwxr-xr-x 2 root sys 512 Feb 2 16:41 swupas -rw-r--r-- 1 root other 635 Feb 2 17:25 sysidconfig.log -rw-r--r-- 1 root sys 3967 Feb 3 16:08 syslog drwxr-xr-x 3 root sys 512 Feb 2 17:25 webconsole drwxr-xr-x 2 root sys 512 Feb 2 16:37 xen -rw-r--r-- 1 root root 66171 Feb 3 16:07 Xorg.0.log -rw-r--r-- 1 root root 66256 Feb 3 16:06 Xorg.0.log.old | 當然,找到文件是最起碼的問題。您需要知道文件包含哪些有用的信息。 根據 UNIX 的變體,一些日誌在其他地方可能比較雜亂,但是,已對標準化文件位置進行了一些有意義的嘗試,使日誌文件都歸入前文已經提及的目錄之一。
日誌類型和數據 日誌類型共分為兩種:文本日誌文件(包含簡單的文本格式的消息和信息)和用二進位格式編碼的文件。前者用於典型系統中的大多數日誌,因為它們易於編寫,而且(也許是更重要的)它們易於閱讀。文本文件的不足之處是有時難以通過結構化方式提取信息,因為文件的文本格式允許使用任何方式或結構編寫信息。 後者的格式對於非常結構化的信息或需要以特定方式或格式編寫的信息更為實用。例如,以二進位數據的固定塊的形式將 utmp 和 wtmp 數據寫入文件,這樣可以用快速有效的格式讀取和寫入信息。遺憾的是,這意味著如果不使用特定的工具將難以讀取信息。 系統日誌 (syslog) syslog 服務是在後台運行的守護進程,可接受日誌輸入並將其寫入到一個或多個單獨文件。報告給 syslog 的所有消息都標有日期、時間和主機名,並且可以讓單個主機從許多主機接受所有日誌消息,並將信息寫入單個文件。 提出問題的服務(例如,郵件、dhcp 和內核)和指示消息嚴重性的類也可以標識消息。可以將嚴重性標記為信息(純信息)、警告、錯誤、重要(需要解決的嚴重問題)甚至緊急(系統需要緊急幫助)。 服務非常容易配置(通常通過 /etc/syslog.conf 或等效項進行配置),並允許您選擇要記錄的信息類和記錄信息的位置。例如,您可以將所有的標準信息寫入文件。但是,對於重要消息,如果管理員立刻需要相關信息,則可以立即將這些消息發送到控制台。清單 4 顯示了 Solaris 10 安裝中的預設 syslog.conf 文件的主配置內容。 清單 4. 示例 syslog.conf 文件 *.err;kern.notice;auth.notice /dev/sysmsg *.err;kern.debug;daemon.notice;mail.crit /var/adm/messages *.alert;kern.err;daemon.err operator *.alert root *.emerg * ... mail.debug ifdef('LOGHOST', /var/log/syslog, @loghost) ... ifdef('LOGHOST', , user.err /dev/sysmsg user.err /var/adm/messages user.alert 'root, operator' user.emerg * ) | 因為 syslog 是 UNIX/Linux 中的標準日誌記錄機制,所以它用於記錄大量的不同信息。其中包括啟動消息、登錄和授權信息,以及服務的啟動/關閉。另外,syslog 通常還用於記錄電子郵件消息傳遞、文件系統問題,甚至 DHCP 租期、DNS 問題和 NFS 問題。因為 syslog 可以將數據寫入不同的區域,所以 syslog 在寫入信息時並不總是十分明顯。 在磁碟上複製 syslog 的主要目的地與在 UNIX 變體之間不同。許多 Linux 版本將信息寫入 /var/log/messages。在 AIX、Solaris 和 HP-UX 上,syslog 被寫入 /var/adm/messages。 在清單 5 中可以看到 Solaris 計算機的 /var/adm/messages 示例。 清單 5. 示例系統日誌輸出 Feb 3 16:06:58 solaris2 ata: [ID 496167 kern.info] cmdk2 at ata1 target 0 lun 0 Feb 3 16:06:58 solaris2 genunix: [ID 936769 kern.info] cmdk2 is /pci@0,0/pci-ide@1f,1/ide@1/cmdk@0,0 Feb 3 16:06:59 solaris2 asy: [ID 267298 kern.notice] asy0: UART @ 3f8 scratch register: expected 0x5a, g ot 0xff Feb 3 16:06:59 solaris2 asy: [ID 702181 kern.notice] Cannot identify UART chip at 3f8 Feb 3 16:06:59 solaris2 asy: [ID 267298 kern.notice] asy1: UART @ 2f8 scratch register: expected 0x5a, got 0xff Feb 3 16:06:59 solaris2 asy: [ID 702181 kern.notice] Cannot identify UART chip at 2f8 Feb 3 16:07:01 solaris2 genunix: [ID 314293 kern.info] device pciclass,030000@2(display#0) keeps up device sd@1,0(sd#1), but the latter is not power managed Feb 3 16:07:01 solaris2 /usr/lib/power/powerd: [ID 387247 daemon.error] Able to open /dev/srn Feb 3 16:07:08 solaris2 /sbin/dhcpagent[164]: [ID 778557 daemon.warning] configure_v4_lease: no IP broadcast specified for ni0, making best guess Feb 3 16:07:31 solaris2 sendmail[503]: [ID 702911 mail.crit] My unqualified host name (solaris2) unknown; sleeping for retry Feb 3 16:07:32 solaris2 sendmail[507]: [ID 702911 mail.crit] My unqualified host name (solaris2) unknown; sleeping for retry Feb 3 16:07:48 solaris2 svc.startd[7]: [ID 652011 daemon.warning] svc:/system/webconsole:console: Method "/lib/svc/method/svc-webconsole start" failed with exit status 95. Feb 3 16:07:48 solaris2 svc.startd[7]: [ID 748625 daemon.error] system/webconsole:console failed fatally: transitioned to maintenance (see 'svcs -xv' for details) Feb 3 16:07:55 solaris2 pseudo: [ID 129642 kern.info] pseudo-device: devinfo0 Feb 3 16:07:55 solaris2 genunix: [ID 936769 kern.info] devinfo0 is /pseudo/devinfo@0 Feb 3 16:08:31 solaris2 sendmail[503]: [ID 702911 mail.alert] unable to qualify my own domain name (solaris2) -- using short name Feb 3 16:08:32 solaris2 sendmail[507]: [ID 702911 mail.alert] unable to qualify my own domain name (solaris2) -- using short name | 在示例輸出中可以看到大量的信息,範圍從硬體設備中的問題一直到郵件服務的當前配置中的問題。 文件的格式非常簡單:它包含日期、主機名、服務名稱、唯一 ID(使系統記錄多行消息並標識它們)和條目的標識符和類。每行上的其餘文本只是系統記錄錯誤消息的自由格式文本。 文件的該格式使提取所需信息變得更加方便。文件中的所有行都是使用唯一 ID 標記的,並且所有的行都標有錯誤消息的標識符和類。 例如,您可以使用郵件系統提取關鍵問題的信息,方法是使用 grep 挑選使用 mail.crit 標記的項: $ grep mail.crit /var/adm/messages . 處理日誌中個別行的詳細信息比較複雜。儘管文件的前幾列是標準化的(它們由 syslog 守護進程寫入),但是,行的其餘格式完全依賴於報告錯誤消息的組件。 它使閱讀和分析文件的內容變得非常複雜,因為您需要根據標識符和報告工具來處理每行。更有甚者,有些行不符合某個格式。 內核日誌(dmesg 和 alog) 所有 UNIX 和 Linux 系統的日誌實際上是內核的一部分。日誌實際上是內核中內存的一部分,用於記錄無法寫入磁碟的有關內核的信息,這是因為該信息是載入文件系統之前生成的。 例如,在啟動過程中,不能以寫入方式訪問文件系統(大多數內核以讀取模式啟動文件系統,直到認為系統足夠安全,能夠切換到讀/寫模式為止)。此日誌中的數據包含關於連接到系統的設備的信息,以及在啟動和操作過程中系統記錄的任何錯誤和問題的信息。 在一些系統上,信息會定期寫入文件 (/var/log/dmesg);而在另一些系統上,只有使用 alog 命令 (AIX) 或 dmesg(所有其他 UNIX/Linux 變體)才可獲得信息。 內核生成的信息並不總是寫入另一個文件,如 syslog。這意味著某些信息(如關於設備和硬體的內部數據)只能通過 dmesg 日誌提供。 例如,清單 6 顯示了 Gentoo Linux 系統上 dmesg 的一些示例輸出。為簡單起見,此處僅顯示了主要啟動信息。 清單 6. dmesg 日誌內容 $ dmesg Linux version 2.6.22-gentoo-r8 (root@gentoo2.vm) (gcc version 4.1.2 (Gentoo 4.1.2 p1.0.1)) #1 SMP Fri Sep 28 14:22:07 GMT 2007 BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000009fc00 (usable) BIOS-e820: 0000000000100000 - 0000000020000000 (usable) 0MB HIGHMEM available. 512MB LOWMEM available. Entering add_active_range(0, 0, 131072) 0 entries of 256 used Zone PFN ranges: DMA 0 -> 4096 Normal 4096 -> 131072 HighMem 131072 -> 131072 early_node_map[1] active PFN ranges 0: 0 -> 131072 On node 0 totalpages: 131072 DMA zone: 32 pages used for memmap DMA zone: 0 pages reserved DMA zone: 4064 pages, LIFO batch:0 Normal zone: 992 pages used for memmap Normal zone: 125984 pages, LIFO batch:31 HighMem zone: 0 pages used for memmap DMI not present or invalid. Allocating PCI resources starting at 30000000 (gap: 20000000:e0000000) Built 1 zonelists. Total pages: 130048 Kernel command line: root=/dev/ram0 init=/linuxrc ramdisk=8192 real_root=/dev/hda3 udev Local APIC disabled by BIOS -- you can enable it with "lapic" mapped APIC to ffffd000 (0140c000) Enabling fast FPU save and restore... done. Enabling unmasked SIMD FPU exception support... done. Initializing CPU#0 CPU 0 irqstacks, hard=c054e000 soft=c052e000 PID hash table entries: 2048 (order: 11, 8192 bytes) Detected 2295.874 MHz processor. Console: colour VGA+ 80x25 Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) Memory: 511616k/524288k available (3150k kernel code, 12100k reserved, 818k data, 264k init, 0k highmem) virtual kernel memory layout: fixmap : 0xffe17000 - 0xfffff000 (1952 kB) pkmap : 0xff800000 - 0xffc00000 (4096 kB) vmalloc : 0xe0800000 - 0xff7fe000 ( 495 MB) lowmem : 0xc0000000 - 0xe0000000 ( 512 MB) .init : 0xc04e7000 - 0xc0529000 ( 264 kB) .data : 0xc0413884 - 0xc04e0364 ( 818 kB) .text : 0xc0100000 - 0xc0413884 (3150 kB) Checking if this processor honours the WP bit even in supervisor mode... Ok. Calibrating delay using timer specific routine.. 4674.89 BogoMIPS (lpj=23374475) Mount-cache hash table entries: 512 CPU: After generic identify, caps: 0f80b9b9 00000000 00000000 00000000 00000001 00000000 00000000 CPU: L1 I cache: 32K, L1 D cache: 32K CPU: L3 cache: 4096K CPU: After all inits, caps: 0f80b9b9 00000000 00000000 00000140 00000001 00000000 00000000 ... | 清單 7 顯示了來自運行 Gentoo Linux 的另一台計算機的輸出,在本例中,您可以看到運行的文件系統報告的一些錯誤。 清單 7. dmesg 的磁碟錯誤 EXT3-fs: mounted filesystem with ordered data mode. sd 7:0:1:0: [sdf] Result: hostbyte=0x00 driverbyte=0x08 sd 7:0:1:0: [sdf] Sense Key : 0x3 [current] sd 7:0:1:0: [sdf] ASC=0x4b ASCQ=0x0 end_request: I/O error, dev sdf, sector 894959703 EXT3-fs error (device sdf1): ext3_get_inode_loc: unable to read inode block - inode=55935010, block=111869955 sd 7:0:1:0: [sdf] Result: hostbyte=0x00 driverbyte=0x08 sd 7:0:1:0: [sdf] Sense Key : 0x3 [current] sd 7:0:1:0: [sdf] ASC=0x4b ASCQ=0x0 end_request: I/O error, dev sdf, sector 894959703 | 從清單 7 可以看到,您可能需要檢查文件系統,因為其中顯示文件系統或磁碟上存在錯誤。 在本例中,syslog 中也報告了該信息(清單 8)。 清單 8. syslog 中的磁碟錯誤 messages:Feb 3 12:17:53 bear sd 7:0:1:0: [sdf] Result: hostbyte=0x00 driverbyte=0x08 messages:Feb 3 12:17:53 bear sd 7:0:1:0: [sdf] Sense Key : 0x3 [current] messages:Feb 3 12:17:53 bear sd 7:0:1:0: [sdf] ASC=0x4b ASCQ=0x0 messages:Feb 3 12:17:53 bear end_request: I/O error, dev sdf, sector 894959703 messages:Feb 3 12:17:53 bear EXT3-fs error (device sdf1): ext3_get_inode_loc: unable to read inode block - inode=55935014, block=111869955 | 但是,在出現嚴重錯誤或故障的情況下,dmesg 有時可能是系統上所發生情況的唯一良好的信息源。
用戶記錄(utmp/x、wtmp/x 和 lastlog) 這些文件包含用戶登錄和系統數據日誌。這些文件中的信息是以特殊的 utmp 格式編寫的,所以您需要特殊的工具才能提取該信息。 這些日誌中的數據記錄登錄次數和系統啟動/關閉次數,即登錄的歷史記錄和對登錄過程中使用的上一次啟動或登錄時間的快速訪問。 有關係統管理工具包中包含的介紹如何分析這些文件的其他文章,請參閱參考資料。 cron 日誌 cron 時間守護進程負責定期在後台運行許多服務,並生成自已的信息日誌。 在某些系統上,cron 日誌是使用 syslog 記錄的,而在 Solaris 和一些傳統 UNIX 變體上,信息則寫入文件 /var/cron/log。日誌中包含的信息包括所執行命令的詳細信息和作業開始和終止的時間。 有關日誌內容的示例,請參見清單 9。 清單 9. cron 活動的日誌 ! *** cron started *** pid = 283 Sun Feb 3 16:07:10 2008 > CMD: /usr/local/bin/logmanage >/dev/null 2>&1 > root 946 c Sun Feb 3 17:10:00 2008 < root 946 c Sun Feb 3 17:10:00 2008 > CMD: /usr/local/bin/backup >/dev/null 2>&1 > root 949 c Sun Feb 3 17:11:00 2008 < root 949 c Sun Feb 3 17:11:01 2008 | 分析日誌的內容是確定可能未正確執行的作業中存在某些問題的有效方法。它也是檢查作業的執行時間的好方法。長時間運行的作業或似乎從未完成的作業可能指示應該調查某個問題。
日誌文件管理 應確保能夠管理系統上的日誌。日誌文件可能變得很大,在許多情況下,您需要保存計算機上事件的歷史記錄,以便解決問題。 例如,應該調查系統的非正常重啟或關閉,而系統日誌通常是唯一的信息源。儘管它無法告訴您在發生故障時發生的一切,但是可以從中得到一些有幫助的信息,如故障發生的準確時間或關於導致問題的事件的信息。潛在的安全問題和登錄嘗試可能指示計算機遭到了攻擊,該攻擊可能導致了此問題甚至就是導致此問題的原因。 長年累月地保存日誌可能沒有必要(但在某些情況下,這是法律要求的)。在一個繁忙的系統中,您每天都可能很容易地將 25MB 或更多信息記錄到系統日誌中,日誌量太大經常是導致磁碟空間不足錯誤的原因。 一些 UNIX/Linux 變體包括自動化日誌管理進程(Solaris 包括 /usr/sbin/logadm 命令),但是創建自已的日誌管理經常並不困難。典型的功能就是短期(例如四周)內保留個別日誌,並按順序對它們編號。例如,如果您具有文件消息,上一周的文件位於 messages.1,則兩周前的文件位於 messages.2 等等。這使文件的遷移變得非常容易。 不過,您必須確保能夠成功複製和重新創建文件,這樣在遷移和存檔過程中才不會丟失任何重要信息。對於舊文件,為節省空間,您還可以存檔內容。清單 10 顯示了一個簡單的腳本,它將個別文件複製並存檔到原始位置中指定的目錄。 清單 10. 簡單日誌歸檔工具 #!/bin/bash # Manage logs and archive them if necessary # Keeps 4 copies of logs cd /var/log for type in cyrus dmesg emerge.log faillog genkernel.log messages do mkdir -p $type.d cp $type.d/$type.3.bz2 $type.d/$type.4.bz2 cp $type.d/$type.2.bz2 $type.d/$type.3.bz2 cp $type.d/$type.1.bz2 $type.d/$type.2.bz2 cp $type $type.d/$type.1 && cat </dev/null >$type bzip2 -vf9 $type.d/$type.1 done | 運行腳本副本可重新創建和存檔日誌文件。請注意如何遷移文件;對於每種情況,我們僅將當前文件移動到一周前。最後,我們將存檔並重新創建原始文件。
總結 從 AIX 創建新的 AD 用戶和組 日誌文件可能包含大量的信息,但是深入了解文件的信息和格式對診斷和解決問題非常有幫助。本文介紹了日誌文件的基礎知識、並介紹了日誌文件位置和這些文件內容的詳細信息,以及它們如何幫助您診斷問題並在成為問題之前識別問題。本文還介紹了不同文件的格式,以及不同文件和它們的內容之間的關係。 |