็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿง Linux LogRotate ๆ—ฅ่ชŒ่‡ชๅ‹•่ผชๆ›ฟ่ˆ‡ๆธ…็†ๆ•™ๅญธ(ๅซ systemd / cron ๅฏฆไฝœ)

    ๐Ÿง Linux LogRotate ๆ—ฅ่ชŒ่‡ชๅ‹•่ผชๆ›ฟ่ˆ‡ๆธ…็†ๆ•™ๅญธ(ๅซ systemd / cron ๅฏฆไฝœ)

    ็ถญ้‹็’ฐๅขƒไธญ,ๆ—ฅ่ชŒ่‹ฅไธ่ฆๅŠƒ,็ฃ็ขŸๅฎนๆ˜“่ขซๅกžๆปฟ、ๅˆ†ๆžไนŸ่ฎŠๅ›ฐ้›ฃ。LogRotate ๅฏ้‡ๅฐๅคงๅฐๆˆ–ๆ™‚้–“่‡ชๅ‹•ๅˆ†ๆช”、ๅฃ“็ธฎ่ˆ‡ๆธ…็†,ไธฆๅœจ่ผชๆ›ฟๅพŒ้‡่ผ‰ๆœๅ‹™。ๆœฌๆ–‡ๆไพ› ไธ€ๆญฅไธ€ๆญฅ ็š„ๅฏฆไฝœ็ฏ„ไพ‹,ไธฆ่งฃ้‡‹ systemd timer ่ˆ‡ cron.daily ๅ…ฉ็จฎๅ•Ÿๅ‹•ๆ–นๅผ,ๆœ€ๅพŒ้™„ไธŠๅธธ่ฆ‹้Œฏ่ชคๆŽ’ๆŸฅๆธ…ๅ–ฎ่ˆ‡ๅฎ‰ๅ…จๆœ€ไฝณๅฏฆๅ‹™。

    ๐Ÿ“‘ ็›ฎ้Œ„

    ไธ€、ๆ ธๅฟƒๆฆ‚ๅฟต่ˆ‡ๆช”ๆกˆไฝˆๅฑ€

    • ไธป่จญๅฎšๆช”:/etc/logrotate.conf(ๆ”พๅ…จๅŸŸ่ฆๅ‰‡่ˆ‡ include ๆŒ‡ไปค)。
    • ๆœๅ‹™ๅˆ†ๆช”:/etc/logrotate.d/*(ๅ„ๆœๅ‹™ๅ„ๅฏซไธ€ไปฝ)。
    • ้‹ไฝœๆจกๅผ:ไพ ๆ™‚้–“(daily/weekly/monthly) ๆˆ– ๅคงๅฐ(size) ่ผชๆ›ฟ;ๅฏ้ธๆ“‡ compress/delaycompressrotate Nmissingoknotifempty ็ญ‰。
    • ่ผชๆ›ฟๅพŒๅ‹•ไฝœ:postrotate/endscript ๅ…งๅ‘ผๅซ systemctl reload ๆˆ– kill -HUP ่ฎ“ๆœๅ‹™้‡่ผ‰。

    ไบŒ、ๅ…จๅŸŸ่จญๅฎš:/etc/logrotate.conf

    # /etc/logrotate.conf
    # ๅ…จๅŸŸ้ ่จญ(ๅฏ่ขซ /etc/logrotate.d/* ่ฆ†ๅฏซ)
    weekly                 # ๆฏ้€ฑ่ผชๆ›ฟ
    rotate 4               # ไฟ็•™ 4 ไปฝๆญทๅฒๆช”
    create                 # ๅปบ็ซ‹ๆ–ฐๆช”,ๆฒฟ็”จ้ ่จญๆฌŠ้™(ๅฏๆ–ผๅ€‹ๅˆฅๆช”ๆกˆๅผทๅŒ–)
    dateext                # ไฝฟ็”จๆ—ฅๆœŸไฝœ็‚บๅ‰ฏๆช”ๅ
    compress               # ๅฃ“็ธฎ่ˆŠๆช”(ๆญ้… delaycompress ๆ›ดๅฎ‰ๅ…จ)
    include /etc/logrotate.d
    
    # ้‡ๅฐ wtmp/btmp ็š„็คบไพ‹(็ณป็ตฑ็™ปๅ…ฅ็ด€้Œ„)
    /var/log/wtmp {
      monthly
      rotate 12
      create 0664 root utmp
      missingok
    }
    /var/log/btmp {
      monthly
      rotate 12
      create 0600 root utmp
      missingok
    }

    ไธ‰、ๆฏๆœๅ‹™้…็ฝฎ:/etc/logrotate.d/ ็ฏ„ไพ‹

    ็ฏ„ไพ‹ A:Nginx ๅญ˜ๅ–/้Œฏ่ชคๆ—ฅ่ชŒ
    # /etc/logrotate.d/nginx
    /var/log/nginx/*.log {
      weekly
      rotate 8
      size 50M
      missingok
      notifempty
      compress
      delaycompress
      dateext
      create 0640 www-data adm
      sharedscripts
      postrotate
        # ไปฅ้‡่ผ‰ๆ–นๅผ่ฎ“ Nginx ้‡ๆ–ฐๆ‰“้–‹ๆช”ๆกˆๅฅๆŸ„
        [ -s /run/nginx.pid ] && systemctl reload nginx.service
      endscript
    }
    ็ฏ„ไพ‹ B:ๆ‡‰็”จ็จ‹ๅผๅ–ฎไธ€ๆช”ๆกˆ(ๆ”ฏๆด copytruncate)
    # /var/log/myapp/app.log ่‹ฅ็จ‹ๅผ็„กๆณ• HUP ้‡่ผ‰,ๅฏ็”จ copytruncate
    /var/log/myapp/app.log {
      daily
      rotate 14
      size 10M
      missingok
      notifempty
      compress
      delaycompress
      dateext
      copytruncate       # ๅ…ˆ่ค‡่ฃฝ่ˆŠๆช”ๅ† truncate ๅŽŸๆช”,้ฟๅ…้‡ๅ•Ÿๆœๅ‹™
    }
    ็ฏ„ไพ‹ C:ๅคšๆช”่ฆๅ‰‡ + ๆฌŠ้™ๅผทๅŒ–
    # /etc/logrotate.d/myapps
    /var/log/myapps/*.log {
      weekly
      rotate 6
      missingok
      notifempty
      compress
      dateext
      su root adm         # ไปฅ logrotate ็š„ su ๆฉŸๅˆถ็ถญๆŒๆฌŠ้™
      create 0640 root adm
    }

    ๅ››、ๆŽ’็จ‹่งธ็™ผ:systemd timer vs cron.daily

    ๅคงๅคšๆ•ธๆ–ฐ็‰ˆ็™ผ่กŒ็‰ˆๅทฒไฝฟ็”จ logrotate.timer;่ˆŠ็‰ˆๅ‰‡็”ฑ /etc/cron.daily/logrotate ่งธ็™ผ。

    # ✅ ๅปบ่ญฐ:ๅ•Ÿ็”จ systemd timer(ๅ…ทๅฏ่ง€ๅฏŸๆ€ง、ๆ˜“็ฎก็†)
    sudo systemctl enable --now logrotate.timer
    systemctl status logrotate.timer
    systemctl list-timers | grep logrotate
    
    # ่‹ฅไฝฟ็”จๅ‚ณ็ตฑ cron(ไพ็™ผ่กŒ็‰ˆ้ ่จญ)
    ls -l /etc/cron.daily/logrotate
    sudo run-parts /etc/cron.daily   # ็ซ‹ๅณ่งธ็™ผๆฏๆ—ฅๅทฅไฝœ(ๆธฌ่ฉฆ็”จ)

    ไฝ•่€…ๅ„ชๅ…ˆ? ่‹ฅๅŒๆ™‚ๅญ˜ๅœจ,่ซ‹ๆ“‡ไธ€;้ฟๅ…「timer + cron」้›™้‡่งธ็™ผๅฐŽ่‡ดไธฆ่กŒ่ผชๆ›ฟ。

    ไบ”、้ฉ—่ญ‰่ˆ‡ๆ‰‹ๅ‹•่ผชๆ›ฟ

    # ไนพ่ท‘(ไธๅฏฆไฝœ),ๆชขๆŸฅ่จญๅฎšๆ˜ฏๅฆๆญฃ็ขบ
    sudo logrotate -d /etc/logrotate.conf
    
    # ๅผทๅˆถ่ผชๆ›ฟ(ๆธฌ่ฉฆๅฏฆไฝœ)
    sudo logrotate -f /etc/logrotate.conf
    
    # ่ง€ๅฏŸ็ตๆžœ่ˆ‡ๅฃ“็ธฎๆช”
    ls -lh /var/log/nginx/
    ls -lh /var/log/myapp/

    ๅ…ญ、ๅธธ่ฆ‹้Œฏ่ชค่ˆ‡ๆŽ’ๆŸฅ

    • Permission denied/็„กๆณ•ๅปบ็ซ‹ๆ–ฐๆช”:็‚บ่ฆๅ‰‡ๅŠ ๅ…ฅ create 0640 user group ๆˆ–ไฝฟ็”จ su ๅญๅฅ。
    • ่ผชๆ›ฟๅพŒๆœๅ‹™ไปๅฏซๅ…ฅ่ˆŠๆช”:ๅคšๅŠๆ˜ฏๆœๅ‹™ๆœช้‡่ผ‰;ๅœจ postrotate ๅ‘ผๅซ systemctl reload ๆˆ–ไฝฟ็”จ copytruncate
    • ไธฆ่กŒ่ผชๆ›ฟ่ก็ช:้ฟๅ… logrotate.timer ่ˆ‡ cron.daily ๅŒๆ™‚ๅ•Ÿ็”จ;้—œ้–‰ๅ…ถไธ€。
    • ๅฃ“็ธฎๆช”ๆœชๅ‡บ็พ:ๆชขๆŸฅๆ˜ฏๅฆ่จญไบ† delaycompress(ๅฃ“็ธฎๆœƒๅปถๅพŒๅˆฐไธ‹ไธ€ๆฌก่ผชๆ›ฟ)。
    • ๅฎน้‡ๆœชไธ‹้™:่ผชๆ›ฟๅพŒๆœช้‡่ผ‰็š„ๆœๅ‹™ไปๆŒๆœ‰ๆช”ๆกˆๆ่ฟฐ็ฌฆ;lsof | grep deleted ๅฏๆŸฅๅทฒๅˆชไฝ†่ขซไฝ”็”จ็š„ๆช”ๆกˆ。

    ไธƒ、ๅฎ‰ๅ…จ่ˆ‡ๆœ€ไฝณๅฏฆๅ‹™(Hardening)

    • ๆœ€ๅฐๅŒ–ๆฌŠ้™:้‡่ฆๆ—ฅ่ชŒไฝฟ็”จ create 0600 root adm,้ฟๅ…ไธ€่ˆฌไฝฟ็”จ่€…ๅฏ่ฎ€。
    • ้ฟๅ…่ฆ†ๅฏซ:ๅ„ชๅ…ˆไฝฟ็”จ create ๆˆ– copytruncate,ไธ่ฆ็”จๆ‰‹ๅ‹• > file ๆ–นๅผๆธ…็ฉบ。
    • ไฟ็•™้€ฑๆœŸไพๅˆ่ฆ:ไพๅ…งๆŽง/ๆณ•่ฆ้œ€ๆฑ‚่จญๅฎš rotate N(ไพ‹ๅฆ‚ๅฎ‰ๅ…จ็จฝๆ ธ่ฆๆฑ‚ไฟ็•™ 6–12 ๅ€‹ๆœˆ)。
    • ่ˆ‡้›†ไธญๅŒ–ๆญ้…:้—œ้ตๆ—ฅ่ชŒๅปบ่ญฐ่ผธๅ‡บๅˆฐ้›†ไธญๅผ(rsyslog/Logstash),่ผชๆ›ฟๅƒ…ๅšๆœฌๆฉŸๆŽง้‡。

    ๅ…ซ、ๅฏฆ็”จ Recipes(ๅฏ็›ดๆŽฅๅฅ—็”จ)

    R1:้ซ˜ๆต้‡็ถฒ็ซ™็š„「ๆ™‚้–“ + ๅคงๅฐ」้›™ๆขไปถ
    /var/log/nginx/*.log {
      daily
      size 100M
      rotate 14
      missingok
      compress
      delaycompress
      dateext
      create 0640 www-data adm
      sharedscripts
      postrotate
        systemctl reload nginx.service
      endscript
    }
    R2:journald ๆธ…็†(้…ๅˆ LogRotate ็š„ๅฎน้‡ๆฒป็†)
    # ่จญๅฎš journald ๅ„ฒๅญ˜ไธŠ้™(/etc/systemd/journald.conf)
    SystemMaxUse=2G
    SystemMaxFileSize=200M
    RuntimeMaxUse=512M
    
    # ็ซ‹ๅณๆธ…็†่ˆŠๆ—ฅ่ชŒ(ไฟ็•™ 14 ๅคฉๅ…ง)
    sudo journalctl --vacuum-time=14d
    # ๆˆ–ไพๅฎน้‡ๆธ…็†,ไฟ็•™ๆœ€่ฟ‘ 1G
    sudo journalctl --vacuum-size=1G
    R3:่‡ช่จ‚ไปปๅ‹™ไปฅ timer ้€ฑๆœŸๆŽƒ้™คๅคงๅž‹ๆšซๅญ˜ๆช”
    # /etc/systemd/system/tmp-clean.service
    [Unit]
    Description=Scheduled temp cleanup
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/find /var/tmp -type f -mtime +7 -delete
    
    # /etc/systemd/system/tmp-clean.timer
    [Unit]
    Description=Run temp cleanup daily
    
    [Timer]
    OnCalendar=daily
    RandomizedDelaySec=120
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    
    # ๅ•Ÿ็”จ
    sudo systemctl enable --now tmp-clean.timer
    systemctl list-timers | grep tmp-clean

    ๐Ÿงญ ่กŒๅ‹•ๆธ…ๅ–ฎ

    ✅ ๅ•Ÿ็”จ logrotate.timer(ๆˆ–็ขบ่ช cron.daily)ไธฆๆ“‡ไธ€
    ✅ ็‚บ Nginx / ๆ‡‰็”จๆœๅ‹™ๅขž่จญ /etc/logrotate.d/ ๅ€‹ๅˆฅ่ฆๅ‰‡
    ✅ ไปฅ logrotate -d ่ˆ‡ -f ้ฉ—่ญ‰ๆต็จ‹;ๆญ้… journalctl ่ง€ๅฏŸ
    ✅ ๅฐๅฎ‰ๅ…จๆ€ง้ซ˜็š„ๆ—ฅ่ชŒๆŽก create 0600 ่ˆ‡ su ๆฌŠ้™ๆŽง็ฎก
    ✅ ๆญ้… rsyslog / GoAccess ๅš้›†ไธญๅŒ–่ˆ‡ๅฏ่ฆ–ๅŒ–

    — WWFandy・ไธป้กŒ็ญ†่จ˜

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš