Customize Log Rotation on Ubuntu : Part 1

Customize Log Rotation on Ubuntu : Part 1

Log တွေကို အချိန်တစ်ခု့သက်မှတ်ပြီး rotate လုပ်လို့ရတဲ့ service တခု့ကို sharing လုပ်ပေးသွားပါမယ်။ ဒါ့ကြောင့် demonstration အနေနဲ့ website ကို request လိုက်တဲ့အခါ မှတ်ထားတဲ့ access.log ကိုcustom path တစ်ခု့မှာသိမ်းပြီး log တွေကို rotate လုပ် တဲ့ အကြောင်းလေးကို ပြောပြသွားမှာဖြစ်ပါတယ်။

Step1:

အရင်ဆုံး nginx config ထဲမှာ

/etc/nginx/conf.d/အောက်ကဖြစ်စေ sites-available အောက်ကဖြစ်စေ config file မှာ log ကို ဘယ်နေရာမှာသိမ်းမလဲ သက်မှတ်ပေးပါမယ်။

  $mkdir /home/ubuntu/web_log

  $touch /home/ubuntu/web_log/access.log

  $sudo vim /etc/nginx/sites-available/default
access_log /home/ubuntu/web_log/access.log;
$sudo nginx -t

ဒီအဆင့်မှာ OK ရင် အောက်က command ကိုဆက် run ပါမယ်။

$sudo nginx -s reload

ဒါဆိုရင်ပထမအဆင့်ပြီးပါပြီ။

Step2:

ကိုယ့်ရဲ့ server မှာ log rotate service ရှိမရှိစစ်ကြည့်ပါမယ်။

$logrotate --version
Output
logrotate 3.14.0

    Default mail command:       /usr/bin/mail
    Default compress command:   /bin/gzip
    Default uncompress command: /bin/gunzip
    Default compress extension: .gz
    Default state file path:    /var/lib/logrotate/status
    ACL support:                yes
    SELinux support:            yes

တကယ်လို့မရှိခဲ့ဘူးဆိုရင် ဒီ command နဲ့သွင်းယူနိုင်ပါတယ်။

$sudo apt update
$sudo apt install logrotate

log rotate service ရှိသွားပြီဆိုရင် ဘယ်လို custom log rotation လုပ်ရမလဲဆိုတာစပါမယ်။ custom ဆိုတာက linux os ရဲ့ ဘယ် path မှာမဆို ကိုယ့်ရဲ့ log rotate config ကိုထားနိုင်တာလို့ generally ပြောလို့ရပါတယ်။

Ubuntu OS ရဲ့ home directory အောက်မှာ directory တစ်ခု့သက်မှတ်ပြီးfile လေးတခု့ ဆောက်လိုက်ပါမယ်။

$mkdir /home/ubuntu/logrotate
$touch /home/ubuntu/logrotate/logrotate.conf

ဒီ file မှာ log rotation config တွေရေးမှာပါ။စပြီးရေးပါမယ်။

$vim /home/ubuntu/logrotate/logrotate.conf

/home/ubuntu/web_log/access.log {
            hourly
            missingok
            rotate 24
            notifempty
            dateext
            dateformat .%Y-%m-%d-%H-%M-%S
                compress
              create 0644 ubuntu ubuntu
                sharedscripts
            postrotate
                    sudo /usr/sbin/service nginx reload > /dev/null
            endscript
}

Home directory အောက်မှာ ရှိတဲ့ web_log directory ထဲက access.log ကို rotation လုပ်ပါမယ်။

#hourly ကlog rotate ကို တနာရီတစ်ခါလုပ်ပါမယ်လို့သက်မှတ်တာပါ။

#missingok က သက်မှတ်ထားတဲ့ log file တခု့ခု့ကြောင့် error တက်ခဲ့ရင် report မလုပ်ပဲ log rotation ကိုပဲ ဆက်သွားဖို့ သက်မှတ်ထားတာပါ။

#rotate 24 ဆိုတာက rotate လုပ်ပြီးသား file ကို 24 ခု့ထားမယ်လို့ပြောတာပါ။24 ခု့ပြည့်တာနဲ့ oldest log file က expire ဖြစ်သွားပါမယ်။hourly ထားပြီး rotate 24 ထားခြင်းက log file တွေကို တရက်ပဲ သိမ်းမယ်လို့ သက်မှတ်တာနဲ့ အတူတူပဲဖြစ်ပါတယ်။

#notifempty က အကယ်၍ access.log ဆိုတဲ့ file လေးက empty ဖြစ်နေရင် log rotation မလုပ်ပါဘူးလို့သက်မှတ်ပေးတာပါ။

#dateext

#dateformat .%Y-%m-%d-%H-%M-%S

ဆိုတာကတော့ log rotate လုပ်လို့ထွက်လာတဲ့ file ကို date format ပါ ထပ်ပေါင်းပေးမယ်လို့ပြောတာပါ။ဒီလိုပုံစံမျိုးလေးဖြစ်ပါမယ်။

access.log.2023-03-14-09-59-60

#compress ကတော့ log rotate ပြီးရလာတဲ့ access.log.*date* ဆိုတဲ့ fileလေးကို gzip နဲ့ compress လုပ်ပေးဖို့သက်မှတ်လိုက်တာပါ။

access.log.2023-03-14-09-59-60.gz

#create 0644 ubuntu ubuntu
log file ကို user ubuntu group ubuntu permission 0644 နဲ့ဆောက်ပါမယ်လို့သက်မှတ်ပေးတာပါ။

#sharedscripts ကတော့ ဒီ log rotae config ထဲမှာပဲ command run မယ်လို့သက်မှတ်ပေးတာဖြစ်ပါတယ်။

#postrotate က log rotate လုပ်ပြီးမှပဲ အောက် command ကို run မယ်လို့သက်မှတ်ပေးတာပါ။

sudo /usr/sbin/service nginx reload > /dev/null

ဒီ command လေးကတော့ log rotate လုပ်ပြီးသွားလျှင် nginx service ကို reload လုပ်ပေးမှာဖြစ်ပြီး အသစ် create လုပ်ထားတဲ့ access.log file လေးထဲကို log တွေဝင်မှာဖြစ်ပါတယ်။

အခု့ configure လုပ်ထားတဲ့ log file လေးအလုပ် လုပ်ရဲ့လားစစ်ကြည့်ပါမယ်။

$logrotate /home/ubuntu/logrotate/logrotate.conf --state /home/ubuntu/logrotate/logrotate-state --verbose
Output
reading config file /home/ubuntu/logrotate/logrotate.conf

Handling 1 logs

rotating pattern: /home/ubuntu/web_log/access.log  hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/sammy/logs/access.log
  log does not need rotating

#logrotate-state ဆိုတာက log rotate service ကို ဘယ် log file မှာ နောက်ဆုံး run သွားလဲဆိုတာ မှတ်ထားပေးတာပါ။

$cat /home/ubuntu/logrotate/logrotate-state
Output
logrotate state -- version 2
"/home/ubuntu/web_log/access.log" 2023-03-14-19:0:0

ဒါက log rotate ကို ဘယ်အချိန်မှာ runလဲ မှတ်ထားပေးပြီး

log rotate service ကို force ပေးပြီး ထပ် run ခြင်တယ်ဆိုရင်တော့ဒီ command လေးသုံးလို့ရပါတယ်။

$logrotate /home/ubuntu/logrotate/logrotate.conf --state /home/ubuntu/logrotate/logrotate-state --verbose --force

Step3:

နောက်ဆုံးအဆင့်အနေနဲ့ cron job သက်မှတ်ထားပေးပြီး log rotate service ကို တစ်နာရီ တစ်ကြိမ် run နေအောင်သက်မှတ်ပေးပါမယ်။

$crontab -e
1 * * * * /usr/sbin/logrotate /home/ubuntu/logrotate/logrotate.conf --state /home/ubuntu/logrotate/logrotate-state

နာရီတိုင်းရဲ့ 1 min မှာ log rotate service run မယ်လို့သက်မှတ်ပေးတာဖြစ်ပါတယ်။