CentOS日誌系統組成詳解整理

來源:互聯網
上載者:User

CentOS日誌系統組成詳解整理

日誌系統有三部分組成:
一、使用什麼工具記錄系統產生的日誌資訊?
syslog服務指令碼管理的兩個進程: syslogd、klogd 來記錄系統產生的日誌資訊;
klogd 進程是專門為核心產生的日誌資訊服務的。
syslogd 進程是專門為應用程式服務(除了核心)產生的日誌資訊服務的;
只有調用了 logger 介面,應用程式才可以調用 syslogd工具協助記錄日誌資訊。

二、只要系統服務在運行,就會產生日誌資訊,我們使用專門的工具把它記錄到磁碟上了,為了方便

分析日誌,記錄檔不能太大、很久以前的記錄檔我們應該把它刪掉。這些工作由誰完成呢?
使用 logrotate 命令來滾動,syslog記錄的記錄檔。

三、為了讓人們從繁忙的工作中解脫出來。自動化管理:記錄檔的滾動、備份、壓縮等工作。
使用兩個忠實的勞動者(進程):crond 和 anacron ,完成上述的所有工作。

看看它們各部分的實現過程:
1、syslog
syslog 只是用來管理 sysogd 和 klogd 的服務指令碼。它們的設定檔在 /etc/syslog.conf

[root@node2logs]#cat/etc/syslog.conf#Loganything(exceptmail)oflevelinfoorhigher.#Don'tlogprivateauthenticationmessages!*.info;mail.none;authpriv.none;cron.none/var/log/messages#星號(*)表示通配所有的priority#*.info表示記錄所有priority的info層級的日誌資訊。注意不緊包括info層級的,還包括比info層級高的所有日誌資訊都會被記錄下來。如:notice、warn、err、...、panic#*.info;mail.none;authpriv.none;cron.none表示星號(*)通配的所有priority但不包括mail、authpriv、cron.#意思是說,mail、authpriv、cron系統的日誌資訊不會被記錄到/var/log/messages中來。#Logallthemailmessagesinoneplace.mail.*-/var/log/maillog#星號(*)表示通配所有的priority.#mail.*表示記錄系統mail產生的所有層級的日誌資訊。#-/var/log/maillog橫線(-)表示系統mail產生的日誌資訊是非同步寫入磁碟的。意思是先把它存在pagecache緩衝池中。再根據某種策略把它一次性刷寫到磁碟中。#mail是一個很繁忙的系統,產生的日誌資訊量非常大。如果每次產生的日誌資訊就立即把它寫到磁碟上的話,效率是很低的。磁碟IO速度很慢的。原因,系統預設是啟動#兩個髒頁刷寫線程的。可以通過/proc介面查看[root@node2~]#cat/proc/sys/vm/nr_pdflush_threads。Linux會根據系統繁忙程度啟動更多的線程來為刷寫髒頁服務的。#當然我們也可以調節該核心參數。但是要根據我們硬體CPU的顆數來調節。#Everybodygetsemergencymessages*.emerg*#*.emerg*表示所有系統的emerg等級的日誌資訊都發給所有使用者。#Savebootmessagesalsotoboot.loglocal7.*/var/log/boot.log#該項記錄的是系統引導過程的所有層級的日誌資訊。

設定檔格式:
facility.priority /path
facility 是用來定義由誰產生的日誌資訊:那個軟體、子系統運行過程中產生的日誌資訊。
priority 是用來定義記錄什麼類型的日誌資訊。是應用程式產生的所有資訊都把它記錄到日誌

檔案中呢,還是只記錄該應用程式的錯誤記錄檔資訊等等。
/path/file_name 是用來定義把日誌資訊寫到哪裡去。

查看常見的facility和priority:

[root@node2~]#mansyslog.conf#常見的facilityThefacilityisoneofthefollowingkeywords:auth,authpriv,cron,daemon,kern,lpr,mail,mark,news,security(sameasauth),syslog,user,uucpandlocal0throughlocal7.#常見的priorityThepriorityisoneofthefollowingkeywords,inascendingorder:debug,info,notice,warning,warn(sameaswarning),err,error(sameaserr),crit,alert,emerg,panic(sameasemerg).

syslog 有統一的記錄檔格式,方便管理員閱讀。
Linux 系統記錄檔的標準格式:
事件發生的時間 哪台主機的日誌 產生日誌資訊的系統 系統發生的事件
它們各欄位之間使用空格隔開。

[root@node2~]#tail/var/log/cronJun1210:00:01node2crond[5487]:(root)CMD(/usr/lib/sa/sa111)Jun1210:01:01node2crond[5490]:(root)CMD(run-parts/etc/cron.hourly)

說明:
事件發生的時間: Jun 12 10:01:01
哪台主機的日誌: node2
產生日誌資訊的系統: crond[5490]
系統發生的事件: CMD (run-parts /etc/cron.hourly)

[root@node2~]#tail-2/var/log/messagesJun1122:13:54node2syslogd1.4.1:restart.Jun1122:13:54node2kernel:klogd1.4.1,logsource=/proc/kmsgstarted.

2、記錄檔的滾動:
所有的記錄檔都會隨著時間的推移和訪問次數的增加而迅速增大,因此必須對記錄檔進行定期

清理以免造成磁碟空間不必要的浪費。同時這也得以後日誌分析方便。
日誌滾動處理常式 logrotate,能夠自動(當然自動就是把日誌滾動做成週期性任務來完成的)完成日誌

的壓縮、備份、刪除和日誌郵寄等工作。
每個記錄檔都可以被設定成每日、每周或每月處理,也能設定當記錄檔太大時立即滾動。
logrotate 的工作原理:把被滾動的記錄檔定義logrotate的設定檔(/etc/logrotate.d/fine_name),

並定義好日誌滾動事略。
日誌滾動處理常式讀取設定檔,然後就會根據使用者定義的滾動策略來分析記錄檔,是否對日誌

檔案進程滾動。
logrotate 的設定檔分為兩段:主設定檔(/etc/logrotate.conf)和子設定檔定義在/etc/logrotate.d/

目錄中(需要使用include把該目錄包含進來 )
定義一個記錄檔的滾動設定檔格式:
記錄檔的全路徑 {
logrotate 指令
}
瞭解一個日誌滾動處理常式 logrotate 是怎樣對 syslogd 和 kelogd 記錄的記錄檔進程滾動的?

[root@node2~]#cat/etc/logrotate.conf#see"manlogrotate"fordetails#rotatelogfilesweekly定義清理日誌的周期.#已經把使用命令【logrotate】進行日誌滾動的服務定義成了週期性任務計劃。#但是每天的4點02分會執行一次,#[root@node2~]ll/etc/cron.daily/logrotate#-rwxr-xr-x1rootroot180Feb272009/etc/cron.daily/logrotate#檔案/etc/cron.daily/logrotate實際上是運#行/usr/sbin/logrotate/etc/logrotate.conf#也就是說,每天的4點02分就使用命令【logrotate】對定義在/etc/logrotate.d目錄下#的符合捲軸件的應用程式的記錄檔#進程滾動。weekly#keep4weeksworthofbacklogs儲存過去4周的記錄檔rotate4#滾動日誌的同時建立新的空的記錄檔#createnew(empty)logfilesafterrotatingoldonescreate#uncommentthisifyouwantyourlogfilescompressed是否使用壓縮功能#compress#RPMpackagesdroplogrotationinformationintothisdirectory#把/etc/logrotate.d目錄的檔案包含進來。#如果主設定檔/etc/logrotate.conf與/etc/logrotate.d目錄下的設定檔定義了相#同的指令,則覆蓋主設定檔中的指令。否則的話使用主設定檔中的指令。include/etc/logrotate.d#nopackagesownwtmp--we'llrotatethemhere/var/log/wtmp{monthlyminsize1Mcreate0664rootutmprotate1}[root@node2~]#cat/etc/logrotate.d/syslog#對/var/log/messages、/var/log/secure、/var/log/maillog、#/var/log/spooler、/var/log/boot.log和/var/log/cron記錄檔進行日誌滾動。/var/log/messages/var/log/secure/var/log/maillog/var/log/spooler/var/log/boot.log/var/log/cron{#調用日誌滾動通用函數sharedscripts#在日誌滾動之後執行,postrotate與endscript之間的命令postrotate/bin/kill-HUP`cat/var/run/syslogd.pid2>/dev/null`2>/dev/null||true/bin/kill-HUP`cat/var/run/rsyslogd.pid2>/dev/null`2>/dev/null||trueendscript}

如果我們寫好了一個日誌滾動的設定檔,怎樣知道日誌滾動處理常式根據設定檔對記錄檔的

操作是否成功呢。
則要使用 logrotate 命令的選項以指定設定檔進程測試了。
【logrotate】命令格式
logrotate [選項] <configfile>
-d: 詳細顯示指令執行過程,便於排錯或瞭解程式執行的情況。
-f: 強行開機記錄檔案的滾動操作。忽視 logrotate 中定義的日誌捲軸件。可以用來測試所配置

的日誌滾動是否正確。

決定使用 logrotate 應用程式來做 httpd 伺服器的日誌滾動.
1)、在/etc/logrotate.d/目錄下,建立檔案 httpd 做為 httpd 服務的記錄檔的滾動設定檔。

[root@node2~]#cat/etc/logrotate.d/httpd/usr/local/apache2/logs/access.log/usr/local/apache2/logs/error.log{missingok#若記錄檔丟失則建立一個新的記錄檔notifemptyrotate4size2M#當記錄檔達到2M以後才做記錄檔的滾動sharedscriptspostrotate/bin/kill-1`cat/var/run/httpd.pid2>/dev/null`2>/dev/nullendscript}

注意:
要想使用命令【logrotate】的 -f 參數來測試剛配置好的日誌滾動設定檔,記得一定要使用指令

rotate n 來備份幾個滾動後記錄檔。如果沒有使用rotate
指令的話,【logrotate -f /etc/logrotate.d/configfile】是不會備份滾動後的日誌的。

一執行【logrotate -f /etc/logrotate.d/configfile】就會看到一個現象:被滾動的記錄檔被清空了。
使用 -f 選項,如果我們的設定檔中有錯誤,也會顯示出來的。便於我們修改。
也可以使用【date】來調整系統時間,來執行/etc/cron.daily/logrotate任務。就可以看到結果了。

2)、類比應用程式logrotate執行的時候,httpd伺服器的日誌是否滾動

[root@node2~]#ll/usr/local/apache2/logs/total53172-rw-r--r--1rootroot25702370Jun1116:19access.log-rw-r--r--1rootroot833Jun1116:18error.log

使用 logrotate 命令的 -f 選項強制執行記錄檔的滾動

[root@node2~]#logrotate-f/etc/logrotate.d/httpd

再檢查 httpd 伺服器的日誌是否滾動了?期待或

[root@node2~]#ll/usr/local/apache2/logs/total53176-rw-r--r--1rootroot0Jun1116:27access.log-rw-r--r--1rootroot25702370Jun1116:19access.log.1-rw-r--r--1rootroot0Jun1116:27error.log-rw-r--r--1rootroot833Jun1116:27error.log.1

說明:
從結果可以得知:
使用命令【logrotate】實現了對 httpd 伺服器的記錄檔做了日誌滾動。

3、怎麼讓日誌滾動自動執行呢?
Linux 系統中有兩個守護進程 crond 和 anacron ,用於自動執行系統和使用者的週期性任務。
crond 與 anacron 是完全不同的兩個用於定期執行任務的守護進程。
crond 假定伺服器是 7x24 小時啟動並執行,當有一段關機時間就會遺漏這一時間段

應該執行的 crond 任務。
anacron 是為了執行因為時間不連續,crond 而遺漏的任務。
這樣,它們兩攜手起來就不會因為伺服器關機或系統時間改變而遺漏計劃任務了。
週期性任務計劃又分為:系統的週期性任務計劃(定義在/etc/crontab)和使用者的週期性任務計劃

(定義在/var/spool/cron/$user)。
crond 守護進程是如何完成週期性任務計劃的執行的呢?
crond 首先會會讀取,系統的週期性任務計劃(定義在/etc/crontab)和使用者的週期性任務計劃

(定義在/var/spool/cron/$user),crond 守護進程時時監控著,
是否到了週期性任務計劃的執行時間。當任務計劃中的時間和日期與系統的目前時間和日期相同

時,就執行相應的週期性任務計劃。crond 任務執行結束後,
任何輸出將作為郵件發送給安排週期性任務的所有者。

[root@node2~]#cat/etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/#run-parts01****rootrun-parts/etc/cron.hourly024***rootrun-parts/etc/cron.daily224**0rootrun-parts/etc/cron.weekly4241**rootrun-parts/etc/cron.monthly

說明:
這是定義系統的週期性任務計劃的設定檔。
02 4 * * * root run-parts /etc/cron.daily 表示:每天4點02分,使用root使用者去執行命令(指令碼)run-parts /etc/cron.daily
其中 /etc/cron.daily 是命令或指令碼(run-parts)的參數。
而 /etc/cron.daily 目錄中定義很多要執行的可執行指令碼,這些指令碼就是要執行的任務。

查看每天的計劃任務有哪些?

[root@node2~]#tree/etc/cron.daily//etc/cron.daily/|--0anacron|--0logwatch->/usr/share/logwatch/scripts/logwatch.pl|--cups|--logrotate--------->logrotate日誌滾動的任務|--makewhatis.cron|--mlocate.cron|--prelink|--rpm`--tmpwatch0directories,9files

查看指令碼 run-parts 是任務執行任務的

[root@node2~]#cat/usr/bin/run-parts#!/bin/bash#run-parts-concepttakenfromDebian#keepgoingwhensomethingfailsset+eif[$#-lt1];thenecho"Usage:run-parts<dir>"exit1fiif[!-d$1];thenecho"Notadirectory:$1"exit1fi#Ignore*~and*,scriptsforiin$1/*[^~,];do[-d$i]&&continue#Don'trun*.{rpmsave,rpmorig,rpmnew,swp}scripts排除一些格式的檔案["${i%.rpmsave}"!="${i}"]&&continue["${i%.rpmorig}"!="${i}"]&&continue["${i%.rpmnew}"!="${i}"]&&continue["${i%.swp}"!="${i}"]&&continue["${i%,v}"!="${i}"]&&continue#執行/etc/cron.daily/的具有可執行許可權的檔案。if[-x$i];then$i2>&1|awk-v"progname=$i"\'progname{printprogname":\n"progname="";}{print;}'fidoneexit0說明:指令碼run-parts是先判斷目錄/etc/cron.daily的檔案,合格再讓它去執行。查看/etc/cron.daily/logrotate任務指令碼[root@node2~]#cat/etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate/etc/logrotate.confEXITVALUE=$?if[$EXITVALUE!=0];then/usr/bin/logger-tlogrotate"ALERTexitedabnormallywith[$EXITVALUE]"fiexit0

說明:
指令碼 run-parts 是先判斷目錄/etc/cron.daily 的檔案,合格再讓它去執行。

查看 /etc/cron.daily/logrotate 任務指令碼

[root@node2~]#cat/etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate/etc/logrotate.confEXITVALUE=$?if[$EXITVALUE!=0];then/usr/bin/logger-tlogrotate"ALERTexitedabnormallywith[$EXITVALUE]"fiexit0

說明:
/usr/sbin/logrotate /etc/logrotate.conf
logrotate 日誌滾動程式根據設定檔configfile(/etc/logrotate.conf)來對日誌的滾動、備份、壓縮等操作。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.