Linux 日志系統(tǒng)有三部分組成: 一、使用什么工具記錄系統(tǒng)產(chǎn)生的日志信息? syslog服務(wù)腳本管理的兩個(gè)進(jìn)程: syslogd、klogd 來(lái)記錄系統(tǒng)產(chǎn)生的日志信息; klogd 進(jìn)程是專(zhuān)門(mén)為內(nèi)核產(chǎn)生的日志信息服務(wù)的。 syslogd 進(jìn)程是專(zhuān)門(mén)為應(yīng)用程序服務(wù)(除了內(nèi)核)產(chǎn)生的日志信息服務(wù)的; 只有調(diào)用了 logger 接口,應(yīng)用程序才可以調(diào)用 syslogd工具幫助記錄日志信息。 二、只要系統(tǒng)服務(wù)在運(yùn)行,就會(huì)產(chǎn)生日志信息,我們使用專(zhuān)門(mén)的工具把它記錄到磁盤(pán)上了,為了方便 分析日志,日志文件不能太大、很久以前的日志文件我們應(yīng)該把它刪掉。這些工作由誰(shuí)完成呢? 使用 logrotate 命令來(lái)滾動(dòng),syslog記錄的日志文件。 三、為了讓人們從繁忙的工作中解脫出來(lái)。自動(dòng)化管理:日志文件的滾動(dòng)、備份、壓縮等工作。 使用兩個(gè)忠實(shí)的勞動(dòng)者(進(jìn)程):crond 和 anacron ,完成上述的所有工作。  看看它們各部分的實(shí)現(xiàn)過(guò)程: 1、syslog syslog 只是用來(lái)管理 sysogd 和 klogd 的服務(wù)腳本。它們的配置文件在 /etc/syslog.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | [root@node2 logs] # cat /etc/syslog.conf
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none; cron .none /var/log/messages
# 星號(hào)(*) 表示通配所有的 priority
# *.info 表示記錄所有priority的info級(jí)別的日志信息。注意不緊包括 info 級(jí)別的,還包括比 info 級(jí)別高的所有日志信息都會(huì)被記錄下來(lái)。如:notice、warn、err、...、panic
# *.info;mail.none;authpriv.none;cron.none 表示星號(hào)(*)通配的所有 priority但不包括 mail、authpriv、cron.
# 意思是說(shuō),mail、authpriv、cron 系統(tǒng)的日志信息不會(huì)被記錄到 /var/log/messages 中來(lái)。
# Log all the mail messages in one place.
mail.* - /var/log/maillog
# 星號(hào)(*) 表示通配所有的 priority.
# mail.* 表示記錄系統(tǒng) mail 產(chǎn)生的所有級(jí)別的日志信息。
# -/var/log/maillog 橫線(xiàn)(-)表示系統(tǒng) mail 產(chǎn)生的日志信息是異步寫(xiě)入磁盤(pán)的。意思是先把它存在 page cache 緩沖池中。再根據(jù)某種策略把它一次性刷寫(xiě)到磁盤(pán)中。
# mail 是一個(gè)很繁忙的系統(tǒng),產(chǎn)生的日志信息量非常大。如果每次產(chǎn)生的日志信息就立即把它寫(xiě)到磁盤(pán)上的話(huà),效率是很低的。磁盤(pán)IO速度很慢的。原因,系統(tǒng)默認(rèn)是啟動(dòng)
# 兩個(gè)臟頁(yè)刷寫(xiě)線(xiàn)程的。可以通過(guò)/proc接口查看 [root@node2 ~]# cat /proc/sys/vm/nr_pdflush_threads 。Linux 會(huì)根據(jù)系統(tǒng)繁忙程度啟動(dòng)更多的線(xiàn)程來(lái)為刷寫(xiě)臟頁(yè)服務(wù)的。
# 當(dāng)然我們也可以調(diào)節(jié)該內(nèi)核參數(shù)。但是要根據(jù)我們硬件CPU的顆數(shù)來(lái)調(diào)節(jié)。
# Everybody gets emergency messages
*.emerg *
# *.emerg * 表示所有系統(tǒng)的emerg等級(jí)的日志信息都發(fā)給所有用戶(hù)。
# Save boot messages also to boot.log
local7.* /var/log/boot .log
# 該項(xiàng)記錄的是系統(tǒng)引導(dǎo)過(guò)程的所有級(jí)別的日志信息。
|
配置文件格式: facility.priority /path facility 是用來(lái)定義由誰(shuí)產(chǎn)生的日志信息:那個(gè)軟件、子系統(tǒng)運(yùn)行過(guò)程中產(chǎn)生的日志信息。 priority 是用來(lái)定義記錄什么類(lèi)型的日志信息。是應(yīng)用程序產(chǎn)生的所有信息都把它記錄到日志 文件中呢,還是只記錄該應(yīng)用程序的錯(cuò)誤日志信息等等。 /path/file_name 是用來(lái)定義把日志信息寫(xiě)到哪里去。 查看常見(jiàn)的facility和priority: 1 2 3 4 5 6 7 8 9 10 | [root@node2 ~] # man syslog.conf
# 常見(jiàn)的 facility
The facility is one of the following keywords: auth, authpriv, cron ,
daemon, kern, lpr , mail, mark, news, security (same as auth), syslog,
user, uucp and local0 through local7.
# 常見(jiàn)的 priority
The priority is one of the following keywords, in ascending order:
debug, info, notice, warning, warn (same as warning), err, error (same
as err), crit, alert, emerg, panic (same as emerg).
|
syslog 有統(tǒng)一的日志文件格式,方便管理員閱讀。 Linux 系統(tǒng)日志文件的標(biāo)準(zhǔn)格式: 事件發(fā)生的時(shí)間 哪臺(tái)主機(jī)的日志 產(chǎn)生日志信息的系統(tǒng) 系統(tǒng)發(fā)生的事件 它們各字段之間使用空格隔開(kāi)。 1 2 | [root@node2 ~] # tail /var/log/cron
Jun 12 10:00:01 node2 crond[5487]: (root) CMD ( /usr/lib/sa/sa1 1 1)Jun 12 10:01:01 node2 crond[5490]:(root) CMD (run-parts /etc/cron .hourly)
|
說(shuō)明: 事件發(fā)生的時(shí)間: Jun 12 10:01:01 哪臺(tái)主機(jī)的日志: node2 產(chǎn)生日志信息的系統(tǒng): crond[5490] 系統(tǒng)發(fā)生的事件: CMD (run-parts /etc/cron.hourly) 1 2 3 | [root@node2 ~] # tail -2 /var/log/messages
Jun 11 22:13:54 node2 syslogd 1.4.1: restart.
Jun 11 22:13:54 node2 kernel: klogd 1.4.1, log source = /proc/kmsg started.
|
2、日志文件的滾動(dòng): 所有的日志文件都會(huì)隨著時(shí)間的推移和訪(fǎng)問(wèn)次數(shù)的增加而迅速增大,因此必須對(duì)日志文件進(jìn)行定期 清理以免造成磁盤(pán)空間不必要的浪費(fèi)。同時(shí)這也得以后日志分析方便。 日志滾動(dòng)處理程序 logrotate,能夠自動(dòng)(當(dāng)然自動(dòng)就是把日志滾動(dòng)做成周期性任務(wù)來(lái)完成的)完成日志 的壓縮、備份、刪除和日志郵寄等工作。 每個(gè)日志文件都可以被設(shè)置成每日、每周或每月處理,也能設(shè)置當(dāng)日志文件太大時(shí)立即滾動(dòng)。 logrotate 的工作原理:把被滾動(dòng)的日志文件定義logrotate的配置文件(/etc/logrotate.d/fine_name), 并定義好日志滾動(dòng)事略。 日志滾動(dòng)處理程序讀取配置文件,然后就會(huì)根據(jù)用戶(hù)定義的滾動(dòng)策略來(lái)分析日志文件,是否對(duì)日志 文件進(jìn)程滾動(dòng)。 logrotate 的配置文件分為兩段:主配置文件(/etc/logrotate.conf)和子配置文件定義在/etc/logrotate.d/ 目錄中(需要使用include把該目錄包含進(jìn)來(lái) ) 定義一個(gè)日志文件的滾動(dòng)配置文件格式: 日志文件的全路徑 { logrotate 指令 } 了解一個(gè)日志滾動(dòng)處理程序 logrotate 是怎樣對(duì) syslogd 和 kelogd 記錄的日志文件進(jìn)程滾動(dòng)的? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | [root@node2 ~] # cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly 定義清理日志的周期.
# 已經(jīng)把使用命令【logrotate】進(jìn)行日志滾動(dòng)的服務(wù)定義成了周期性任務(wù)計(jì)劃。
# 但是每天的4點(diǎn)02分會(huì)執(zhí)行一次,
# [root@node2 ~]ll /etc/cron.daily/logrotate
# -rwxr-xr-x 1 root root 180 Feb 27 2009 /etc/cron.daily/logrotate
# 文件 /etc/cron.daily/logrotate 實(shí)際上是運(yùn)
#行 /usr/sbin/logrotate /etc/logrotate.conf
# 也就是說(shuō),每天的4點(diǎn)02分就使用命令【logrotate】對(duì)定義在/etc/logrotate.d 目錄下
# 的符合滾動(dòng)條件的應(yīng)用程序的日志文件
# 進(jìn)程滾動(dòng)。
weekly
# keep 4 weeks worth of backlogs 保存過(guò)去4周的日志文件
rotate 4
# 滾動(dòng)日志的同時(shí)創(chuàng)建新的空的日志文件
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed 是否使用壓縮功能
#compress
# RPM packages drop log rotation information into this directory
# 把/etc/logrotate.d目錄的文件包含進(jìn)來(lái)。
# 如果主配置文件/etc/logrotate.conf與/etc/logrotate.d目錄下的配置文件定義了相
# 同的指令,則覆蓋主配置文件中的指令。否則的話(huà)使用主配置文件中的指令。
include /etc/logrotate .d
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
minsize 1M
create 0664 root utmp
rotate 1
}
|
1 2 3 4 5 6 7 8 9 10 11 12 | [root@node2 ~] # cat /etc/logrotate.d/syslog
# 對(duì) /var/log/messages、/var/log/secure、 /var/log/maillog、
#/var/log/spooler、/var/log/boot.log和/var/log/cron日志文件進(jìn)行日志滾動(dòng)。
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot .log /var/log/cron {
# 調(diào)用日志滾動(dòng)通用函數(shù)
sharedscripts
# 在日志滾動(dòng)之后執(zhí)行,postrotate與endscript之間的命令
postrotate
/bin/kill -HUP ` cat /var/run/syslogd .pid 2> /dev/null ` 2> /dev/null || true
/bin/kill -HUP ` cat /var/run/rsyslogd .pid 2> /dev/null ` 2> /dev/null || true
endscript
}
|
如果我們寫(xiě)好了一個(gè)日志滾動(dòng)的配置文件,怎樣知道日志滾動(dòng)處理程序根據(jù)配置文件對(duì)日志文件的 操作是否成功呢。 則要使用 logrotate 命令的選項(xiàng)以指定配置文件進(jìn)程測(cè)試了。 【logrotate】命令格式 logrotate [選項(xiàng)] <configfile> -d: 詳細(xì)顯示指令執(zhí)行過(guò)程,便于排錯(cuò)或了解程序執(zhí)行的情況。 -f: 強(qiáng)行啟動(dòng)日志文件的滾動(dòng)操作。忽視 logrotate 中定義的日志滾動(dòng)條件??梢杂脕?lái)測(cè)試所配置 的日志滾動(dòng)是否正確。 決定使用 logrotate 應(yīng)用程序來(lái)做 httpd 服務(wù)器的日志滾動(dòng). 1)、在/etc/logrotate.d/目錄下,新建文件 httpd 做為 httpd 服務(wù)的日志文件的滾動(dòng)配置文件。 1 2 3 4 5 6 7 8 9 10 11 | [root@node2 ~] # cat /etc/logrotate.d/httpd
/usr/local/apache2/logs/access .log /usr/local/apache2/logs/error .log {
missingok # 若日志文件丟失則創(chuàng)建一個(gè)新的日志文件
notifempty
rotate 4
size 2M # 當(dāng)日志文件達(dá)到 2M 以后才做日志文件的滾動(dòng)
sharedscripts
postrotate
/bin/kill -1 ` cat /var/run/httpd .pid 2> /dev/null ` 2> /dev/null
endscript
}
|
注意: 要想使用命令【logrotate】的 -f 參數(shù)來(lái)測(cè)試剛配置好的日志滾動(dòng)配置文件,記得一定要使用指令 rotate n 來(lái)備份幾個(gè)滾動(dòng)后日志文件。如果沒(méi)有使用rotate 指令的話(huà),【logrotate -f /etc/logrotate.d/configfile】是不會(huì)備份滾動(dòng)后的日志的。 一執(zhí)行【logrotate -f /etc/logrotate.d/configfile】就會(huì)看到一個(gè)現(xiàn)象:被滾動(dòng)的日志文件被清空了。 使用 -f 選項(xiàng),如果我們的配置文件中有錯(cuò)誤,也會(huì)顯示出來(lái)的。便于我們修改。 也可以使用【date】來(lái)調(diào)整系統(tǒng)時(shí)間,來(lái)執(zhí)行/etc/cron.daily/logrotate任務(wù)。就可以看到結(jié)果了。 2)、模擬應(yīng)用程序logrotate執(zhí)行的時(shí)候,httpd服務(wù)器的日志是否滾動(dòng) 1 2 3 4 | [root@node2 ~] # ll /usr/local/apache2/logs/
total 53172
-rw-r--r-- 1 root root 25702370 Jun 11 16:19 access.log
-rw-r--r-- 1 root root 833 Jun 11 16:18 error.log
|
使用 logrotate 命令的 -f 選項(xiàng)強(qiáng)制執(zhí)行日志文件的滾動(dòng) 1 | [root@node2 ~] # logrotate -f /etc/logrotate.d/httpd
|
再檢查 httpd 服務(wù)器的日志是否滾動(dòng)了?期待或 1 2 3 4 5 6 | [root@node2 ~] # ll /usr/local/apache2/logs/
total 53176
-rw-r--r-- 1 root root 0 Jun 11 16:27 access.log
-rw-r--r-- 1 root root 25702370 Jun 11 16:19 access.log.1
-rw-r--r-- 1 root root 0 Jun 11 16:27 error.log
-rw-r--r-- 1 root root 833 Jun 11 16:27 error.log.1
|
說(shuō)明: 從結(jié)果可以得知: 使用命令【logrotate】實(shí)現(xiàn)了對(duì) httpd 服務(wù)器的日志文件做了日志滾動(dòng)。 3、怎么讓日志滾動(dòng)自動(dòng)執(zhí)行呢? Linux 系統(tǒng)中有兩個(gè)守護(hù)進(jìn)程 crond 和 anacron ,用于自動(dòng)執(zhí)行系統(tǒng)和用戶(hù)的周期性任務(wù)。 crond 與 anacron 是完全不同的兩個(gè)用于定期執(zhí)行任務(wù)的守護(hù)進(jìn)程。 crond 假定服務(wù)器是 7x24 小時(shí)運(yùn)行的,當(dāng)有一段關(guān)機(jī)時(shí)間就會(huì)遺漏這一時(shí)間段 應(yīng)該執(zhí)行的 crond 任務(wù)。 anacron 是為了執(zhí)行因?yàn)闀r(shí)間不連續(xù),crond 而遺漏的任務(wù)。 這樣,它們兩攜手起來(lái)就不會(huì)因?yàn)榉?wù)器關(guān)機(jī)或系統(tǒng)時(shí)間改變而遺漏計(jì)劃任務(wù)了。 周期性任務(wù)計(jì)劃又分為:系統(tǒng)的周期性任務(wù)計(jì)劃(定義在/etc/crontab)和用戶(hù)的周期性任務(wù)計(jì)劃 (定義在/var/spool/cron/$user)。 crond 守護(hù)進(jìn)程是如何完成周期性任務(wù)計(jì)劃的執(zhí)行的呢? crond 首先會(huì)會(huì)讀取,系統(tǒng)的周期性任務(wù)計(jì)劃(定義在/etc/crontab)和用戶(hù)的周期性任務(wù)計(jì)劃 (定義在/var/spool/cron/$user),crond 守護(hù)進(jìn)程時(shí)時(shí)監(jiān)控著, 是否到了周期性任務(wù)計(jì)劃的執(zhí)行時(shí)間。當(dāng)任務(wù)計(jì)劃中的時(shí)間和日期與系統(tǒng)的當(dāng)前時(shí)間和日期相同 時(shí),就執(zhí)行相應(yīng)的周期性任務(wù)計(jì)劃。crond 任務(wù)執(zhí)行結(jié)束后, 任何輸出將作為郵件發(fā)送給安排周期性任務(wù)的所有者。 1 2 3 4 5 6 7 8 9 10 | [root@node2 ~] # cat /etc/crontab
SHELL= /bin/bash
PATH= /sbin : /bin : /usr/sbin : /usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron .hourly
02 4 * * * root run-parts /etc/cron .daily
22 4 * * 0 root run-parts /etc/cron .weekly
42 4 1 * * root run-parts /etc/cron .monthly
|
說(shuō)明: 這是定義系統(tǒng)的周期性任務(wù)計(jì)劃的配置文件。 02 4 * * * root run-parts /etc/cron.daily 表示:每天4點(diǎn)02分,使用root用戶(hù)去執(zhí)行命令(腳本)run-parts /etc/cron.daily 其中 /etc/cron.daily 是命令或腳本(run-parts)的參數(shù)。 而 /etc/cron.daily 目錄中定義很多要執(zhí)行的可執(zhí)行腳本,這些腳本就是要執(zhí)行的任務(wù)。 查看每天的計(jì)劃任務(wù)有哪些? 1 2 3 4 5 6 7 8 9 10 11 12 | [root@node2 ~] # tree /etc/cron.daily/
/etc/cron .daily/
|-- 0anacron
|-- 0logwatch -> /usr/share/logwatch/scripts/logwatch .pl
|-- cups
|-- logrotate ---------> logrotate 日志滾動(dòng)的任務(wù)
|-- makewhatis. cron
|-- mlocate. cron
|-- prelink
|-- rpm
`-- tmpwatch
0 directories, 9 files
|
查看腳本 run-parts 是任務(wù)執(zhí)行任務(wù)的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | [root@node2 ~] # cat /usr/bin/run-parts
#!/bin/bash
# run-parts - concept taken from Debian
# keep going when something fails
set +e
if [ $ # -lt 1 ]; then
echo "Usage: run-parts <dir>"
exit 1
fi
if [ ! -d $1 ]; then
echo "Not a directory: $1"
exit 1
fi
# Ignore *~ and *, scripts
for i in $1/*[^~,] ; do
[ -d $i ] && continue
# Don't run *.{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
# 執(zhí)行 /etc/cron.daily/的具有可執(zhí)行權(quán)限的文件。
if [ -x $i ]; then
$i 2>&1 | awk - v "progname=$i" \
'progname {
print progname ":\n"
progname= "" ;
}
{ print; }'
fi
done
exit 0
說(shuō)明:
腳本 run-parts 是先判斷目錄 /etc/cron .daily 的文件,符合條件的再讓它去執(zhí)行。
查看 /etc/cron .daily /logrotate 任務(wù)腳本
[root@node2 ~] # cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate .conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
|
說(shuō)明: 腳本 run-parts 是先判斷目錄/etc/cron.daily 的文件,符合條件的再讓它去執(zhí)行。 查看 /etc/cron.daily/logrotate 任務(wù)腳本 1 2 3 4 5 6 7 8 | [root@node2 ~] # cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate .conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
|
說(shuō)明: /usr/sbin/logrotate /etc/logrotate.conf logrotate 日志滾動(dòng)程序根據(jù)配置文件configfile(/etc/logrotate.conf)來(lái)對(duì)日志的滾動(dòng)、備份、壓縮等操作。
|