๐ง Linux Logrotate ้ฒ้ๆป็ฅ:ๆๅๆฅ่ชๅๅฒ、ๅฃ็ธฎ、่ผชๆฟ่ๅธธ่ฆ้ฏ่ชคๆๆฅ
Linux ็ณป็ตฑไธญ็ๆฅ่ชๆ้จ่ๆๅ้ไฝไธๆทๆ้ท,่ฅๆฒๆๅฆฅๅ็ฎก็,ๅฎนๆ้ ๆ:
- ็ฃ็ข็ฉบ้่ขซๅๆปฟ(ๅฐคๅ ถ /var/log)
- ็ณป็ตฑๆ่ฝไธ้
- ็กๆณ่ฟฝ่นค่ๆฅ่ช
Logrotate ๆฏ Linux ๅ งๅปบ็ๆฅ่ช่ผชๆฟๅทฅๅ ท,ๅฏ่ชๅๅท่กไปฅไธๅไฝ:
- ๆฅ่ชๅๅฒ(rotation)
- ๅฃ็ธฎ(gzip)
- ไฟ็็นๅฎไปฝๆธ
- ้ๅๆๅ้ๆฐๅฏซๅ ฅๆฅ่ช
- ๅช้ค้่็ๆชๆก
ๆฌ็ฏๅฐ็จๆๅฎๆดๆนๅผไป็ดน Logrotate ็ไฝฟ็จ、้ ็ฝฎ่ๅธธ่ฆๅ้กๆๆฅ。
๐ ไธ、Logrotate ็้ไฝๆนๅผ
Logrotate ็้ ็ฝฎๅๆๅ ฉ้จๅ:
/etc/logrotate.conf:ไธป่จญๅฎๆช/etc/logrotate.d/*:ๆๅๅ่ช็่จญๅฎ
ๅคงๅคๆธๆๅ้ฝๆๅจ logrotate.d ่ฃกๆพ่ชๅทฑ็่ฆๅ,ไพๅฆ:
/etc/logrotate.d/nginx /etc/logrotate.d/mysql /etc/logrotate.d/rsyslog
Logrotate ้ๅธธ็ฑ cron.daily ๆ systemd timer ้ฉ ๅ:
systemctl status logrotate.timer
๐ ไบ、ๆฅ็ Logrotate ไปๅคฉๆๆฒๆๅท่ก
ๅฏไปฅๆฅ็ logrotate ็ log:
cat /var/lib/logrotate/logrotate.status
ๆๆๅๅท่กไธๆฌก:
sudo logrotate -f /etc/logrotate.conf
๐ ไธ、็ฏไพ:่ช่จๆๅ็ Logrotate ่จญๅฎ
1️⃣ ๅบ็ค็็ฏไพ(ๆๅธธ็จ)
/var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
}
่งฃ้:
- daily:ๆฏๅคฉๅๅฒไธๆฌก
- rotate 14:ไฟ็ 14 ๅคฉ
- compress:่ๆฅ่ช่ชๅ gzip
- missingok:ๆฅ่ชไธๅญๅจไนไธๅ ฑ้ฏ
- notifempty:็ฉบๆชๆกไธ่ผชๆฟ
๐ ๅ、้ฒ้:้ๆฐๅๅๆๅ(postrotate)
ๆไบๆๅๅจๆฅ่ชๅๅฒๅพๅฟ ้ ้ๆฐ่ผๅ ฅๆๆ็นผ็บๅฏซๅ ฅๆฐ็ๆชๆก(ไพๅฆ Nginx)。
/var/log/nginx/*.log {
daily
rotate 7
missingok
compress
sharedscripts
postrotate
[ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript
}
ๆญค็ฏไพไธญ,Logrotate ๅๅฒๆฅ่ชๅพๆ้็ฅ Nginx ้ๆฐ้ๅ log。
๐ ไบ、้ฒ้่จญๅฎ:้ๅถๆๅคงๆชๆกๅคงๅฐ
่ฅไฝ ๅธๆๆฅ่ชๅช่ฆ่ถ ้ไธๅฎๅคงๅฐๅฐฑ่ผชๆฟ,่ไธๆฏ็ๆฅๆ,ๅฏไปฅไฝฟ็จ:
size 100M
็ฏไพ:
/var/log/myapp/app.log {
size 100M
rotate 5
compress
}
๐ ๅ ญ、้ฒ้่จญๅฎ:copytruncate vs USR1 reload
| ๆนๅผ | ่ก็บ | ้ฉ็จๆ ๅข |
|---|---|---|
| copytruncate | ่ค่ฃฝๅพๆธ ็ฉบๅๆชๆก | ไธๆฏๆด USR1 / reload ็ๆๅ(้จๅ App) |
| postrotate + reload | ๅ่จดๆๅ้ๆฐ้ๅ log | Nginx、Apache、MySQL、systemd ๆๅ |
๐ ไธ、Logrotate ๅธธ่ฆ้ฏ่ชค่ๆๆฅๆนๅผ
❗ 1. "error: skipping log … because parent directory has insecure permissions"
ๅๅ :็ฎ้ๆฌ้ๅคช้ๆพ,ไพๅฆ 777。
chmod 755 /var/log/myapp
❗ 2. Logrotate ๅฎๅ จๆฒๆๅท่ก
ๆชขๆฅ timer:
systemctl status logrotate.timer
่ฅ้้:
systemctl enable --now logrotate.timer
❗ 3. ๅๅฒๅพๆฅ่ชๆฒๆดๆฐ(ๆๅธธ่ฆ)
ๅๅ :ๆๅๆช reload。
่งฃๆณ:
postrotate
systemctl reload nginx
endscript
❗ 4. “gzip: stdin: file size changed”
ๅๅ :ๆๅๆ็บๅฏซๅ ฅๆฅ่ช。
่งฃๆณ:ๆน็จ copytruncate
❗ 5. logrotate.status ่จ้ๆๆฏ
rm /var/lib/logrotate/logrotate.status logrotate -f /etc/logrotate.conf
๐ ๅ ซ、ๅฐๆฅญ็ด Logrotate ่จญๅฎๆจกๆฟ(ๅฏ็ดๆฅๅฅ็จ)
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
dateext
dateformat -%Y%m%d
create 0640 root adm
sharedscripts
postrotate
systemctl reload myapp.service >/dev/null 2>&1 || true
endscript
}
่ชชๆ:
- delaycompress:้ไธๅคฉๅๅฃ็ธฎ,้ฟๅ ๆๅ้ๅจๅฏซๅ ฅ
- dateext:ไฝฟ็จๆฅๆ็บๅฏๆชๅ
- create:่ชๅๅปบ็ซๆฐ log
- postrotate:่ผชๆฟๅพ้ๅๆๅ
๐ ไน、็ต่ซ:Logrotate ๆไฝณๅฏฆๅ
- ✔ ๆฏๅๆๅๆๆ่ชๅทฑ็ logrotate ่จญๅฎ
- ✔ Nginx / Apache / MySQL ๅฟ ้ reload log
- ✔ /var/log ๅปบ่ญฐๅฎๆ็ฃๆงๅคงๅฐ
- ✔ ้ฟๅ ไฝฟ็จ 777 ๆฌ้,ๆ่ฎ logrotate ๅคฑๆ
- ✔ ๅปบ่ญฐๆญ้ systemd timer(ๆด็ฉฉๅฎ)
- ✔ ไผๆฅญ็ฐๅขๅปบ่ญฐไฝฟ็จ dateext + delaycompress
ๅฎๆดๆๆก Logrotate ไนๅพ,ไฝ ๅฏไปฅๆๆ็ฎก็ๅคง้ๆๅๆฅ่ช,้ฟๅ ็ฃ็ข่ขซๅกๆปฟ,่ฎ็ณป็ตฑ้ไฝๆดๅฎๅ จ、ๆด็ฉฉๅฎ。
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ