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