在Linux下,日誌會不停的增加,爲了防止日誌文件過大,致使咱們沒法在日誌中快速找到想要的信息,咱們會定時對日誌文件進行切割。在這裏我將使用logrotate切割日誌。html
(1).logrotate的配置文件node
logrotate配置文件主要在兩個地方:/etc/logrotate.conf以及/etc/logrotate.d/下的明細配置文件。python
其中/etc/logrotate.conf文件是主配置文件,/etc/logrotate.d/下的明細配置文件都會被讀入/etc/logrotate.conf進行執行,因此請注意這裏還涉及到了公有變量和私有變量。shell
logrotate的執行是由crond服務來調用的,其腳本是/etc/cron.daily/logrotate,天天自動執行。咱們能夠看一下腳本具體內容:vim
1
2
3
4
5
6
7
8
9
|
[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(也就是公有變量)。具體內容以下:ssh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[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份,多餘刪除,不計算新建日誌文件
}
|
配置文件參數說明:ide
missingok 日誌切割期間產生錯誤將被忽略(若是日誌丟失,不報錯繼續切割)工具
daily、weekly、monthly、yearly 天天、每週、每個月、每一年執行post
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上次切割日誌文件的時間
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[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服務產生的日誌自定義,做爲實驗目標
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[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
|
以後建立切割明細配置文件,並強制執行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
[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腳本實現)