日志切割logrotate的介紹

1.日志切割的概念、必要性和基本思路

1.1 什么是日志切割

日志切割是指當應用或系統(tǒng)的日志文件達到設定的觸發(fā)條件(如按照一定的時間周期:每天,按照大?。?00MB),對其進行切割/分割處理,類似截斷處理,把原本容量比較大的日志文件“劫走”轉(zhuǎn)存為另外一個日志文件留存歸檔,這一刻之后產(chǎn)生的日志,繼續(xù)輸出到文件頭被重置為0的日志文件中。

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、微信小程序、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了天寧免費建站歡迎大家使用!

變化的部分:日志文件的容量(瘦身變?。?,日志文件的個數(shù)(多出一份被切割下的歷史日志)

不變的部分:日志文件名不變

日志切割logrotate的介紹

此外,一段時間后,我們還需要刪除時間久遠的日志文件,整個過程也被俗稱為日志滾動(log rotation)。

1.2 為什么要進行日志切割

在線應用(包括操作系統(tǒng))在長期運行過程中,會產(chǎn)生很多過程日志記錄,通常是應用程序記錄的一些對系統(tǒng)管理員或者程序開發(fā)者有用的信息的文件,諸如正在執(zhí)行什么、發(fā)生了什么錯誤等一系列信息。

隨著日志記錄的不斷積累,日志文件越來越大,隨著時間推移,會帶來以下弊?。?/p>

  • 日志文件占用的硬盤空間越來越大
  • 日志文件太大,達到GB級別后查看內(nèi)容太耗時,要追蹤錯誤等非常不方便

一個栗子:

日志切割logrotate的介紹

1.3 日志切割的基本思路

日志切割的基本需求

  • 應用層面

    切割過程中不影響應用的正常運行(不能停用應用來分割日志)

  • 數(shù)據(jù)層面

    不丟失日志,或者在可接受的范圍內(nèi)丟失極少日志

    切割過程中不影響應用繼續(xù)輸出記錄日志(日志文件名不變)

  • 日志容量層面

    切割后新的日志文件從空文件開始重新記錄(容量和文件頭被重置),便于后續(xù)查詢使用

  • 日志歸檔層面

    切割后老舊日志方便歸檔壓縮處理(文件名加上日期后綴等)

    分割后的老舊日志可按照保存周期輪詢刪除

  • 管理維護層面

    自動化周期性進行,周而復始

從以上需求出發(fā),在滿足不停用應用的首要前提下,可以設計出兩種日志切割的基本思路

  • 思路1--重命名移走舊的日志文件,同時生成一個新的日志文件(文件名與切割之前保持一致)

    把現(xiàn)有日志mv成另外一個文件,同時自動生成一個同文件名(mv之前的日志文件名)的新日志文件

    日志的文件名不變但是需要確保應用可以指向新的文件句柄

    新的日志文件當然從0開始寫,日志文件成功瘦身!

    日志切割logrotate的介紹

  • 思路2-拷貝并重命名一份現(xiàn)有日志文件,同時把現(xiàn)有容量大的日志文件內(nèi)容清空

    把現(xiàn)有日志文件cp一份為另外的文件名,同時非??焖俚匕熏F(xiàn)有日志文件清空

    但不改變現(xiàn)有日志文件的文件句柄(在3.1.1章節(jié)會有更多詳述)。

    這樣日志文件的文件名和句柄都沒有變化,只是內(nèi)容已經(jīng)被清空,也是從0開始繼續(xù)寫入,減肥成功!

    日志切割logrotate的介紹

    最后,需要結(jié)合定時任務,周期性定時執(zhí)行日志切割任務,自動化處理

2. 常見的日志切割方案

2.1 自定義腳本進行日志切割

自定義腳本切割日志,核心原理是mv已有的日志文件,然后生成一個新的日志文件,結(jié)合kill -USR1 PID 來reload應用,以便應用獲取新日志文件的文件句柄,日志即可輸出到新的日志文件。

注意:

  1. 這里說的新日志文件的文件名沒有變化,但本質(zhì)上是一個全新的文件。
  2. kill -USR1 PID 僅僅是reload應用配置,不會真正重啟應用進程,因此不會引起應用停止運行

腳本切割nginx日志栗子:

#/bin/bash
bakpath='/home/nginx/logs'
logpath='/var/log/nginx/logs'

if [ ! -d $bakpath/$(date +%Y)/$(date +%m) ];then
   mkdir -p $bakpath/$(date +%Y)/$(date +%m)
fi

mv $logpath/access.log $bakpath/$(date +%Y)/$(date +%m)/access-$(date +%Y%m%d%H%M).log

#給nginx發(fā)送一個信號量,讓nginx重載,重新生成新的日志文件
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

2.2 應用層面結(jié)合log4j切割日志

log4j是apache針對java應用開源的一套日志框架,java應用可以通過加載指定的jar包,結(jié)合配置文件,從應用本身規(guī)范日志輸出的格式,級別等,同時可附加實現(xiàn)日志的切割處理。

切割的觸發(fā)條件可以是時間周期和日志大小兩個維度。

log4j一般需要開發(fā)人員的協(xié)助,最好由開發(fā)人員直接實現(xiàn)。

2.3 基于第三方開源工具切割日志

2.3.1 logrotate

linux系統(tǒng)自帶的日志處理工具,功能非常強大,可以進行日志的切割,壓縮,滾動刪除等處理。

自身基于系統(tǒng)的crontab來運行,無需手動配置。

2.3.2 cronolog

cronolog開源的日志處理工具,可以實現(xiàn)自動的按規(guī)則生成周期性的日志文件,需要單獨安裝后配置使用。

2.4 日志切割方案的對比與選型

對比方案部署工作量對應用的親和性功能性
腳本前期工作量較大<br />底層邏輯都需要自己逐一實現(xiàn)<br />功能完善的腳本開發(fā)量較大一般看腳本本身
log4j較小,加載jar包進行配置即可較為強大,但不支持日志壓縮
第三方工具較小僅僅需要配置較好強大

這里的第三方工具僅僅針對logrotate而言(其它工具可以參考對比因素來對比)。

選型:

  • 多用拿來主義,避免自己重復造輪子(特指自己巴拉巴拉一股腦式寫腳本)

  • 優(yōu)選應用層面結(jié)合log4j方案

    建議應用層面可以應用log4j的就應用log4j,結(jié)合第三方工具進行日志壓縮和周期性刪除處理

  • 備選(次選)開源第三方工具--logrotate

    不便于應用log4j的情況下推薦使用第三方工具,尤其是logrotate,系統(tǒng)自帶,開箱即用--次選方案

3. logrotate實戰(zhàn)運用

3.1 logrotate的工作原理

3.1.1 核心原理

文件句柄

操作系統(tǒng)為每一個進程維護了一個獨立的打開文件表(fdtable),進程每新打開一個文件,表中就會增加一個條目。

  • 文件描述符是一個整數(shù),代表fdtable中的索引位置(下標),指向具體的struct file(文件句柄/文件指針)

  • 文件句柄(文件指針)對應著文件的詳細信息,存儲著文件的狀態(tài)信息、偏移量和文件的inode信息等。

  • 文件句柄中存儲的inode信息,對應到應用進程正在寫的一個具體文件

  • 每一個文件描述符會與一個打開的文件(文件句柄)相對應

  • 應用進程通過fdtable中的文件句柄(文件指針)來定位到它要寫操作的文件

日志切割logrotate的介紹

綜上所述,文件句柄可以唯一界定操作系統(tǒng)中一個特定的文件。

推理:

文件句柄不包括文件路徑和文件名,因此文件路徑和文件名的變化,不會引起對文件句柄的修改,進而不會引起應用進程對某一特定文件(文件句柄的具體指向)的寫操作

可以通過實驗來驗證上述推理結(jié)論。

切割日志過程

文件句柄的存在,決定了logrotate進行日志切割時候,存在以下兩種方案:

- ##### 切割后使用新的文件句柄--create方式

create方式也是默認的方案,它的核心思路是重命名原日志文件,并創(chuàng)建新的日志文件。create方案是在mv+create 執(zhí)行完之后,通知應用重新在新的日志文件寫入即可。

那么如何通知應用程序重新打開日志文件,從而往新的空日志文件中寫入呢?

簡單粗暴的方法是殺死進程重新打開。但是這樣會影響在線業(yè)務,不可取!

于是有些程序提供了重新打開日志的接口,以Nginx為例,是通過發(fā)送USR1信號給Nginx進程來通知Nginx重新打開日志文件的。也存在一些其他方式(如IPC),前提是程序自身要支持。

  • 切割后繼續(xù)沿用舊的文件句柄--copytruncate方式

不過,有些程序并不支持create方式,壓根沒有提供重新打開日志的接口;而如果粗暴地重啟應用程序,必然會降低可用性,為此引入了copytruncate的方案。

這個方案的思路是把正在輸出的日志拷(copy)一份出來重命名,再清空(trucate)原來的日志。從結(jié)果上看,舊的日志內(nèi)容存在滾動的文件里,新的日志輸出到被清空的文件里。

注意事項

以上兩種方案中,能用默認的create方案就不用copytruncate,why?

  1. 數(shù)據(jù)丟失風險

  2. 耗時太久風險

這里關于create和copytruncate方式的具體執(zhí)行過程,以及注意事項,包含了較為關鍵的技術細節(jié)。如若以上描述不足以理解,可以關注課程https://edu.51cto.com/sd/3f309, 接受免費試看。

3.1.2 定時任務執(zhí)行

logrotate自身已經(jīng)被集成到系統(tǒng)定時任務中,基于CRON來運行,默認每天運行一次。

定時任務:

 /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

要點:

/usr/sbin/logrotate  執(zhí)行文件

-s /var/lib/logrotate/logrotate.status  記錄執(zhí)行后的狀態(tài)

/etc/logrotate.conf   運行時加載的配置文件

問題: cron.daily究竟是在每天什么時間執(zhí)行的呢?

Logrotate是基于CRON運行的,所以這個時間是由CRON控制的,具體可以查詢CRON的配置文件/etc/anacrontab(老版本的文件是/etc/crontab)

cat /etc/anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45             #這個是隨機的延遲時間,表示最大45分鐘
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22      #這個是開始時間段,3點-22點

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

1       5       cron.daily

第一個是Recurrence period  第二個是延遲時間(the base delay,基本的延遲時間)

總的延遲時差是:基本延遲+隨機延遲=5~(5+45),即5-50 min

開始的基準時間:3-22點,不出意外,就是3點開始

所以cron.daily會在3:00+(5,50)這個時間段執(zhí)行

定時任務執(zhí)行時間,也可以通過日志和處理過的日志文件兩種方式來確認。

3.1.3 logrotate執(zhí)行過程

logrotate自動化處理日志的過程如下:

  1. Redhat系列系統(tǒng)缺省的cron 在每天的3:00+(5,50)這個時間段喚醒觸發(fā)cron.daily下定義的logrotate定時任務

  2. logrotate加載默認的配置文件/etc/logrotate.conf,定位判斷需要被處理的日志文件

  3. 基于配置文件的相關參數(shù),對匹配到的日志文件執(zhí)行日志切割、壓縮、轉(zhuǎn)儲即周期性刪除處理

  4. 完成后產(chǎn)生過程狀態(tài)記錄文件 /var/lib/logrotate/logrotate.status

    實戰(zhàn)運用中,我們是先設置好logrotate的相關參數(shù)和任務,然后等待cron來喚醒定時任務觸發(fā)執(zhí)行。

注意:

  1. 以上原理部分是最為重要的部分,深入理解了原理之后,對于配置文件的解讀,和生產(chǎn)環(huán)境的實際落地運用,以及遇到實際問題的有效解決,幫助作用是顯而易見的。
  2. 這部分內(nèi)容看似簡單,實際存在較多的細節(jié)和要點,老手也不一定能把它們理順講透,這里推薦關注課程https://edu.51cto.com/sd/3f309, 接受免費試看。

3.2 logrotate的配置文件解析

理解了原理過程,我們再來梳理一下logrotate的配置文件。配置文件分為全局默認配置/etc/logrotate.conf和/etc/logrotate.d目錄下的自定義配置。

配置的有效性和優(yōu)先級:

logrotate加載配置時,會針對/etc/logrotate.d目錄下的每個自定義配置,與全局默認配置/etc/logrotate.conf進行合并渲染,如存在相同項或者沖突項,以自定義配置為準:

相同項:

全局配置和自定義配置中配置了相同的參數(shù)key,但value不同的情況

沖突項:

全局配置和自定義配置中存在的沖突項

3.2.1 全局默認配置文件

全局配置文件:

cat /etc/logrotate.conf   
# see "man logrotate" for details
# rotate log files weekly
weekly      #每周輪轉(zhuǎn)一次

# keep 4 weeks worth of backlogs
rotate 4    #保留四個被切割轉(zhuǎn)儲后的日志文件(即備份的老日志文件)

# create new (empty) log files after rotating old ones
create      #rotate后,創(chuàng)建一個新的空文件,默認的create方式處理

# use date as a suffix of the rotated file
dateext     # 日志文件切割時添加日期后綴,后綴格式Y(jié)YYYmmdd,切割后的文件名如xxx.log-20200202

# uncomment this if you want your log files compressed
#compress   #默認切割轉(zhuǎn)儲后的日志是不壓縮的

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d    #編程中常用的include大法,該目錄下的配置文件都會被引用生效

# no packages own wtmp and btmp -- we'll rotate them here  #順帶rorate兩個孤兒日志
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

3.2.2 自定義配置文件

默認配置文件中已經(jīng)通過include /etc/logrotate.d大法指明了自定義配置文件的路徑,因此在這個路徑下定義細化配置即可。

例1: create方式切割nginx日志

cat /etc/logrotate.d/nginx

/var/log/nginx/*.log       {   # 可以指定多個路徑,多個路徑通過空格或換行符分隔,支持正則匹配
    daily                      # 日志輪詢周期,weekly,monthly,yearly
    rotate 30                  # 留存30份切割后的舊日志,以天為周期,即保存30天舊日志,超過則刪除
    size +100M                 # 超過100M時分割,單位k,M,G,優(yōu)先級高于daily
    compress                   # 切割后立即對老日志進行gzip壓縮,也可以為nocompress
    dateext                    # 日志文件切割時添加日期后綴
    missingok                  # 如果沒有日志文件也不報錯
    notifempty                 # 日志為空時不進行切換,默認為ifempty
    create 640 nginx nginx     # 使用該模式創(chuàng)建新的空日志文件,mode,user和group參數(shù)可以省略
    sharedscripts              # 所有的文件切割之后再一次性執(zhí)行下面腳本
    postrotate
        if [ -f /var/run/nginx.pid ]; then  #腳本符合shell語法和邏輯即可
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

其它較為常用的配置參數(shù):

nocopytruncate           copy日志文件后不截斷不清空日志,僅僅備份用
nocreate                 不建立新的日志文件,用于僅僅只需要對應用日志進行壓縮和輪詢刪除的場景
errors address           遇到錯誤時信息發(fā)送到指定的Email 地址
olddir directory         轉(zhuǎn)儲后的日志文件放入指定的目錄,必須和當前日志文件在同一個文件系統(tǒng)
prerotate                在logrotate轉(zhuǎn)儲之前需要執(zhí)行的指令,例如創(chuàng)建一個轉(zhuǎn)儲的日志目錄
rotate count             指定日志文件刪除之前轉(zhuǎn)儲的次數(shù)(個數(shù)),0指沒有備份,5指保留5個備份
maxage                   以單個轉(zhuǎn)儲時間周期為計數(shù)單位來保留老舊日志,如每天處理,代表保留多少天的老舊
                         日志,此時與rotate count無區(qū)別
dateext                  使用當期日期-YYYYmmdd作為轉(zhuǎn)儲后的日志文件附加后綴,不配置則以數(shù)字1到n作為后
                         綴,n為rotate n中的配置參數(shù)
dateformat .%s           配合dateext使用,緊跟在下一行出現(xiàn),定義文件切割后的文件名附加后綴,必須配合
                         dateext使用,只支持 %Y %m %d %s 這四個參數(shù)

其它可參照man文檔,以及/etc/logrotate.d/下系統(tǒng)自帶的配置文件來研究。

注意事項:

logrotate本身是通過系統(tǒng)定時任務cron來在每天的凌晨3-4點之間某個時間點觸發(fā),至于logrotate它自己被觸發(fā)后,會不會對我們指定的日志文件進行預期的切割處理,還取決于我們對logrotate執(zhí)行動作的條件約束,更多細節(jié)可以關注課程https://edu.51cto.com/sd/3f309, 接受免費試看。

3.3 實戰(zhàn)運用logrotate進行自動化日志切割和壓縮

應用舉例:

  1. create方式切割nginx日志
cat /etc/logrotate.d/nginx

/var/log/nginx/*.log {
    daily
    missingok
    rotate 60
    compress
    notifempty
    dateext
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ];then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}
  1. copytruncate方式切割tomcat catalina.out日志

  2. 對tomcat已經(jīng)切割的localhost日志進行壓縮處理

網(wǎng)頁名稱:日志切割logrotate的介紹
分享地址:http://bm7419.com/article22/ijpccc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google網(wǎng)站維護、網(wǎng)站改版、微信小程序商城網(wǎng)站、品牌網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設