最新總結,超實用 Apache Log 分割 So easy

Apache Log Split-日誌分割

​ 由於Apache httpd 服務的日誌默認都寫入$HTTP_HOME/logs 目錄下,由於網站訪問量增加會導致apache 的單個日誌文件越來越大、在日常查找問題,定位分析問題帶來了一定的困擾,以及日誌歸檔。針對以上問題,通過分析和查閱資料進行優化管理。這次利用httpd 服務自帶的通過管道將日誌信息發送給另一個程序的功能去加強對日誌的管理(apache httpd server 不會將日誌直接寫入文件)。因此我們可以利用這個功能將日誌重定向到日誌分析工具、日誌壓縮備份等程序,方法是將配置文件中日誌文件部分重定向到program(|program)。

一、日誌文件分割工具

1. Apache httpd 自帶的日誌分割工具(rotatelogs)

1. rotatelogs 工具在$HTTP_HOME/bin 目錄下,直接修改httpd.conf

1)需要apache 加載 log_conf_module,如下:
# LoadModule log_config_module modules/mod_log_config.so     #log 配置模塊

2. 直接修改配置,將log 重定向到rotatelogs 程序按天分割日誌:(示例:每隔30s 分割一次日誌)

# ErrorLog "| /usr/local/httpd-2.2.15/bin/rotatelogs /usr/local/httpd-2.2.15/logs/%Y_%m_%d_error_log 30 480"
# CustomLog "| /usr/local/httpd-2.2.15/bin/rotatelogs /usr/local/httpd-2.2.15/logs/%Y_%m_%d_access_log 30 480" combined

##################################   參數解析  #####################################
# .------------------------------------— 管道符
# |     .-----------------------------------rotatelogs 程序路徑
# |     |                         .-------- 生成的日誌文件  .--------- 間隔多久分割日誌    
# |     |                         |                      |  .---------- 時區偏移
# |     |                         |                      |  |      .------ 日誌格式     
# |     |                         |                      |  |      |
# | $HTTP/bin/rotatelogs $HTTP/logs/%Y_%m_%d_access.log 30 480" combined

2.1 對其他站點log配置日誌分割(多個站點,將以上配置寫到各站點的VirtualHost節點中,以便各站點分別記錄各站點的日誌,如下:)

<VirtualHost *:10060>
    DocumentRoot /www/wwwroot/mywebdir
    ServerName www.Webtest.com
    ServerAlias www.Webtest.com
    <Directory "/www/wwwroot/mywebdir/">
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog "| /usr/local/httpd-2.2.15/bin/rotatelogs /www/wwwroot/mywebdir/Webtest_logs/%Y%m%d_Webtest.com_error_log 86400 480"
    CustomLog "| /usr/local/httpd-2.2.15/bin/rotatelogs /www/wwwroot/mywebdir/Webtest_logs/%Y%m%d_Webtest.com_access_log 86400 480" combined
</VirtualHost>

3. 重新啓動httpd 服務

# /usr/local/httpd-2.2.15/bin/apachectl -k restart 

4.查看日誌是否正常分割:

[root@version logs]# ll
-rw-r--r-- 1 root root    153 Sep 11 15:02 15_02_30_access_log
-rw-r--r-- 1 root root    420 Sep 11 15:03 15_03_00_access_log
-rw-r--r-- 1 root root    980 Sep 11 15:05 15_05_30_access_log
-rw-r--r-- 1 root root     70 Sep 11 15:06 15_06_00_access_log
-rw-r--r-- 1 root root     83 Sep 11 15:08 15_08_30_access_log
-rw-r--r-- 1 root root    384 Sep 11 15:45 15_45_30_access_log
-rw-r--r-- 1 root root   2000 Sep 11 15:48 15_48_30_access_log
-rw-r--r-- 1 root root   1090 Sep 11 15:00 2019_09_11_access_log
-rw-r--r-- 1 root root  41481 Sep  3 12:39 access_log
-rw-r--r-- 1 root root 904431 Sep 11 15:48 error_log

5. rotatelogs 使用幫助

1. 簡述:rotatelogs 是 Apache 2.2 中自帶的管道日誌程序。
2. 基本語法格式
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
3. 選項:
選項(Option) 描述
-l: 使用本地時間代替GMT時間作爲時間基準。
logfile 它加上基準名就是日誌文件名。如果logfile中包含”%”,則它會被視爲用於strftime()的格式字符串;否則它會被自動加上以秒爲單位的”.nnnnnnnnnn”後綴。這兩種格式都表示新的日誌開始使用的時間。
rotationtime 日誌文件分割以爲單位的間隔時間。
offset 相對於UTC的時差的分鐘數。如果省略,默認爲”0″並使用UTC時間。比如,要指定UTC時差爲”-5小時”的地區的當地時間,則此參數應爲”-300″。由於北京時間爲+8時間,因此,應設置爲480,保持日誌時間和本地時間一致,如時間同步開啓,則可忽略此參數
filesizeM 指定以filesizeM文件大小分割,而不是按照時間或時差分割。單位爲K,M,G
rotatelogs 常用:
CustomLog "| bin/rotatelogs  logs/%Y_%m_%d.access.log 86400 480" combined  # 按天分割日誌 
// 或者
CustomLog "| bin/rotatelogs  logs/%Y_%m_%d.access.log 2M" combined  # 按照文件2M 大小分割

2. Thirty party Tools—— Cronolog 日誌分割

1. Cronolog 工具源碼安裝:

[root@version sbin]# tar -xf cronolog-1.6.2.tar.gz  # 解壓源碼package
[root@version sbin]# cd cronolog-1.6.2      
[root@version sbin]# ./configure --prefix=/usr/local/cronolog   # 預編譯
[root@version sbin]# make && make install     # 編譯並安裝
[root@version sbin]# cd /usr/local/cronolog/sbin/
[root@version sbin]# ./cronolog -V     # 驗證安裝   
cronolog version 1.6.2                 # 安裝Successful

2. 修改配置文件(示例爲了效果,每訪問一次,就會生成一個新的日誌: # %Y%m%d 按天生成)

# ErrorLog "| /usr/local/cronolog/sbin/cronolog /opt/httpd-2.2.15/logs/%H_%M_%S_error_log"     
#CustomLog "| /usr/local/cronolog/sbin/cronolog /opt/httpd-2.2.15/logs/%H_%M_%S_access_log" combined

3. 重新啓動httpd 服務

# /usr/local/httpd-2.2.15/bin/apachectl -k restart 

4. 查看日誌是否正常分割:

[root@version logs]# ls -l
-rw-r--r-- 1 root root    192 Sep 11 18:01 18_01_39_access_log
-rw-r--r-- 1 root root    192 Sep 11 18:02 18_02_15_access_log
-rw-r--r-- 1 root root    192 Sep 11 18:02 18_02_27_access_log
drwxr-xr-x 2 root root   4096 Sep 11 17:20 bak
-rw-r--r-- 1 root root 906780 Sep 11 18:02 error_log

附錄:

1. 禁用apache 的log,編輯 httpd.conf :

ErrorLog /dev/null  #禁用錯誤日誌
CustomLog /dev/null common  #禁用訪問日誌

2. 注意:使用 cronolog 工具分割日誌時如果日誌是放在某個不存在的路徑則會自動創建目錄,而使用 rotatelogs 時不能自動創建。

3. Apache 日誌記錄格式

  • LogFormat、CustomLog指令,是定製日誌文件的格式。

  • LogFormat指令定義格式併爲格式指定一個名字,方便可以直接引用這個名字。

  • CustomLog指令設置日誌文件,並指明日誌文件所用的格式(通常通過格式的名字)。
    例如,在默認的httpd.conf文件中:

    #  .------------------------- LogFormat 指令,定義日誌記錄格式
    #  |         .---------------- 遠程主機地址
    #  |         |  .----------------遠程登錄的名字
    #  |         |  |   .---------------- 遠程用戶
    #  |         |  |   |  .---------------輸出標準時間格式 
    #  |         |  |   |  |    .------------請求的第一行
    #  |         |  |   |  |    |    .--------後面的請求(status_code)
    #  |         |  |   |  |    |    |   .----------- 發送數據大小
    #  |         |  |   |  |    |    |   |   .-------- 日誌格式名稱
    # LogFormat "%h %l %u %t \"%r\" %>s %b" common
    

    該指令創建了一種名爲“common”的日誌格式,日誌的格式在雙引號包圍的內容中指定。格式字符串中的每一個變量代表着一項特定的信息,這些信息按照格式串規定的次序寫入到日誌文件。

    Apache常用格式串的變量及其意義,
    變量 描述
    %…a: 遠程IP地址
    %…A: 本地IP地址
    %…B: 已發送的字節數,不包含HTTP頭
    %…b: CLF格式的已發送字節數量,不包含HTTP頭。例如當沒有發送數據時,寫入‘-’而不是0。
    %…f: 文件名字
    %…h: 遠程主機地址
    %…H: 請求的協議。
    %…l: 遠程登錄名字(來自identd,如提供的話)
    %…m: 請求的方法
    %…p: 服務器響應請求時使用的端口
    %…P: 響應請求的子進程ID。
    %…q: 查詢字符串(如果存在查詢字符串,則包含“?”後面的部分;否則,它是一個空字符串。)
    %…r: 請求的第一行
    %…s: 狀態。對於進行內部重定向的請求,這是指原來請求的狀態。如果用%…>s,則是指後來的請求。
    %…t: 以公共日誌時間格式表示的時間(或稱爲標準英文格式)
    %…T: 爲響應請求而耗費的時間,以秒計
    %…u: 遠程用戶(來自auth;如果返回狀態(%s)是401則可能是僞造的)
    %…U: 用戶所請求的URL路徑
    %…v: 響應請求的服務器的ServerName
    %…{format}t: 以指定格式format表示的時間

    注:“…”表示一個可選的條件。如果沒有指定條件,則變量的值將以“-”取代

    4. 定製日誌記錄

    定製日誌中記錄某些特定的、已定義的信息,這時就要用到“…”。如果在“%”和變量之間放入了一個或者多個HTTP狀態代碼,則只有當請求返回的狀態代碼屬於指定的狀態代碼之一時,變量所代表的內容纔會被記錄。

1. 記錄的是網站的所有無效鏈接,那麼可以使用:
LogFormat %401{Referer}i BrokenLinks
2. 記錄那些狀態代碼不等於指定值的請求,只需加入一個“!”符號即可:
LogFormat %!200U SomethingWrong
3. 專門記錄某個爬蟲記錄
SetEnvIfNoCase User-Agent Baiduspider baidu_robot
LogFormat “%h %t \”%r\” %>s %b” robot
CustomLog “|$HTTP_HOME/bin/rotatelogs $HTTP_HOME/logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot

這樣在logs目錄下,就會每天產生baidu_年月日.txt的日誌了,每條的記錄和下面的類似:

 #   61.135.168.14 [22/Oct/2008:22:21:26 +0800] “GET /  HTTP/1.1″ 200 8427
4. 排除日誌記錄圖片、js、css、swf文件
<FilesMatch "\.(ico|gif|jpg|png|bmp|swf|css|js)">
  SetEnv IMAG 1
</FilesMatch>
CustomLog "|cronolog logs/access_%Y%m%d.log" combined env=!IMAG

參考:

  1. Apache httpd document
  2. Apache日誌配置參數詳細說明
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章