Tôi có nhật ký theo định dạng sau: YYYYMMDD
Tôi muốn nén các bản ghi cũ (cũ hơn ngày hiện tại) và có thể chuyển chúng sang một thư mục khác sau đó.
Tôi có thể làm điều này trong logrotate hay tôi phải sử dụng tập lệnh tùy chỉnh trong cron?
Tôi có nhật ký theo định dạng sau: YYYYMMDD
Tôi muốn nén các bản ghi cũ (cũ hơn ngày hiện tại) và có thể chuyển chúng sang một thư mục khác sau đó.
Tôi có thể làm điều này trong logrotate hay tôi phải sử dụng tập lệnh tùy chỉnh trong cron?
Câu trả lời:
Đây là một kịch bản quickie sẽ làm những gì bạn cần:
#!/bin/bash
LOGDIR=/var/log/somedir
OLDLOGS=/var/log/keep-old-logs-here
PATH=/bin:$PATH
TODAY=$(date +'%Y%m%d')
[ -d $OLDLOGS ] || mkdir -p $OLDLOGS
cd $LOGDIR
for LOG in $(ls | egrep '^[[:digit:]]{8}$'); do
[ $LOG -lt $TODAY ] && gzip $LOG && mv $LOG.gz
done
Làm cho tập lệnh thực thi:
$ chmod +x /where/you/put/this/script
Mục crontab sẽ trông như sau:
30 0 * * * /where/you/put/this/script
Chỉ cần điều chỉnh LOGDIR
và OLDLOGDIR
. Vào lúc 12:30 sáng, nó sẽ di chuyển tất cả các bản ghi theo định dạng của YYYYMMDD cho các ngày trước đó (và trước đó, nếu có).
nodateext
, olddir
, compress
, và daily
các tùy chọn.
logrotate có thể làm điều đó với olddir nếu tên tệp nhật ký của bạn giống nhau mỗi lần nó chạy và bạn có thể thêm ngày. Nếu tên tệp nhật ký của bạn thay đổi, tức là YYYYMMDD thì logrotate sẽ không làm điều đó cho bạn.
# sample logrotate conf file
copytruncate
compress
dateformat %Y%m%d.
dateext
extension log
olddir ./logarchive
/logs/sys.log {
rotate 7
daily
}
Bản sao và gzips /logs/sys.log thành /logs/logarchive/sys.20120101.log.gz, giữ nhật ký trị giá một tuần.