: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.0514 0.0.0.0:* LISTEN
#查看514端口已經打開
#客戶端設置(192.168.0.211):
[root@www1 ~]# vi /etc/rsyslog.conf
#修改日志服務配置文件
*.* @@192.168.0.210514
#把所有日志采用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 www@my.org
    #把信息發送到指定郵箱
    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 1007 /var/log/alert.log
-rw-------.1 root root 237 6月 7 0958 /var/log/alert.log-20130607
#舊的日志文件已經輪替

新的日志文件被自動加入了chattr的a屬性

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM