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

๐Ÿง Linux Logrotate ้€ฒ้šŽๆ”ป็•ฅ:ๆœๅ‹™ๆ—ฅ่ชŒๅˆ†ๅ‰ฒ、ๅฃ“็ธฎ、่ผชๆ›ฟ่ˆ‡ๅธธ่ฆ‹้Œฏ่ชคๆŽ’ๆŸฅ

    ๐Ÿง 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 ไน‹ๅพŒ,ไฝ ๅฏไปฅๆœ‰ๆ•ˆ็ฎก็†ๅคง้‡ๆœๅ‹™ๆ—ฅ่ชŒ,้ฟๅ…็ฃ็ขŸ่ขซๅกžๆปฟ,่ฎ“็ณป็ตฑ้‹ไฝœๆ›ดๅฎ‰ๅ…จ、ๆ›ด็ฉฉๅฎš。

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

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

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

    ๅญ—็ดš