1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Linux 日志管理經(jīng)驗總結(jié)( crontab + logrotate )

        共 5551字,需瀏覽 12分鐘

         ·

        2024-07-16 08:00


                 

        鏈接:https://www.cnblogs.com/xiaoyaozhe/p/17671275.html

        日志管理目標

        日志的管理,一般包括兩大部分

        1. 日志內(nèi)容,合理的日志內(nèi)容(日志錨點,內(nèi)容格式,等)可以為應用服務的執(zhí)行記錄、問題排查提供最有力的幫助

        2. 日志存檔規(guī)則,包括日志分割方式(按日期、按文件大小,等),日志存檔數(shù)量,如只保存最近一個月,等

        對于自行開發(fā)的應用服務,日志的管理可以由開發(fā)人員通過日志組件定制化,如logback,log4j等,但對于安裝部署的第三方組件如MySQL、nginx、redis等,以及開發(fā)引用的第三方組件如nacos,sentinel等,除非組件開放了豐富的日志配置參數(shù),否則將無法按照開發(fā)人員的要求管理日志文件。

         

        特殊日志場景

        一些特殊應用服務或組件,如果沒有進行特定的配置操作,默認情況下將使日志文件不受控制,為后期清理造成麻煩,常見的有

        • nohup方式啟動應用服務,如果未配置日志重定向,或者重定向到了單文件,則系統(tǒng)將日志持續(xù)輸出在nohup.out文件或重定向的單文件

        • mysql數(shù)據(jù)庫支持配置日志文件路徑,但無法自動清理日志內(nèi)容

        • nginx支持配置日志內(nèi)容模板以及日志文件路徑(默認access.log、error.log),但無法自動清理日志內(nèi)容

        以上類似情況下,日志將始終在單文件中持續(xù)輸出,過了一定時間后,日志文件將占用無限大的磁盤存儲,對整個系統(tǒng)造成運行故障。

         

        特殊工具 - 定時清理

        可以使用Linux自帶定時工具 crontab + 清理日志腳本的方式,實現(xiàn)定時清理,示例如下

        crontab -e# 定時清理日志,保留最近7天1 0 * * * find /logs.dir/ -mtime +7 | xargs rm -rf

        特別關(guān)注

        Linux系統(tǒng)下,有些應用服務組件如nginx與MySQL,運行過程中,對日志存儲文件將使用文件句柄跟蹤,如此會有以下問題:

        1. 將日志文件重命名,同時新建一個同名的文件,組件依然會向原來的文件中輸出日志

        2. 將日志文件刪除(rm -f),也需要同時將應用服務組件進程重啟才行,否則刪除的文件也會由于被占用而無法釋放磁盤資源

        3. 刪除但被占用的文件將無法通過 ls -l 命令查看,也無法通過 du -sh 命令統(tǒng)計磁盤占用,但 df -h 命令會顯示真實磁盤占用,只能通過 lsof 命令,查看打開的文件描述符,對運維造成很大麻煩

        針對這種情況

        1. 如果只是單次清理文件,可以使用清空文件的方式,如 echo > log.log,或其他清空的方式,但切記不能直接 rm -f 刪除

        2. 如果已經(jīng)執(zhí)行 rm -f 刪除,則可以使用 lsof | grep -i deleted 命令查看被刪除但無法回收的文件,然后將相應的進程重啟即可回收

        3. 如果要保留日志內(nèi)容,又要控制存儲容量,則需要使用logrotate的 拷貝+清空 方式,即只是將日志文件內(nèi)容拷貝一份存檔,然后清空當前日志文件(而非刪除)

         

        特殊工具 - logrotate

        對于不方便進行自定義日志管理的應用服務組件,可以自定義腳本維護,可以自行開發(fā)應用軟件維護,但強聯(lián)推薦使用Linux系統(tǒng)集成的日志管理工具logrotate,該工具由Linux系統(tǒng)crontab定時調(diào)度,支持為相關(guān)日志文件(或其他文件)自定義存儲規(guī)則,但日志內(nèi)容只能按照應用服務組件的實現(xiàn)輸出。

         

        logrotate提供的功能參數(shù)很多,比較常用的如下

        • 日志分割周期

        • 日志文件擴展名

        • 日志文件分割方式,包括新建+刪除,拷貝+清空,等,適用不同應用服務場景

        • 日志內(nèi)容壓縮

        • 日志文件存檔數(shù)量

         

        logrotate 命令格式:logrotate [OPTION...] <configfile>-d, --debug :debug模式,測試配置文件是否有錯誤。-f, --force :強制轉(zhuǎn)儲文件。-m, --mail=command :壓縮日志后,發(fā)送日志到指定郵箱。-s, --state=statefile :使用指定的狀態(tài)文件。-v, --verbose :顯示轉(zhuǎn)儲過程。
        vi /etc/logrotate.d/nginx #在/etc/logrotate.d/目錄下新建nginx文件,內(nèi)容如下:/usr/share/nginx/log/*.log{dailymissingokrotate 7compressdelaycompressnotifemptycreate 644 root rootsharedscriptspostrotate[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`endscript}

        #調(diào)用方法logrotate -d /etc/logrotate.d/nginx#結(jié)合crontab定時執(zhí)行 echo "0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx > /dev/null 2>&1" >> /var/spool/cron/root


        #參數(shù)說明:compress 通過gzip 壓縮轉(zhuǎn)儲以后的日志nocompress 不做gzip壓縮處理copytruncate 用于還在打開中的日志文件,把當前日志備份并截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會丟失部分日志數(shù)據(jù)。nocopytruncate 備份日志文件不過不截斷create mode owner group 輪轉(zhuǎn)時指定創(chuàng)建新文件的屬性,如create 0777 nobody nobodynocreate 不建立新的日志文件delaycompress 和compress 一起使用時,轉(zhuǎn)儲的日志文件到下一次轉(zhuǎn)儲時才壓縮nodelaycompress 覆蓋 delaycompress 選項,轉(zhuǎn)儲同時壓縮。missingok 如果日志丟失,不報錯繼續(xù)滾動下一個日志errors address 專儲時的錯誤信息發(fā)送到指定的Email 地址ifempty 即使日志文件為空文件也做輪轉(zhuǎn),這個是logrotate的缺省選項。notifempty 當日志文件為空時,不進行輪轉(zhuǎn)mail address 把轉(zhuǎn)儲的日志文件發(fā)送到指定的E-mail 地址nomail 轉(zhuǎn)儲時不發(fā)送日志文件olddir directory 轉(zhuǎn)儲后的日志文件放入指定的目錄,必須和當前日志文件在同一個文件系統(tǒng)noolddir 轉(zhuǎn)儲后的日志文件和當前日志文件放在同一個目錄下sharedscripts 運行postrotate腳本,作用是在所有日志都輪轉(zhuǎn)后統(tǒng)一執(zhí)行一次腳本。如果沒有配置這個,那么每個日志輪轉(zhuǎn)后都會執(zhí)行一次腳本prerotate 在logrotate轉(zhuǎn)儲之前需要執(zhí)行的指令,例如修改文件的屬性等動作;必須獨立成行postrotate 在logrotate轉(zhuǎn)儲之后需要執(zhí)行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行daily 指定轉(zhuǎn)儲周期為每天weekly 指定轉(zhuǎn)儲周期為每周monthly 指定轉(zhuǎn)儲周期為每月rotate count 指定日志文件刪除之前轉(zhuǎn)儲的次數(shù),0 指沒有備份,5 指保留5 個備份dateext 使用當期日期作為命名格式dateformat .%s 配合dateext使用,緊跟在下一行出現(xiàn),定義文件切割后的文件名,必須配合dateext使用,只支持 %Y %m %d %s 這四個參數(shù)size(或minsize) log-size 當日志文件到達指定的大小時才轉(zhuǎn)儲,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
        #當日志文件 >= log-size 的時候就轉(zhuǎn)儲。以下為合法格式:(其他格式的單位大小寫沒有試過)size = 5 或 size 5 (>= 5 個字節(jié)就轉(zhuǎn)儲)size = 100k 或 size 100ksize = 100M 或 size 100M

        附錄:logrotate簡易配置


        
          
        MySQL/data/mysql/log/mysqld.log{    daily    dateext    dateyesterday    copytruncate    notifempty    missingok    olddir backup    rotate 60        compress}
        nginx/usr/local/nginx/logs/access.log/usr/local/nginx/logs/error.log{ daily dateext dateyesterday copytruncate notifempty missingok olddir backup rotate 30 compress}
        
          


        附錄:關(guān)于常用組件運行時日志管理

        1. nginx不支持自動清理,默認單文件持續(xù)寫入,且不會自動滾動

        2. mysql不支持自動清理,默認單文件持續(xù)寫入,且不會自動滾動

        3. zookeeper默認支持自動清理(限制文件大小和個數(shù)),log4j配置文件維護

        4. redis不支持自動清理,只記錄少量核心日志,單文件持續(xù)寫入,但默認只記錄少量核心日志,可以不處理

        5. kafka的數(shù)據(jù)記錄日志(topic、offset等),支持自動清理,配置文件維護

        6. kafka操作日志,默認在安裝目錄logs目錄,支持自動滾動,但不會自動清理,log4j配置文件維護

        瀏覽 100
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天堂a在线8| 中文字幕1区| 久热精品在线观看| 五月丁香天堂网| 日本欧美亚洲| 国产毛片基地| 一二三四在线视频| 女人一级A片色黄情免费| 果冻传媒一区二区三区| 日逼大片|