๐ง Linux systemd + logrotate ๅฏฆๆฐ:ๅพ้ๆฉๆๅๅฐๆฅ่ช่ผชๆฟ็ไธๆข้พ็ฎก็
ๅจ็พไปฃ Linux ไผบๆๅจไธ,ๆๅๅคๅไฝฟ็จ systemd ไพ็ฎก็ๆๅๅๅ、็ฃๆง็ๆ
่่ชๅ้ๅ,
ๅๆ็จ logrotate ไพ่็ /var/log/*.log ็่ผชๆฟ่ๅฃ็ธฎ。
ๅฆๆๅ
ฉ่
ๆฒๆ่จญ่จๅฅฝ,ๅฐฑๆ้ๅฐ「ๆๅ่ทๅพๅฅฝๅฅฝ็,ไฝๆฅ่ช็ก้้ทๅคง、ๅๆปฟ็ฃ็ข」็ๆ
ๆณ。
ๆฌ็ฏๅพ ็ฏไพๆๅ ้ๅง,ไธ่ทฏๅๅฐ ้ๆฉ่ชๅๅๅ + ๆจๆบๅ่ผธๅบ + logrotate ๆฅ่ช่ผชๆฟ + systemd timer ่ชๅๆ็จ,
็ตฆไฝ ไธๅฅๅฏไปฅ็ดๆฅ่ค่ฃฝ็「ไธๆข้พ」็ฎก็ๆต็จ。
๐ ็ฎ้
- ไธ、ไฝฟ็จๆ ๅข่่จญ่จ็ฎๆจ
- ไบ、ๅบ็ค่งๅฟต:systemd ๆฅ่ช vs ๅณ็ตฑ log ๆช
- ไธ、ๅฏฆไฝ็ฏไพๆๅ:ๅพ systemd ้ๆฉๅๅ้ๅง
- ๅ、่ฎๆๅ่ผธๅบๅฐๅฐๅฑฌ log ๆช
- ไบ、ๆฐๅฏซ logrotate ่ฆๅ:ไฟ็ๅคฉๆธ、ๅฃ็ธฎ่ๆฌ้
- ๅ ญ、่ systemd ไธฒๆฅ:postrotate ้ๆฐ้ๅๆฅ่ช
- ไธ、็จ systemd timer ็ฎก็ logrotate(ๅไปฃ cron)
- ๅ ซ、ๅธธ่ฆ้ฏ่ชค่ๆ้ฏๆนๆณ
- ไน、ๅฏฆๆฐๆ ๅข็ฏไพ:Web App / Nginx / Squid
- ๐งญ ่กๅๆธ ๅฎ:ๅจ่ชๅทฑไธปๆฉไธ่ฝๅฐ้ๅฅๆต็จ
- ๐ ๅปถไผธ้ฑ่ฎ
ไธ、ไฝฟ็จๆ ๅข่่จญ่จ็ฎๆจ
ๅ ๅฎ็พฉๆๅ่ฆ่งฃๆฑบ็ๅ ธๅๆ ๅข:
- ไฝ ๆไธๅ่ช่ฃฝ็ Web / API / Worker ๆๅ,ไฝฟ็จ
systemd็ฎก็้ๆฉๅๅ่่ชๅ้ๅ。 - ๆๅๆ่ผธๅบๅคง้
stdout/stderrๆฅ่ชๆๅฏซๅ ฅๆๅ/var/log/myapp.log。 - ๅธๆ:
- ๐ ๆๅ้ๆฉ่ชๅๅๅ,็ฐๅธธ่ชๅ้ๅ。
- ๐ ๆฅ่ชๆๅคฉๆๆๆชๆกๅคงๅฐ่ผชๆฟ、ๅฃ็ธฎ,ๅชไฟ็ๆ่ฟ N ไปฝ。
- ๐ ๆฅ่ช่ผชๆฟๅพ,ๆๅ่ฝ「ๆฅๅจๆฐๆชๆกไธ็นผ็บๅฏซ」,ไธไธญๆทๆๅ。
ๆฅไธไพ็็คบ็ฏๆ็จไธๅๅ็บ myapp ็ๆๅไพ่ชชๆ,ไฝไฝ ๅฏไปฅๅพๅฎนๆๆนๆ่ชๅทฑ็ๅฐๆกๅ็จฑ。
ไบ、ๅบ็ค่งๅฟต:systemd ๆฅ่ช vs ๅณ็ตฑ log ๆช
1️⃣ systemd journal:้ ่จญๅฐฑๆ็ๆฅ่ช
- ๅคง้จๅๆๅๅจ systemd ไนไธ,้ ่จญ ๆจๆบ่ผธๅบ/้ฏ่ชค ้ฝๆ้ฒๅ ฅ journald。
- ๅฏ็จ
journalctl -u myapp.service -fๅณๆๆฅ็。 - journal ่ชๅทฑๆ่ผชๆฟๆฉๅถ,้้
/etc/systemd/journald.conf่จญๅฎSystemMaxUse็ญ้ๅถ。
# ๅช็ myapp ๆๅ็ๆ่ฟ 100 ่กๆฅ่ช
journalctl -u myapp.service -n 100
# ่ฟฝ่นค myapp ๅณๆ่ผธๅบ
journalctl -u myapp.service -f
2️⃣ ๅณ็ตฑ log ๆช:/var/log/*.log
- ๅพๅค็จๅผ(Nginx、Squid、่ช่ฃฝ App)ๆ่ชๅทฑๅฏซๅฐ
/var/log/xxx.log。 - ้้กๆชๆก้ๅธธ็จ logrotate ๅ่ผชๆฟ่ๅฃ็ธฎ。
- ่ผชๆฟๆนๅผๅธธ่ฆ:
- ไปฅ ๅคงๅฐ ็บไธป:
size 100M。 - ไปฅ ๆ้ ็บไธป:
daily/weekly。
- ไปฅ ๅคงๅฐ ็บไธป:
# logrotate ไธป่จญๅฎๆช
/etc/logrotate.conf
# ๅๆๅ็ๅฎ็จ่จญๅฎ
/etc/logrotate.d/
ๆฌๆ็็ญ็ฅๆๆฏ:
้็ผไธญ / ้ค้ฏ → ไปฅ journalctl ็บไธป;
ๆญฃๅผ็ฐๅข / ้ทๆไฟ็ → ่ฎๆๅๅฏซๅฐ็นๅฎ log ๆช,ๅไบค็ตฆ logrotate ็ฎก็ๅฎน้。
ไธ、ๅฏฆไฝ็ฏไพๆๅ:ๅพ systemd ้ๆฉๅๅ้ๅง
ๅ ๅปบ็ซไธๅ็ฐกๅฎ็ๆๅ,ๆ็บ่ผธๅบๆ้ๆณ่จ่่จๆฏๅฐๆจๆบ่ผธๅบ:
# /usr/local/bin/myapp.sh
#!/usr/bin/env bash
LOG_TAG="myapp"
INTERVAL=5
while true; do
echo "$(date '+%F %T') [$LOG_TAG] heartbeat: service is running"
sleep "$INTERVAL"
done
sudo chmod +x /usr/local/bin/myapp.sh
ๆฅ่ๅปบ็ซ systemd service:
# /etc/systemd/system/myapp.service
[Unit]
Description=MyApp Demo Service (journal only)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapp.sh
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
sudo systemctl status myapp.service
journalctl -u myapp.service -f
ๅฐ้่ฃก,ๆๅๅทฒ็ถๅฎๆ:
- ✅ ้ๆฉ่ชๅๅๅ่็ฐๅธธ่ชๅ้ๅ(้ systemd)。
- ✅ ๆฅ่ช้ฒๅ ฅ journal,ไพฟๆผ้ค้ฏ่ๅณๆ่ฟฝ่นค。
ๅ、่ฎๆๅ่ผธๅบๅฐๅฐๅฑฌ log ๆช
่ฅไฝ ๆณ่ฎๆฅ่ชไบค็ตฆ logrotate ็ฎก็,ๅฏไปฅ:
- ๅจ service ่ฃก็ดๆฅๆ่ผธๅบๅฐๅๆชๆก。
- ๆๅจ็จๅผๅ ง่ช่กๆ้ๆชๆก(็ฏไพๆก็จ็ฌฌ 1 ็จฎ)。
1️⃣ ๅปบ็ซๆฅ่ช็ฎ้่ๆฌ้
sudo mkdir -p /var/log/myapp
sudo chown root:root /var/log/myapp
sudo chmod 750 /var/log/myapp
2️⃣ ๆดๆฐ service:ๆ่ผธๅบๅฐๅๆชๆก
ๅๆณไธ:็ดๆฅๅจ ExecStart ๅ
งไฝฟ็จ bash -c ่ฝๅ(็ฐกๅฎๅฅฝ็่งฃ):
# /etc/systemd/system/myapp.service
[Unit]
Description=MyApp Demo Service (file logging)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'exec /usr/local/bin/myapp.sh >> /var/log/myapp/myapp.log 2>> /var/log/myapp/myapp.err.log'
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl restart myapp.service
tail -n 20 /var/log/myapp/myapp.log
ๅฐ้่ฃก็บๆญข,ๆๅๅทฒ็ถๆไธๅ:
- ✅ ้ๆฉ่ชๅๅๅ็ systemd ๆๅ。
- ✅ ๆๅฏซๅ
ฅ
/var/log/myapp/myapp.log่myapp.err.log็ๆฅ่ชๆช。
ไบ、ๆฐๅฏซ logrotate ่ฆๅ:ไฟ็ๅคฉๆธ、ๅฃ็ธฎ่ๆฌ้
ๆฅไธไพ่ฎ logrotate ็ฎก็้ๅ ฉๅๆชๆก็ๅคงๅฐ่ไฟ็ไปฝๆธ。
1️⃣ ๅปบ็ซ /etc/logrotate.d/myapp
sudo vi /etc/logrotate.d/myapp
/var/log/myapp/myapp.log
/var/log/myapp/myapp.err.log {
daily # ๆฏๅคฉ่ผชไธๆฌก
rotate 14 # ไฟ็ 14 ไปฝ(็ดๅ
ฉ้ฑ)
compress # ่ฝๆ .gz
delaycompress # ไธไธๆฌก่ผชๆฟๆๅๅฃ็ธฎไธไธไปฝ
missingok # ไธๅจๆๅฟฝ็ฅ,ไธ่ฆ็บ้ฏ่ชค
notifempty # ็ฉบๆชๆกไธ่ผชๆฟ
create 640 root root
dateext # ๆชๅๅ ๆฅๆ,ๆนไพฟ่ฟฝ่นค
}
ๅ ็จ「ๆจกๆฌๆจกๅผ」็ขบ่ช่ชๆณๆฏๅฆๆญฃ็ขบ:
sudo logrotate -d /etc/logrotate.d/myapp
่ฅๆฒๆ้ฏ่ชค,ๅๅผทๅถ่ทไธๆฌกๆธฌ่ฉฆ่ผชๆฟ:
sudo logrotate -f /etc/logrotate.d/myapp
ls -l /var/log/myapp
ๆญคๆไฝ ๆ็ๅฐ้กไผผ:
myapp.log
myapp.log-20251116
myapp.err.log
myapp.err.log-20251116.gz
ๆณจๆ: ้็จฎๆ ๆณไธ,ๅฆๆ็จๅผๆ็บๅท่ก,่ไธๆฒๆ้ๆฐ้ๅ log ๆช, ๅฎๅฏ่ฝไป็ถๅฏซๅจ「ๅทฒ่ขซ่ผชๆฟๅพ็่ๆชๆก」ไธ。ไธไธ็ฏๆไป็ดนๅฆไฝ่ฎ systemd ๅนซๅฟ「้็ฅๆๅ」。
ๅ ญ、่ systemd ไธฒๆฅ:postrotate ้ๆฐ้ๅๆฅ่ช
ๅ ธๅๅๆณๆๅ ฉ็จฎ:
- ็จๅผๆฌ่บซๆฏๆด USR1 / HUP ็ญ่จ่ไพ้ๆฐ้ๅ log。
- ๅจ่ผชๆฟๅพ ้ๆฐๅๅๆๅ(้ฉ็จๆผๅฏ็ญๆซไธญๆท็ๆๅ)。
1️⃣ ่ฅ็จๅผๆฏๆด่จ่(ๆจ่ฆ)
ๅ่จญ myapp ๆถๅฐ SIGUSR1 ๆๆ้ๆฐ้ๅ log ๆช,ๆๅๅฏไปฅ้ๆจฃๅฏซ:
/var/log/myapp/myapp.log
/var/log/myapp/myapp.err.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 640 root root
dateext
sharedscripts
postrotate
# ่ซๆนๆไฝ ็ service ๅ็จฑ
systemctl kill -s SIGUSR1 myapp.service >/dev/null 2>&1 || true
endscript
}
2️⃣ ่ฅ็จๅผไธๆฏๆด่จ่:ๆน็จ restart
ๅฆๆๆฏๅฐๅทฅๅ ทๆ้้้ตๆๅ,ไฝ ไนๅฏไปฅ้ธๆๅจ่ผชๆฟๅพ้ๅๆๅ:
postrotate
systemctl restart myapp.service >/dev/null 2>&1 || true
endscript
ๆญ้ ๅไธ็ฏๅ งๅฎน,ๆด้ซๆต็จ่ฎๆ:
- logrotate ๆ นๆๆขไปถ่ผชๆฟ
myapp.log。 - ่ผชๆฟๅฎๆๅพ,ๅท่ก
postrotate่ฃก็ๆไปค。 - systemd ้็ฅๆๅ้ๆฐ้ๅๆ้ๅ,ไนๅพไพฟๆๅฏซๅ ฅๆฐ็ log ๆช。
ไธ、็จ systemd timer ็ฎก็ logrotate(ๅไปฃ cron)
ๅจ่ผๆฐ็็ผ่ก็ไธญ,logrotate ๆฌ่บซไนๅทฒ็ถ่ขซ systemd ๆฅ็ฎก(่ไธๆฏๅณ็ตฑ็ cron.daily)。
# ๆฅ็ logrotate timer
systemctl list-timers | grep logrotate
# ๅฏ็ๅฐ้กไผผ:
# logrotate.timer logrotate.service ... Mon 03:10 ...
ๅฆๆไฝ ็็ณป็ตฑๅฐๆชไฝฟ็จ systemd timer,ไนๅฏไปฅ่ชๅทฑๅปบ็ซ:
# /etc/systemd/system/logrotate-custom.service
[Unit]
Description=Run logrotate custom config
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf
# /etc/systemd/system/logrotate-custom.timer
[Unit]
Description=Daily logrotate (custom)
[Timer]
OnCalendar=*-*-* 03:10:00
RandomizedDelaySec=300
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now logrotate-custom.timer
systemctl list-timers --all | grep logrotate
้ๆจฃๅฐฑๅฎๆไบ「systemd → logrotate → ๆฌ้/ๅฃ็ธฎ」็ไธๆข้พๆ็จ。
ๅ ซ、ๅธธ่ฆ้ฏ่ชค่ๆ้ฏๆนๆณ
-
่ผชๆฟๆฒๆ็ผ็:
ไฝฟ็จsudo logrotate -d /etc/logrotate.conf sudo logrotate -d /etc/logrotate.d/myapp-d(debug) ็ logrotate ๅฆไฝๅคๆทๆขไปถ。 -
่ผชๆฟๅพ log ๆชไปๆ็บ่ฎๅคง:
ไปฃ่กจ็จๅผไป็ถๆก่「่ๆชๆก็ file descriptor」,็ขบๅฎ:- ็จๅผๆๅฏฆไฝ「้ๆฐ้ๅ log」็้่ผฏ。
- logrotate ็
postrotateๆๆญฃ็ขบ้็ฅๆๅ。
-
ๆฌ้้ฏ่ชคๅฐ่ดๆๅ็กๆณๅฏซ log:
ๆชขๆฅ logrotate ็create่จญๅฎ(mode / owner / group),่ service ไฝฟ็จ่ ๆฏๅฆไธ่ด。 -
logrotate ๅท่ก้ฏ่ชค:
้้ journal ๆฅ่ฉณ็ดฐ้ฏ่ชค่จๆฏ。journalctl -u logrotate.service -xe
ไน、ๅฏฆๆฐๆ ๅข็ฏไพ:Web App / Nginx / Squid
1️⃣ ่ช่ฃฝ Web ๆ็จ(Flask / Node.js ็ญ)
- ๆๆ็จ็จๅผๆๆ
stdout/stderrๅฐๅ/var/log/myapp/*.log。 - logrotate ไปฅ
size 100M+rotate 10็ฎก็ๅฎน้。 - ็จๅผๅ
งๅฏฆไฝๆถๅฐ
SIGUSR1ๆ้ๆฐ้ๅ log ๆช。
2️⃣ Nginx / Apache
- ้้กๆๅ้ๅธธๅทฒๅ งๅปบ /etc/logrotate.d/nginx / apache2 ่จญๅฎ,ๅฏๅ่ๆขๆๆ ผๅผ。
- ่ฅๆๅคง้ vhost,ๅฏๆนๆ
weekly+dateextๆนไพฟๅฐๆ。 - ่จๅพ็ขบ่ช
postrotateๅ งๆฏๅฆๆnginx -s reopenๆapachectl graceful。
3️⃣ Squid ๆๅ ถไป Proxy / Cache
- Squid ๆๆ่ชๅทฑ็
access.log/cache.log;ๅฏไพ้ๆฑๆๆไธๅ่ผชๆฟ่ฆๅ。 - ้ซๆต้็ฐๅขๅฏๆน็จ
size 50Mๆhourly็ OnCalendar(้ ๅ systemd timer)。 - ่ผชๆฟๅพ่จๅพ่ฎ Squid ๆถๅฐ
USR1่จ่้ๆฐ้ๅ log(ๆไฝฟ็จๅฅไปถ้ ่จญ่จญๅฎ)。
๐งญ ่กๅๆธ ๅฎ:ๅจ่ชๅทฑไธปๆฉไธ่ฝๅฐ้ๅฅๆต็จ
✅ ๅปบ็ซไธๅไปฅ systemd ็ฎก็็่ช่ฃฝๆๅ(ExecStart ๅทฒๅฏๆญฃๅธธ้ไฝ) ✅ ๅปบ็ซๅฐ็จ็ๆฅ่ช็ฎ้:/var/log/myapp,ไธฆ่จญๅฎ้ฉ็ถๆฌ้ ✅ ๅจ service ไธญๅฐ่ผธๅบๅฐๅ myapp.log / myapp.err.log ✅ ๆฐๅฏซ /etc/logrotate.d/myapp,่จญๅฎ่ผชๆฟ้ ป็、ไฟ็ไปฝๆธ่ๅฃ็ธฎๆนๅผ ✅ ไฝฟ็จ logrotate -d / -f ๆธฌ่ฉฆ่ผชๆฟๆต็จ,็ขบ่ชไธๆๅด้ฏ ✅ ่ฆๆ ๆณๅจ postrotate ไธญๅ ๅ ฅ systemctl kill ๆ restart,็ขบไฟๆๅๆนๅฏซๆฐๆชๆก ✅ ๆชขๆฅ systemd timer(logrotate.timer ๆ่ช่จ timer)ๆฏๅฆๆญฃๅธธๅๅ
๐ ๅปถไผธ้ฑ่ฎ
- ๐ง Linux systemd ๆทฑๅ ฅ่งฃๆ่ๅๅๆต็จ็ฎก็
- Linux Proxy(Squid)ๅปบ็ฝฎ่่จญๅฎ
- ไฝฟ็จ GoAccess ้ฒ่ก็ถฒ็ซๆต้ๅๆ
- sed ๆๅญ่็้ๆฅ
ๆๅพๆดๆฐ:2025-11-16 · ไฝ่ :WWFandy
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ