<序言>
我已經寫過兩篇實用型的博文,可以作為參考:
1) 如何將Linux主機設置成syslog服務器;
2) 使用cron和logrotate來管理日志文件。
這篇文章主要介紹日志服務的基礎知識。涉及日志的服務有兩個,在Fedora9中是rsyslog服務和logrotate服務。前者負責寫入日志,后者負責備份和刪除舊日志,以及更新日志文件。
1. rsyslogd 服務
1.1 查看當前rsyslogd服務的狀態
在Fedora 9開始,負責寫入日志信息的服務是rsyslogd,它的配置文件為:/etc/rsyslog.conf。我們檢測一下當前這個服務是不是在運行。
[flagonxia@airhouse etc]$ ps -ef | grep -v grep | grep rsyslog
root 1584 1 0 10:33 ? 00:00:00 rsyslogd -c 3
從上面命令的輸出結果看到rsyslogd執行時使用的參數是-c 3。這個輸入參數在文件/etc/sysconfig/rsyslog中指定。
[flagonxia@airhouse sysconfig]$ less rsyslog
# Options to syslogd
# syslogd options are deprecated in rsyslog v3
# if you want to use them, switch to compatibility mode 2 by "-c 2"
SYSLOGD_OPTIONS="-c 3"
也可以通過另一種方式,查看當前運行級別中,rsyslogd是否運行。
[flagonxia@airhouse sysconfig]$ sudo chkconfig --list rsyslog
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
注意,這里的服務名是rsyslog。
1.2 配置文件/etc/rsyslog.conf
1.2.1 配置文件的基本信息
配置文件/etc/rsyslog.conf中有很多內容,但最主要的是指定需要記錄哪些服務和需要記錄什么等級的信息。
下面是rsyslog.conf的內容。
# /etc/rsyslog.conf
... ...
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
A *.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
B mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
C *.emerg *
# Save news errors of level crit and higher in a special file.
D uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
【注釋】
A:把所有大于info級別的信息都記錄到/var/log/messages中,但不要記錄mail,authpriv和cron服務產生的信息;
B:把mail產生的信息都記錄到/var/log/maillog中
C:把所有服務輸出的“大于”emergy級別的信息顯示給每個在線的人,通過wall工具
D:把uucp和news輸出的大雨crit級別的信息記錄到/var/log/spooler中
1.2.2 信息的等級及其在配置文件中指定的方式
A 七種信息等級
1)info
2)notice
3)warning或warn
4)err或error
5)crit
6)alert
7)emerg或panic:導致系統幾乎要死機
B 信息等級的指定方式
1). xxx: 表示大于xxx級別的信息
2).=xxx:表示等于xxx級別的信息
3).!xxx:表示在xxx之外的等級的信息
2. logrotate服務
2.1 logrotate服務的啟動方式
logrotate是一個日志管理程序,用來把舊的日志文件刪除(備份),并創建新的日志文件,這個過程稱為“轉儲”。我們可以根據日志的大小,或者根據其使用的天數來轉儲。
logrotate的執行由crond服務實現。在/etc/cron.daily目錄中,有個文件logrotate,它實際上是個shell script,用來啟動logrotate。logrotate程序每天由cron在指定的時間(/etc/crontab)啟動。
[flagonxia@airhouse cron.daily]$ less 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
因此,使用ps是無法查看到logrotate的。如果它沒有起來,就要查看一下crond服務有沒有在運行。
[flagonxia@airhouse logrotate.d]$ ps -ef | grep -v grep | grep cron
root 1984 1 0 10:34 ? 00:00:00 crond
2.2 logrotate的配置文件/etc/logrotate.conf
在執行logrotate時,需要指定其配置文件/etc/logrotate.conf。這個文件定義了如何轉儲日志文件的規則。如下:
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
這個配置文件的注釋寫得很清楚,沒有必要再羅嗦了。只想強調下面這行,它的作用包含存放在/etc/logrotate.d目錄下面的配置文件,不可或缺。如果你安裝了一個新的服務,它的日志轉儲的規則可以建立一個專門的配置文件,放在/etc/logrotate.d下面。它其實也因為下面的這句話,在logrotate服務啟動時被讀取。
include /etc/logrotate.d
這里有個例子:/etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
上面的配置對于/var/log/messages, /var/log/secure, /var/log/mailog/ /var/log/spooler, /var/log/boot.log, /var/log/cron都是適用的。
注意,prerotate和postrotate必須和sharescripts...endscript一起用。上面的信息表示日志文件轉儲后,重啟rsyslogd服務。
每個存放在/etc/logrotate.d目錄里的文件,都有上面格式的配置信息。在{}中定義的規則,如果與logrotate.conf中的沖突,以/etc/logrotatate.d/中的文件定義的為準。
long __buildin_expect(long EXP, C)是GCC的內置函數,用來給編譯器提供分支預測信息:期望EXP==C,返回值是EXP。其中C是編譯時常量。
eg:
if(__buildin_expect(ptr != NULL, 1)) error(); // 期望ptr!=NULL為1;當期望滿足時(返回的ptr != NULL為1)執行error()
if(__buildin_expect(x,0)) foo(); // 期望x==0;當期望未滿足(返回的x為真)時執行foo()
總之:
if(likely(x)) foo(); // 期望x為真,且x為真時執行foo()
if(unlikely(x)) foo(); // 期望x為假,且x為真時執行foo()
也就是說,likely()和unlikely()都是在x為真時執行分支下面的語句;不同的是likely()期望x為真,unlikely期望x為假,
--
ref:
http://blog.richliu.com/2007/02/01/428/
http://kerneltrap.org/mailarchive/linux-netdev/2008/10/31/3873584
Using NIPQUAD() with NIPQUAD_FMT, %d.%d.%d.%d or %u.%u.%u.%u
can be replaced with %pI4
- dprintf("SRC: %u.%u.%u.%u. Mask: %u.%u.%u.%u. Target: %u.%u.%u.%u.%s\n",
- NIPQUAD(src_ipaddr),
- NIPQUAD(arpinfo->smsk.s_addr),
- NIPQUAD(arpinfo->src.s_addr),
+ dprintf("SRC: %pI4. Mask: %pI4. Target: %pI4.%s\n",
+ &src_ipaddr,
+ &arpinfo->smsk.s_addr,
+ &arpinfo->src.s_addr,
arpinfo->invflags & ARPT_INV_SRCIP ? " (INV)" : "");
signal.h
. http://www.linux-wiki.cn/index.php?title=Grub磁盤分區表示方法&variant=zh-cn
==============================================
Grub指定分區的方法和Linux、Windows等系統不一樣,它的主要特點為:
按照以上兩個特點,假設有一塊硬盤(hd0),那么(hd0,0) (hd0,1) (hd0,2) (hd0,3)依次表示它的四個主分區,而隨后的(hd0,4)...則是邏輯分區。 Image:Example.jpg
通常情況下,裝有Windows的硬盤中,通常是按照一個主分區(hd0,0),一個擴展分區(hd0,1)該擴展分區下是若干邏輯分區。這樣(hd0,0)對應C盤,(hd0,4)對應D盤,依此類推。
如果您還不能確定你需要的那個分區,可以在輸入過程中按下Tab鍵實現命令補全。比如你在輸入一條root語句:
root (hd0,
此時按下Tab鍵,grub將列出可用的分區編號和分區類型(grub還不能識別ntfs分區,顯示為不知道類型的分區)。你可以依照這個提示來完成命令的輸入。
如果不能確定ISO文件的位置,可使用find 文件名.iso(find debian-40r2-i386-CD-1.iso)
==============================================
首先設置root密碼,利用現有管理員帳戶登陸Ubuntu,在終端執行命令:sudo passwd root,接著輸入密碼和root密碼,重復密碼。這樣就有了可用的root用戶。