在Linux下,日志會不停的增長,為了防止日志文件過大,導致我們無法在日志中快速找到想要的信息,我們會定時對日志文件進行切割。在這里我將使用logrotate切割日志。
(1).logrotate的配置文件
logrotate配置文件主要在兩個地方:/etc/logrotate.conf以及/etc/logrotate.d/下的明細配置文件。
其中/etc/logrotate.conf文件是主配置文件,/etc/logrotate.d/下的明細配置文件都會被讀入/etc/logrotate.conf進行執行,所以請注意這里還涉及到了公有變量和私有變量。
logrotate的執行是由crond服務來調用的,其腳本是/etc/cron.daily/logrotate,每天自動執行。我們可以看一下腳本具體內容:
[root@xuexi ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0
簡單的說明下,就是/usr/sbin/logrotate工具調用了/var/lib/logrotate/logrotate.status和/etc/logrotate.conf兩個文件。然后將執行的結果(就是那個$?,成功為0,不成功為非0)進行判斷,非0時執行/usr/bin/logger命令。最后退出。
看完定時計划任務,我們再來看主配置文件/etc/logrotate.conf(也就是公有變量)。具體內容如下:
[root@xuexi ~]# grep -vE "^$|^#" /etc/logrotate.conf weekly //每周一次rotate(翻譯是旋轉,其實就是切割) rotate 4 //保留4份切割文件,多余刪除,不計算新建日志文件 create //結束后創建一個新的空白日志文件 dateext //用日期作為切切割文件的后綴 include /etc/logrotate.d //將/etc/logrotate.d目錄下的文件都加載進來(全都執行) /var/log/wtmp { //僅針對/var/log/wtmp文件 monthly //每月執行一次 create 0664 root utmp //結束后創建新的空白日志,權限0664,所有者root,所屬組utmp minsize 1M //切割文件最少需要1M,否則不執行 rotate 1 //保留1份,多余刪除,不計算新建日志文件 } /var/log/btmp { //僅針對/var/log/btmp missingok //丟失不報錯 monthly //每月執行一次 create 0600 root utmp //結束后創建新的空白日志,權限0600,所有者root,所屬組utmp rotate 1 //保留1份,多余刪除,不計算新建日志文件 }
配置文件參數說明:
missingok 日志切割期間產生錯誤將被忽略(如果日志丟失,不報錯繼續切割)
daily、weekly、monthly、yearly 每天、每周、每月、每年執行
create MODE OWNER GROUP 切割后指定創建新的空白文件的屬性
nocreate 不建立新的日志文件
rotate N 保留N份,多余刪除,不計算新建日志文件
dateext 用當前日期作為后綴命名格式(默認年月日)
dateformat .%s 配合dateext使用,緊跟在下一行出現,定義切割后的文件名,只支持%Y,%m,%d,%s
size/minsize 達到指定大小才會切割,默認單位bytes,還可以是KB和MB
compress 切割結束后,歸檔並使用gzip格式壓縮
nocompress 解除compress參數
delaycompress 總是與compress參數一起使用,指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次切割進行。
nodelaycompress 解除delaycompress參數
ifempty 即使日志為空,也執行切割
notifempty 如果日志為空,切割不執行
prerotate/endscript 在所有其他指令之前執行prerotate和endscript之間的命令。
postrotate/endscript 在所有其他指令完成后,postrotate和endscript之間的命令將被執行。
sharescripts 所有日志切割后統一執行一次腳本,如果沒有配置該參數,則每個日志切割后都會執行一次腳本。
errors ADDRESS 切割時的錯誤信息發送到指定的Emial地址
mail ADDRESS 切割日志發送到指定的Email地址
nomail 切割日志不發送郵件
olddir DIRECTORY 切割后的日志文件放入指定目錄,必須與當前日志處在同一文件系統
noolddir 切割后的日志文件與當前文件放在同一目錄下
copytruncate 用於還在打開中的日志文件,把當前日志備份並截斷;先拷貝后清空,可能丟失部分日志
nocopytruncate 備份日志文件,但不截斷。
(2).查看上次切割日志時間
/var/lib/logrotate/logrotate.status中默認記錄logrotate上次切割日志文件的時間
[root@xuexi logrotate]# cat /var/lib/logrotate/logrotate.status logrotate state -- version 2 "/var/log/yum.log" 2019-1-2-11:30:2 "/var/log/cups/page_log" 2018-11-1-10:0:0 "/var/log/cups/error_log" 2018-11-1-10:0:0 "/var/log/boot.log" 2019-4-16-11:37:1 "/var/log/cups/access_log" 2019-4-15-10:18:1 "/var/log/chrony/*.log" 2018-11-1-10:0:0 "/var/log/wtmp" 2018-11-1-10:0:0 "/var/log/spooler" 2019-4-15-10:18:1 "/var/log/btmp" 2019-4-8-15:13:1 "/var/log/iscsiuio.log" 2018-11-1-10:0:0 "/var/log/maillog" 2019-4-15-10:18:1 "/var/log/libvirt/libvirtd.log" 2018-11-1-10:0:0 "/var/log/libvirt/qemu/*.log" 2018-11-1-10:0:0 "/var/log/wpa_supplicant.log" 2018-11-1-10:0:0 "/var/log/secure" 2019-4-15-10:18:1 "/var/log/numad.log" 2018-11-1-10:0:0 "/var/log/ppp/connect-errors" 2018-11-1-10:0:0 "/var/log/messages" 2019-4-15-10:18:1 "/var/account/pacct" 2018-11-1-10:0:0 "/var/log/cron" 2019-4-15-10:18:1
(3).自定義日志切割
首先將sshd服務產生的日志自定義,作為實驗目標
[root@xuexi ~]# vim /etc/rsyslog.conf //在文件末尾添加一行 local0.* /var/log/sshd.log [root@xuexi ~]# vim /etc/ssh/sshd_config //將SyslogFacility AUTHPRIV改為 SyslogFacility local0 [root@xuexi ~]# touch /var/log/sshd.log [root@xuexi ~]# ll /var/log/sshd.log -rw-r--r--. 1 root root 0 4月 17 13:38 /var/log/sshd.log [root@xuexi ~]# systemctl restart sshd [root@xuexi ~]# systemctl restart rsyslog.service [root@xuexi ~]# ll /var/log/sshd.log -rw-r--r--. 1 root root 352 4月 17 13:38 /var/log/sshd.log
之后創建切割明細配置文件,並強制執行
[root@xuexi ~]# vim /etc/logrotate.d/sshd [root@xuexi ~]# cat /etc/logrotate.d/sshd /var/log/sshd.log{ missingok weekly create 0600 root root dateext rotate 3 } [root@xuexi ~]# systemctl restart rsyslog.service [root@xuexi ~]# logrotate -vf /etc/logrotate.d/sshd reading config file /etc/logrotate.d/sshd Allocating hash table for state file, size 15360 B Handling 1 logs rotating pattern: /var/log/sshd.log forced from command line (3 rotations) empty log files are rotated, old logs are removed considering log /var/log/sshd.log log needs rotating rotating log /var/log/sshd.log, log->rotateCount is 3 dateext suffix '-20190417' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' glob finding old rotated logs failed fscreate context set to unconfined_u:object_r:var_log_t:s0 renaming /var/log/sshd.log to /var/log/sshd.log-20190417 creating new /var/log/sshd.log mode = 0600 uid = 0 gid = 0 set default create context [root@xuexi ~]# ll /var/log/sshd* -rw-------. 1 root root 0 4月 17 13:47 /var/log/sshd.log -rw-r--r--. 1 root root 352 4月 17 13:38 /var/log/sshd.log-20190417
logrotate的-d選項是預演,-f是強制執行,-v是顯示詳細過程。
(4).擴展
另外還可使用shell和python進行日志切割,這里我找了一個大佬的文章提供參考:運維中的日志切割操作梳理(Logrotate/python/shell腳本實現)