Sunday 19 May 2013

LogRotate - a migical tool

1. Intro:
Gần đây cứ khoản 0h là tụi SDK monitor cứ gọi điện thoại thông báo service down. WTF. Cứ như zậy mấy ngày liên tiếp làm an không ngon ngủ không yên gì hết. Check lại thì do cái logrote config của một sư huynh khác bị lỗi. Lò mò loay hoay cặm cụi đọc đọc check hoài nên hôm nay ghi lại cho nhớ. Link source: http://www.rackspace.com/knowledge_center/article/understanding-logrotate-part-1

2. Logrotate la gì?
Cái tên nói lên tất cả rồi, logrotate tất nhiên là dùng để rotate log, sử dụng nhằm cho file log không có phình quá to (đơn giản là zậy). Ah, giải thích thếm, rotate có nghĩa là tạo ra một file log mới, xóa file log cũ đi hoặc nén nó lại đem đi cất đâu đó.

3. How it works?
System thực hiện rotate log một cách định kì, tất nhiên việc định kì đó là do sysadmin quyết định, đó có thể là hàng giờ, ngày, tuần, tháng... Khi logrotate thực hiện nó sẽ đọc file main config của nó /etc/logrotate.conf

File config này có samples cơ bản mà ta có thể chỉnh sửa một chút lại và xài luôn. Đây là logrotate.conf trên server CentOS nhá:
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# 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
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
minsize 1M
    rotate 1
}
/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}
# system-specific logs may be also be configured here.

Các option sẽ được giải thích rõ hơn phía sau. Chú ý dòng include /etc/logrotate.d => Đây là folder sẽ chứa file config cho từng application xác định. Ok. Bây giờ ta sẽ đi chi tiết hơn.

Log files: là các file sẽ được logrotate thực hiện trên chúng. Các option, command nằm trong dấu { } đi theo sau các log file. Chúng ta cũng có thể sử dụng wildcard cho chúng. vd: /var/foo/*.log logrotate sẽ tìm tất cả các file có đuôi là .log trong thư mục /var/foo để thực thiện rotate log.
/var/foo/*.log /var/bar/log.txt {
        ...
        ...
}

Rotate count: xác định bao nhiêu file log được rotate trước đó được giữ lại trước khi thực hiện việc rotate mới, xóa cái cũ đi.
rotate 4 => chỉ có 4 file log được logrotate giữ lại, cái cũ nhất sẽ được xóa đi.

Rotation interval: xác định mức độ thường xuyên của việc thực hiện logrotate.
daily
weekly
monthly
yearly
Nếu rotation interval không được khai báo thì file log sẽ được rotate mỗi khi logrotate chạy.

Size: chỉ rõ kích thước mà logrotate sẽ thực hiện việc kiểm tra xác định có thực hiện hay không việc rotate file đó.
size 100M

File logs sẽ được rotate nếu size của file đó lớn hơn 100M. Nếu cả size và rotate interval được set, thì size sẽ có ưu tiên cao hơn.

Compression: logfile sẽ được nén lại theo format gzip (đây là dạng default, nếu muốn tìm hiểu thêm thì "man logrotate")
compress => compress file
nocompress => not compress
delaycompress => sẽ compress file nhưng sẽ không thực hiện ngay bây giờ, mà sẽ được thực hiện vào lần chạy logrotate tiếp theo
(delaycompress là một option của compress, nó phải được đi chung với câu lệnh compress)


Postprotate: postprotate script sẽ được thực thi sau mỗi lần nó rotate một file log được chỉ định trong file config. Chúng ta thường restart lại ứng dụng sau khi thực hiện rotate để ứng dụng có thể chuyển qua file log mới.
postrotate
    /usr/sbin/apachectl restart > /dev/null
endscript


Preprotate: preprotate script sẽ được thực thi trước khi nó thực hiện rotate log. Cả postprotate và prerotate đều phải đi chung vơi endscript.

Sharedscripts: Bình thường logrotate sẽ chạy postprotate scripts mỗi một file log được rotate. vd: trong trường hợp sử dụng /var/foo/*.log như ở trên, có bao nhiêu file .log thì sẽ có bao nhiêu làn script được thực thi. Để tránh trường hợp đó, ta có thể sử dụng command "sharedscripts"



4. Testing and debuging

-v : verbose, hiện ra logrotate đang thực hiện những gì, rất giúp ích khi tìm ra tại sao logrotate khong rotate file log nào đó như mình muốn.
-d: debug, hiện ra những những bước việc thực hiện rotate log nhung không thực sự rotate nó.  
-f: force, bắt buộc logrotate thực hiện rotate tất cả các log, dù có cần thực hiện rotate lúc đó hay không.

Mỗi khi thực hiện rotate xong, logrotate sẽ ghi nhớ các file log lần cuối được nó rotate vào một file /var/lib/logrotate.status