天天看點

Linux 系統日志管理 日志轉儲

Linux日志伺服器設定 

使用“@IP:端口”或“@@IP:端口”的格式可以把日志發送到遠端主機上。

假設需要管理幾十台伺服器,每天的重要工作就是檢視這些伺服器的日志,可是每台伺服器單獨登入,并且檢視日志非常煩瑣,此時可以把幾十台伺服器的日志集中到一台日志伺服器上嗎?這樣每天隻要登入這台日志伺服器,就可以檢視所有伺服器的日志,。

設定過程

假設伺服器端的伺服器 IP 位址是 192.168.0.210,主機名是 localhost.localdomain;用戶端的伺服器 IP 位址是 192.168.0.211,主機名是 www1。我們現在要做的是把 192.168.0.211 的日志儲存在 192.168.0.210 這台伺服器上。實驗過程如下:

#伺服器端設定(192.168.0.210):
[root@localhost ~]# vi /etc/rsyslog.conf
…省略部分輸出…
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
#取消這兩句話的注釋,允許伺服器使用TCP 514端口接收日志
…省略部分輸出…
[root@localhost ~]# service rsyslog restart
#重新開機rsyslog日志服務
[root@localhost ~]# netstat -tlun | grep 514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
#檢視514端口已經打開
#用戶端設定(192.168.0.211):
[root@www1 ~]# vi /etc/rsyslog.conf
#修改日志服務配置檔案
*.* @@192.168.0.210:514
#把所有日志采用TCP協定發送到192.168.0.210的514端口上
[root@www1 ~]# service rsyslog restart
#重新開機日志服務      

這樣日志伺服器和用戶端就搭建完成了,以後 192.168.0.211 這台客戶機上所産生的所有日志都會記錄到 192.168.0.210 上。比如:

#在客戶機上(192.168.0.211)
[root@wwwl ~]# useradd zhangsan
#添加zhansan使用者提示符的主機名是www1)
#在限務器(192.168.0.210)上
[root@localhost ~]# vi /var/log/secure
#査看伺服器的secure日志(注意:主機名是localhost)
Aug 8 23:00:57 wwwl sshd【1408]: Server listening on 0.0.0.0 port 22.
Aug 8 23:00:57 wwwl sshd[1408]: Server listening on :: port 22.
Aug 8 23:01:58 wwwl sshd[1630]: Accepted password for root from 192.168.0.101 port 7036 ssh2
Aug 8 23:01:58 wwwl sshd[1630]: pam_unix(sshd:session): session opened for user root by (uid=0)
Aug 8 23:03:03 wwwl useradd[1654]: new group: name=zhangsan, GID-505
Aug 8 23:03:03 wwwl useradd[1654]: new user: name=zhangsan, UXD=505, GID=505,
home=/home/zhangsan, shell=/bin/bash
Aug 8 23:03:09 wwwl passwd: pam_unix(passwd:chauthtok): password changed for zhangsan
#注意:檢視到的日志内容的主機名是www1,說明我們雖然檢視的是伺服器的日志檔案,但是在其中可以看到客戶機的日志内容      

需要注意的是,日志服務是通過主機名來差別不同的伺服器的。是以,如果配置了日志服務,則需要給所有的伺服器配置設定不同的主機名。

Linux日志輪替(日志轉儲)

日志記錄和儲存了系統中所有的重要事件。但是日志檔案也需要進行定期的維護,因為日志檔案是不斷增長的,如果完全不進行日志維護,而任由其随意遞增,那麼用不了多久硬碟就會被寫滿。

日志維護的最主要的工作就是把舊的日志檔案删除,進而騰出空間儲存新的日志檔案。 Linux 系統使用logrotate 來進行日志輪替(也叫日志轉儲)的,也就是把舊的日志檔案移動并改名,同時建立一個新的空日志檔案用來記錄新日志,當舊日志檔案超出儲存的範圍時就删除。

日志檔案的命名規則

日志輪替最主要的作用就是把舊的日志檔案移動并改名,同時建立新的空日志檔案,當舊日志檔案超出儲存的範圍時就删除。那麼,舊的日志檔案改名之後,如何命名呢?主要依靠 /etc/logrotate.conf 配置檔案中的“dateext”參數。

如果配置檔案中有“dateext”參數,那麼日志會用日期來作為日志檔案的字尾,如“secure-20130605”。這樣日志檔案名不會重疊,也就不需要對日志檔案進行改名,隻需要儲存指定的日志個數,删除多餘的日志檔案即可。

如果配置檔案中沒有“dateext”參數,那麼日志檔案就需要進行改名了。當第一次進行日志輪替時,目前的“secure”日志會自動改名為“secure.1”,然後建立“secure”日志,用來儲存新的日志;當第二次進行日志輪替時,“secure.1”會自動改名為“secure.2”,目前的“secure”日志會自動改名為“secure.1”,然後也會建立“secure”日志,用來儲存新的日志;以此類推。

logrotate配置檔案

我們來檢視一下 logrotate 的配置檔案 /etc/logrotate.conf 的預設内容。

[root@localhost ~]# vi /etc/logrotate.conf
#see "man logrotate" for details
#rotate log files weekly
weekly
#每周對日志檔案進行一次輪替
#keep 4 weeks worth of backlogs rotate 4
#儲存4個日志檔案,也就是說,如果進行了5次日志輪替,就會删除第一個備份曰志
#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
#包含/etc/logrotate.d/目錄中所有的子配置檔案。也就是說,會把這個目錄中所有的子配置檔案讀取進來,進行日志輪替
#no packages own wtmp and btmp -- we\'11 rotate them here
#以下兩個輪替曰志有自己的獨立參數,如果和預設的參數沖突,則獨立參數生效
/var/log/wtmp {
#以下參數僅對此目錄有效
monthly
#每月對日志檔案進行一次輪替
create 0664 root utmp
#建立的新日志檔案,權限是0664,所有者是root,所屬組是utmp組
minsize 1M
#日志檔案最小輪替大小是1MB。也就是日志一定要超過1MB才會輪替,否則就算時間達到一個月,也不進行曰志輪替
rotate 1
#僅保留一個曰志備份。也就是隻保留wtmp和wtmp.1曰志)
/var/log/btmp {
#以下參數隻對/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/ 目錄中的所有符合文法規則的子配置檔案也會進行日志輪替;

第三部分是對 wtmp 和 btmp 日志檔案的輪替進行設定,如果此設定和預設參數沖突,則目前設定生效(如 wtmp 的目前參數設定的輪替時間是每月,而預設參數的輪替時間是每周,則對 wtmp 這個日志檔案來說,輪替時間是每月,目前的設定參數生效)。

logrotate 配置檔案的主要參數如表 1 所示。

參 緻 參數說明
daily 日志的輪替周期是毎天
weekly 日志的輪替周期是每周
monthly 日志的輪控周期是每月
rotate數宇 保留的日志檔案的個數。0指沒有備份
compress 當進行日志輪替時,對舊的日志進行壓縮
create mode owner group 建立新日志,同時指定新日志的權限與所有者和所屬組.如create 0600 root utmp
mail address 當進行日志輪替時.輸出記憶體通過郵件發送到指定的郵件位址
missingok 如果日志不存在,則忽略該日志的警告資訊
nolifempty 如果曰志為空檔案,則不進行日志輪替
minsize 大小 日志輪替的最小值。也就是日志一定要達到這個最小值才會進行輪持,否則就算時間達到也不進行輪替
size大小 日志隻有大于指定大小才進行日志輪替,而不是按照時間輪替,如size 100k
dateext 使用日期作為日志輪替檔案的字尾,如secure-20130605
sharedscripts 在此關鍵宇之後的腳本隻執行一次
prerotate/cndscript 在曰志輪替之前執行腳本指令。endscript辨別prerotate腳本結束
postrolaie/endscripl 在日志輪替之後執行腳本指令。endscripi辨別postrotate腳本結束

這些參數中較為難了解的應該是 prerotate/endscript 和 postrotate/endscript,我們利用“man logrotate”中的例子來解釋一下這兩個參數。例如:

"/var/log/httpd/access.log" /var/log/httpd/error.log {
#日志輪替的是/var/log/httpd/中RPM包預設安裝的apache正确通路日志和錯誤日志
    rotate 5
    #輪替5次
    mail [email protected]
    #把資訊發送到指定郵箱
    size 100k
    #日志大于100KB時才進行日志輪替,不再按照時間輪替
    sharedscripts
    #以下腳本隻執行一次
    postrotate
    #在日志輪替結束之後,執行以下腳本
    /usr/bin/killall -HUP httpd
    #重新開機apache 服務
endscript
#腳本結束
}      

prerotate 和 postrotate 主要用于在日志輪替的同時執行指定的腳本,一般用于日志輪替之後重新開機服務。這裡強調一下,如果你的日志是寫入 rsyslog 服務的配置檔案的,那麼把新日志加入 logrotate 後,一定要重新開機 rsyslog 服務,否則你會發現,雖然新日志建立了,但資料還是寫入了舊的日志當中。那是因為雖然 logrotate 知道日志輪替了,但是 rsyslog 服務并不知道。

同理,如果采用源碼包安裝了 apache、Nginx 等服務,則需要重新開機 apache 或 Nginx 服務,同時還要重新開機 rsyslog 服務,否則日志也不能正常輪替。

不過,這裡有一個典型應用就是給予特定的日志加入 chattr 的 a 屬性。如果系統檔案加入了 a 屬性,那麼這個檔案就隻能增加資料,而不能删除和修改已有的資料,root 使用者也不例外。

是以,我們會給重要的日志檔案加入 a 屬性,這樣就可以保護日志檔案不被惡意修改。不過,一旦加入了 a 屬性,那麼在進行日志輪替時,這個日志檔案是不能被改名的,當然也就不能進行日志輪替了。我們可以利用 prerotate 和 postrotate 參數來修改日志檔案的 chattr 的 a 屬性。

把自己的日志加入日志輪替

如果有些日志預設沒有加入日志輪替(比如源碼包安裝的服務的日志,或者自己添加的日志),那麼這些日志預設是不會進行日志輪替的,這樣當然不符合我們對日志的管理要求。如果需要把這些日志也加入日志輪替,那該如何操作呢?

這裡有兩種方法:

第一種方法是直接在 /etc/logrotate.conf 配置檔案中寫入該日志的輪替政策,進而把日志加入輪替;

第二種方法是在 /etc/logrotate.d/ 目錄中建立立該日志的輪替檔案,在該輪替檔案中寫入正确的輪替政策,因為該目錄中的檔案都會被包含到主配置檔案中,是以也可以把日志加入輪替。

推薦第二種方法,因為系統中需要輪替的日志非常多,如果全部直接寫入 /etc/logrotate.conf 配置檔案,那麼這個檔案的可管理性就會非常差,不利于此檔案的維護。

說起來很複雜,我們舉個例子。還記得我們自己生成的 /var/log/alert.log 日志嗎?這個日志不是系統預設日志,而是我們通過 /etc/rsyslog.conf 配置檔案自己生成的日志,是以預設這個日志是不會進行輪替的。如果我們需要把這個日志加入日志輪替政策,那該怎麼實作呢?我們采用第二種方法,也就是在 /etc/logrotate.d/ 目錄中建立此日志的輪替檔案。

具體步驟如下:

[root@localhost ~]# chattr +a /var/log/alert.log #先給日志檔案賦予chattr的a屬性,保證日志的安全
[root@localhost ~]# vi /etc/logrotate.d/alter
#建立alter輪替檔案,把/var/log/alert.log加入輪替
/var/log/alert.log {
    weekly
    #每周輪替一次
    rotate 6
    #保留6個輪替曰志
    sharedscripts
    #以下指令隻執行一次
    prerotate
    #在日志輪替之前執行
        /usr/bin/chattr -a /var/log/alert.log
        #在日志輪替之前取消a屬性,以便讓日志可以輪替
    endscript
    #腳本結朿
    sharedscripts
    postrotate
    #在日志輪替之後執行
        /usr/bin/chattr +a /var/log/alert.log
        #在日志輪替之後,重新加入a屬性
    endscript
    sharedscripts
    postrotate
    /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2>/dev/null) fi>/dev/null
    endscript
    #重新開機rsyslog服務,保證日志輪替正常進行
}      

這樣我們自己生成的日志 /var/log/alert.log 也就可以進行日志輪替了,當然這些配置資訊也是可以直接寫入 /etc/logrotate.conf 這個配置檔案的。

回到頂部

logrotate指令:進行日志轉儲(輪替)

日志輪替之是以可以在指定的時間備份日志,是因為其依賴系統定時任務。如果大家還記得 /etc/cron.daily/ 目錄,就會發現這個目錄中是有 logrotate 檔案的,檢視一下這個檔案,指令如下:

[root@localhost ~]# vi /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
#最主要的就是執行了logrotate指令
EXITVALUE=$?
if [ $EXITVALUE!= 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0      

系統每天都會執行 /etc/cron.daily/logrotate 檔案,運作這個檔案中的“/usr/sbin/logrotate/etc/logrotate.conf>/dev/null 2>&1”指令。logrotate 指令會依據 /etc/logrotate.conf 配置檔案的配置,來判斷配置檔案中的日志是否符合日志輪替的條件(比如,日志備份時間已經滿一周),如果符合,日志就會進行輪替。是以說,日志輪替還是由 crond 服務發起的。

logrotate 指令的格式:

[root@localhost ~]# logrotate [選項] 配置檔案名      

[選項]:

如果此指令沒有選項,則會按照配置檔案中的條件進行日志輪替
    -v:顯示日志輪替過程。加入了-v選項,會顯示日志的輪替過程
    -f: 強制進行日志輪替。不管日志輪替的條件是否符合,強制配置檔案中所有的日志進行輪替      

執行 logrotate 指令,并檢視一下執行過程。

[root@localhost ~]# logrotate -v /etc/logrotate.conf
#檢視日志輪替的流程
…省略部分輸出…
rotating pattern:/var/log/alert.log weekly (6 rotations)
#這就是我們自己加入輪替的alert.log日志
empty log files are rotated, old logs are removed
considering log /var/log/alert.log
log does not need rotating
#時間不夠一周,是以不進行日志輪替
…省略部分輸出…      

此時 /var/log/alert.log 加入了日志輪替,已經被 logrotate 識别并調用了,隻是時間沒有達到輪替的标準,是以沒有進行輪替。那我們強制進行一次日志輪替,看看會有什麼結果。

[root@localhost ~]# logrotate -vf /etc/logrotate.conf
#強制進行日志輪替,不管是否符合輪替條件
…省略部分輸出…
rotating pattern:/var/log/alert.log forced from command line (6 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/alert.log
log needs rotating
#日志需要輪替
rotating log /var/log/alert.log,log->rotateCount is 6
dateext suffix \'-20130607\'
#提取日期參數
glob pattern \'-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\'
glob finding old rotated logs failed
running prerotate script
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/alert.log to /var/log/alert.log-20130607
#舊的日志被重命名
creating new /var/log/alert.log mode = 0600 uid = 0 gid = 0
#建立新日志檔案,同時指定權限、所有者和屬組
running postrotate script
…省略部分輸出…      

我們發現,alert.log 日志已經完成了日志輪替。檢視一下新生成的日志和舊日志,如下:

[root@localhost ~]# ll /var/log/alert.log*
-rw-------.1 root root 0 6月 7 10:07 /var/log/alert.log
-rw-------.1 root root 237 6月 7 09:58 /var/log/alert.log-20130607
#舊的日志檔案已經輪替      

新的日志檔案被自動加入了chattr的a屬性

[root@localhost ~]# lsattr /var/log/alert.log
-----a-------e- /var/log/alert.log      

logrotate 指令在使用“-f”選項之後,就會不管日志是否符合輪替條件,而強制把所有的日志都進行輪替。

轉自:https://www.cnblogs.com/lizhouwei/p/10134140.html

https://www.cnblogs.com/long-cnblogs/p/10497321.html