logrotate
logrotate簡介
logrotate簡介
logrorare一定程度上可以簡化對會生成大量日志文件的系統的管理。logrotate可以實現自動輪替、刪除、壓縮和mail日志的功能。
執行命令
logrotate [-dv] [-f|--force] [-s|--state statefile] config_file ..
logrotate [-dv] [-f|--force] [-s|--state statefile] config_file ..
選項
# logrotate --help
Usage: logrotate [OPTION...] <configfile>
-d, --debug Don't do anything, just test (implies -v) 不做實際處理,僅調試
-f, --force Force file rotation 強制執行,忽視參數要求
-m, --mail=command Command to send mail (instead of `/bin/mail') 發送mail
-s, --state=statefile Path of state file 查看狀態文件
-v, --verbose Display messages during rotation 輪替一次,並顯示輪替過程信息
--version Display version information 顯示logrotate版本
# logrotate --help
Usage: logrotate [OPTION...] <configfile>
-d, --debug Don't do anything, just test (implies -v) 不做實際處理,僅調試
-f, --force Force file rotation 強制執行,忽視參數要求
-m, --mail=command Command to send mail (instead of `/bin/mail') 發送mail
-s, --state=statefile Path of state file 查看狀態文件
-v, --verbose Display messages during rotation 輪替一次,並顯示輪替過程信息
--version Display version information 顯示logrotate版本
Help options:
-?, --help Show this help message
--usage Display brief usage message
-?, --help Show this help message
--usage Display brief usage message
配置文件
/etc/logrotate.conf
/etc/logrotate.d
/etc/logrotate.conf
/etc/logrotate.d
logrotate.conf是主要的參數文件,至於logrotate.d是一個目錄,該目錄里面的所有文件都會被logrotate.conf文件主動讀入,若logrotate.d/里的文件沒有指定詳細設置,則以/etc/logrotate.conf這個文件里配置的默認值為准。
/etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly 每周輪替一次
weekly
/etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly 每周輪替一次
weekly
# keep 4 weeks worth of backlogs 保留4個輪替日志
rotate 4
rotate 4
# create new (empty) log files after rotating old ones 輪替后創建新的日志文件
create
create
# use date as a suffix of the rotated file 使用時間作為輪替文件的后綴
dateext
dateext
# uncomment this if you want your log files compressed 如果需要壓縮日志,去除注釋
#compress
#compress
# RPM packages drop log rotation information into this directory 讓/etc/logrotate.d目錄下面配置文件內容參與輪替
include /etc/logrotate.d
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp { #輪替對象為/var/log/中的wtmp文件
monthly #每個月輪替一次
create 0664 root utmp #創建新的日志文件 權限 所屬用戶 所屬組
minsize 1M #日志大小大於1M后才能參與輪替
rotate 1 #保留一個輪替日志文件
}
/var/log/wtmp { #輪替對象為/var/log/中的wtmp文件
monthly #每個月輪替一次
create 0664 root utmp #創建新的日志文件 權限 所屬用戶 所屬組
minsize 1M #日志大小大於1M后才能參與輪替
rotate 1 #保留一個輪替日志文件
}
/var/log/btmp {
missingok #如果日志文件不存在,繼續進行下一個操作,不報錯
monthly
create 0600 root utmp
rotate 1
}
missingok #如果日志文件不存在,繼續進行下一個操作,不報錯
monthly
create 0600 root utmp
rotate 1
}
/etc/logrotate.d
/etc/logrotate.d如上面說到的,在logrotate配置中扮演一個目錄的角色,通過logrotate.conf中的配置include /etc/logrotate.d將/etc/logrotate.d目錄包含進來,即將該目錄下的文件內容加入到輪替任務中。
這里先簡單介紹一下該目錄下的文件內容及其格式,后面再對具體案例進行分析。
格式
日志文件路徑 ...{ #多個文件絕對路徑路徑可以用空格、換行分隔,
參數配置
}
/etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler #作用域:/var/log/目錄下的cron、maillog、messages、secure和spooler文件
{
missingok
sharedscripts #作用域下文件存在至少有一個滿足輪替條件的時候,完成輪替后執行一次postrotate內的腳本。
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler #作用域:/var/log/目錄下的cron、maillog、messages、secure和spooler文件
{
missingok
sharedscripts #作用域下文件存在至少有一個滿足輪替條件的時候,完成輪替后執行一次postrotate內的腳本。
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
常用參數
參數
描述
描述
daily
每天輪替一次
weekly
每周輪替一次
monthly
每月輪替一次
yearly
每年輪替一次
rotate
保留幾個輪替日志文件
ifempty
不論日志是否空,都進行輪替
notifempty
若日志為空,則不進行輪替
create
舊日志文件輪替后創建新的日志文件
size
日志達到多少后進行rotate
minsize
文件容量一定要超過多少后才進行rotate
nocompress
輪替但不進行壓縮
compress
壓縮輪替文件
dateext
輪替舊日志文件時,文件名添加-%Y %m %d形式日期,可用dateformat選項擴展配置。
nodateext
舊日志文件不使用dateext擴展名,后面序數自增如"*.log.1"
dateformat
只允許%Y %m %d和%s指定符。注意:系統時鍾需要設置到2001-09-09之后,%s才可以正確工作
sharedscripts
作用域下文件存在至少有一個滿足輪替條件的時候,執行一次prerotate腳本和postrotate腳本。
prerotate/endscript
在輪替之前執行之間的命令,prerotate與endscript成對出現。
postrotate/endscript
在輪替之后執行之間的命令,postrotate與endscript成對出現。
olddir
將輪替的文件移至指定目錄下
missingok
如果日志文件不存在,繼續進行下一個操作,不報錯
舉個自定義的例子
#/etc/logrotate.d/test
/test/log/*.log{
daily
rotate 2
size 1M
create
compress
missingok
dateext
olddir /test/rotate
}
#/etc/logrotate.d/test
/test/log/*.log{
daily
rotate 2
size 1M
create
compress
missingok
dateext
olddir /test/rotate
}
每天對/test/log/目錄下后綴為“.log”的且大小超過1MB的文件進行輪替,文件后綴為”-20171124“。壓縮輪替后的文件,並將該文件移到”/test/rotate“目錄下,一個原日志文件最多僅有2個對應輪替日志文件,若輪替日志大於設定的值則刪除之前較早的輪替日志文件。創建新的日志文件。若/test/log/目錄下文件名以”.log“結尾的文件不存在,不報錯。
回到之前的話題,磁盤被日志撐滿的話題,參考參數列表,我們會發現logrotate提供的輪替周期參數只能精確到天,以一天為輪替周期在一些情況下並不能滿足我們的要求,這個時候該怎么辦呢?
----這里可以搭配crontab(例行性工作),通過定時任務來執行logrotate命令,從而在不同情況實現對logrotate任務的自定義頻率調用。
例行性工作的簡單配置使用
cron執行時會讀取/etc/cron.d這個目錄的所有文件,按照文件中的設置來定時執行任務。該目錄下新增的文件后,無需再重啟crond服務。這里只簡單地介紹該種定時任務配置。
#格式
*(分鍾) *(小時) *(天) *(月) *(周幾) 用戶 命令
# 若分鍾位值為 *,表示0-59之間的任意有效值;
# 若分鍾位值為 1,表示每小時的第1分鍾;
# 若分鍾位值為 */5,表示每5分鍾
# 若分鍾位值為10,20 表示每小時的第10分鍾和第20分鍾
# 若分鍾位值為10-12 表示每小時的第10、11、12分鍾
例行性工作的簡單配置使用
cron執行時會讀取/etc/cron.d這個目錄的所有文件,按照文件中的設置來定時執行任務。該目錄下新增的文件后,無需再重啟crond服務。這里只簡單地介紹該種定時任務配置。
#格式
*(分鍾) *(小時) *(天) *(月) *(周幾) 用戶 命令
# 若分鍾位值為 *,表示0-59之間的任意有效值;
# 若分鍾位值為 1,表示每小時的第1分鍾;
# 若分鍾位值為 */5,表示每5分鍾
# 若分鍾位值為10,20 表示每小時的第10分鍾和第20分鍾
# 若分鍾位值為10-12 表示每小時的第10、11、12分鍾
#/etc/cron.d/cron_test
* */1 * * * root /usr/sbin/logrotate -v /etc/logrotate.d/test
* */1 * * * root /usr/sbin/logrotate -v /etc/logrotate.d/test
每小時root用戶會調用logrotate讀取/etc/logrotate.d/test配置,執行一次。
# rotate log files monthly
monthly
monthly
# keep 4 weeks worth of backlogs
rotate 12
rotate 12
# create new (empty) log files after rotating old ones
create
create
# use date as a suffix of the rotated file
dateext
dateext
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
include /etc/logrotate.d
# no packages own wtmp and btmp ... -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 12
}
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 12
}
/var/log/btmp {
monthly
create 0600 root utmp
rotate 12
}
monthly
create 0600 root utmp
rotate 12
}
/var/log/messages {
monthly
create 0600 root utmp
rotate 12
}
monthly
create 0600 root utmp
rotate 12
}
/var/log/secure {
monthly
create 0600 root utmp
rotate 12
}
monthly
create 0600 root utmp
rotate 12
}
/var/log/maillog {
monthly
create 0600 root utmp
rotate 12
}
monthly
create 0600 root utmp
rotate 12
}
# system-specific logs may be also be configured here.
下面自己定義文件 在 crontab 定時每周一強制轉存
#/etc/logrotate.d/log_cron (文件名log_cron)
* * * * 1 /usr/sbin/logrotate -fv /etc/logrotate.d/log_cron
#/etc/logrotate.d/log_cron (文件名log_cron)
* * * * 1 /usr/sbin/logrotate -fv /etc/logrotate.d/log_cron
/var/log/wtmp {
monthly
dateext
create 0664 root utmp
rotate 12
}
monthly
dateext
create 0664 root utmp
rotate 12
}
/var/log/btmp {
monthly
dateext
create 0600 root utmp
rotate 12
}
monthly
dateext
create 0600 root utmp
rotate 12
}
/var/log/messages {
monthly
dateext
create 0600 root utmp
rotate 12
}
monthly
dateext
create 0600 root utmp
rotate 12
}
/var/log/secure {
monthly
dateext
create 0600 root utmp
rotate 12
}
monthly
dateext
create 0600 root utmp
rotate 12
}
/var/log/maillog {
monthly
dateext
create 0600 root utmp
rotate 12
}
monthly
dateext
create 0600 root utmp
rotate 12
}