Linux日志文件分割


  經常有這樣的情況,日志文件或者數據文件會變得很龐大,那么每次對這些目標文件的訪問或者修改就會變得極其耗時。因而引發一些性能問題,但是如果對這些目標文件進行分割,限定其大小,那么每次的訪問或者修改就會變得高效。

一、實現原理:

  用Linux自帶的定時任務Crontab以及日志分割Logrotate 去進行定時的日志分割。

  Crontab:在LINUX中,周期執行的任務一般由cron這個守護進程來處理[ps -ef|grep cron]。cron讀取一個或多個配置文件,這些配置文件中包含了命令行及其調用時間。cron的配置文件稱為“crontab”,是“cron table”的簡寫。

  Logrotate:logrotate工具是為了方便進行日志管理而產生的一個工具,主要可以完成的工作包含:基於天、周、月、文件大小進行日志的滾動備份、壓縮、刪除甚至是發送郵件。

二、調用方式

  logrotate默認情況下是通過anacron調用的,它每天只會被調用一次,也就是說一個日志文件默認不會多次被處理( 除非-f強制調用或者文件大小超過指定值)。大致調用流程如下:
1).anacron每天去調用/etc/cron.daily中的任務(包含logrotate);
2).anacron調用logrotate后進行日志的處理工作;
3).如果logrotate被手工調用,或者配置文件中有引用,后面的配置記錄會覆蓋前面相同選項的內容;
 
  logrotate語法如下:logrotate [-dv] [-f|--force] [-s|--state file] config_file+
什么都不跟則顯示版本信息和簡單的幫助信息,如果處理過程中出現異常則返回非0的$?;
--?,--help:  顯示幫助信息;
-v, --verbose:顯示詳細信息;
-d, --debug:開啟調試模式並隱含開啟-v,不會對日志和logrotate的state文件產生操作;
-f, --force:忽略調用周期強制調用logrotate,方便測試;
-m, --mail <command>:告知logrotate發送郵件的命令;
-s, --state <statefile>:多個logrotate運行時告知logrotate自己使用的state文件(/var/lib/logrotate.status)
config_file+:表示可以使用多個配置文件(默認為/etc/logrotate.conf)在后面,最好是在一個配置文件中進行引用(測試某條新的規則時可以單獨創建一個配置文件並用-f參數進行強行調用);
三、配置文件

  配置文件對於logrotate來說至關重要,logrotate通過配置文件去找到需要操作的各個日志文件以及怎么操作這些日志文件。配置文件中可以定義全局options和局部options,且后面的options會覆蓋前面的options,先來一個范例配置文件:

# sample logrotate configuration file --注釋
compress --壓縮option,默認所有的日志都壓縮;

/var/log/messages { --操作/var/log/messages日志文件,指定文件全名
    rotate 5  --最多保留歷史存檔5份;
    weekly --rotate周期,周
    postrotate  -->rotate結束后直行以下endscript前面的操作
        /sbin/killall -HUP syslogd --執行命令
    endscript
}
"/var/log/httpd/access.log" /var/log/httpd/error.log { --操作兩個文件,引號可以用於規避空格等特殊符號
    rotate 5
    mail www@my.org --舊日志文件發送到指定郵件地址
    size 100k --rotate規則為超過100K
    sharedscripts --所有日志處理完才執行后面的腳本而不是處理一個文件執行一次
    postrotate
        /sbin/killall -HUP httpd
    endscript
}
/var/log/news/* { --指定某個文件夾下的所有文件(包含已經rotate過的),只要有一個處理報錯就不會對日志進行壓縮
    monthly rotate 2 olddir /var/log/news/old --有利於減少重復rotate missingok --忽略不存在的日志 postrotate kill -HUP ‘cat /var/run/inn.pid‘ endscript nocompress }

  以下是可用option的詳細說明(前面打*號的通常應該都不會用到):

  常規參數:
include file_directory:引用對應的配置文件或者對應目錄下的常規文件(最好指定明確的文件,除非該路徑下全部都是logrotate的配置文件),文件讀取順序為alphabetic.注意:不能在某個日志的處理定義里面指定include.
mail address:發送郵件的收件人,如果不想發送郵件可以用nomail的參數;
nomail:不發送郵件;
maillast/mailfirst:mailfirst表示發送已經rotate的文件,需要與mail參數配合;maillast(默認值)發送下次會rotate的日志;
  壓縮相關參數:
compress/nocompress: compress表示被歸檔的日志文件默認會通過gzip進行壓縮,nocompress表示不壓縮(默認);
nodelaycompress/delaycompress:需要結合compress使用,delaycompress下次rotate才compress本次rotate的日志(方便查歷史),no開頭覆蓋此參數;
*extension ext:指定后綴名
*compresscmd:指定壓縮的命令,默認是gzip;
*uncompresscmd:指定解壓縮的命令,默認是gunzip;
*compressext:指定壓縮過后的日志文件的后綴名;
*compressoptions:指定壓縮程序的參數,默認為gzip指定的參數是"-9"(最大壓縮);
  備份頻率相關:
rotate count:歸檔的最大次數(超過該次數會被覆蓋),如果設置為0則表示不歸檔;
daily:上次歸檔不是今天時備份一次;
weekly:Log files are rotated if the current weekday is less than the weekday of the last rotation or if more than a week has passed since the last rotation;
yearly:如果當天的年份與上次rotate的年份不一樣;
monthly:每個月第一次運行logrotate的時候歸檔;
minsize size:可以與時間周期的歸檔結合起來,如果達到天數的歸檔周期還沒有到最小大小也不會歸檔;
size size:達到指定size的日志會被rotate(單位可以是K/M等);
start count:如果用數字排號則表示直接從count開始排而不是0;
*maxage count:刪除已經超過count天的歸檔,如果需要rotate這個歸檔則只是檢查;
  特別處理方式:
ifempty/notifempty:ifempty是默認值表示空文件也會被rotate,可以通過notifempty修改為空文件不歸檔;
missingok/nomissingok:missingok表示就算日志不存在也不會報錯,
olddir/noolddir:olddir表示將歸檔的日志放到對應的目錄(必須在同一個物理設備)下,絕對路徑為明確的路徑,如果指定相對路徑則是日志文件的相對路徑,noolddir覆蓋olddir參數
sharedscripts/nosharedscripts:主要針對處理多個日志或指定目錄的情況下,sharedscripts表示處理子集中所有的日志都處理完成后才執行,如果沒有日志被處理則不會執行。nosharedscripts則表示每個日志處理后都執行scripts部分;
  備份方式相關:
dateext/nodateext:在備份的日志后面加上備份當天的日期(YYYYMMDD)而不是簡單的加一個數字(nodateext覆蓋此歸檔方式);
copy/nocopy:copy指定備份日志的方式為復制(源文件可用作其他目的),因原文件不會被刪除,所以指定create會直接被忽略;nocopy表示不復制
copytruncate/nocopytruncate:復制一個副本后直接truncate原日志,這對於不能用move掉舊的再創建一個新文件的日志(copy與truncate中間可能會丟失一部分日志,實測每秒一筆日志不會丟失),no開頭表示copy后不truncate;
nocreate/create mode owner group:日志滾動(默認是move)后立即創建一個新的日志文件(mode指定權限,owner和group分別指定屬主屬組),然后才會執行portrotate,如果被忽略的一些屬性將會和原日志文件一致,nocreate會覆蓋此參數;
postrotate/endscript:rotate完成后通過/bin/sh去執行這兩個標記中間(必須換行)的命令,處理的日志文件會作為第一個參數傳遞給每個命令,如果指定sharedscripts則所有的日志都會傳遞給腳本;
prerotate/endscript:rotate日志前(確實有日志需要rotate)執行,其他同postrotate;
firstaction/endscript:處理多個日志前執行
lastaction/endscript:處理多個日志全部后執行

四、加入定時任務

  在crontab中加入定時任務執行規則,然后就可以按照定時規則去執行logrotate任務了。

  /var/spool/cron/ 這個目錄下存放的是每個用戶包括root的crontab任務,每個任務以創建者的名字命名,比如tom建的crontab任務對應的文件就是/var/spool/cron/tom。一般一個用戶最多只有一個crontab文件。

  找到自己的crontab文件,並vi編輯文件:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

  在末尾添加:

10,20,30,40,50 * * * * logrotate -f /etc/logrotate.d/定時任務配置A
10,20,30,40,50 * * * * logrotate -f /etc/logrotate.d/定時任務配置B

  保存即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM