1. 程式人生 > >linux學習45-日誌管理

linux學習45-日誌管理

日誌管理

1 日誌介紹

  • 日誌:

    1. 記錄內容:
      時間,地點,人物,事件
    2. 日誌級別:
      事件的關鍵性程度,Loglevel
  • 事件記錄格式:
    日期時間 主機程序[pid]: 事件內容

    [[email protected] ~]$cat /var/log/messages
    Oct 25 20:34:27 hai7-8 dhclient[53598]: DHCPACK from 172.20.0.1 (xid=0x12fbdb30)
    |    日期時間   | 主機名 |    程序編號    |         事件內容          
    
  • C/S架構
    通過TCP或UDP協議的服務完成日誌記錄傳送,將分佈在不同主機的日誌實現集中管理

  • CentOS6和CentOS7的日誌管理程式rsyslog

    1. 檢視版本資訊
      [[email protected] $]$rpm -qi rsyslog
      
    2. 特性
      1. 多執行緒
      2. 支援UDP, TCP, SSL, TLS, RELP
      3. MySQL, PGSQL, Oracle實現日誌儲存
      4. 強大的過濾器,可實現過濾記錄日誌資訊中任意部分
      5. 自定義輸出格式
    3. rsyslog術語(見man logger)
      1. facility:設施,從功能或程式上對日誌進行歸類
        auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, local0-local7, syslog
      2. Priority:優先級別,從低到高排序
        debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
        參看幫助:man 3 syslog

2 日誌配置

  • 程式包:rsyslog

  • rsyslog包內主要檔案

    1. 主程式
      /usr/sbin/rsyslogd
    2. 配置檔案
      /etc/rsyslog.conf,/etc/rsyslog.d/*.conf
    3. 庫檔案(各種模組)
      /lib64/rsyslog/*.so
  • 埠號:udp514和tcp514

  • 配置檔案格式:由三部分組成

    1. MODULES:相關模組配置,通常不需要修改
    2. GLOBAL DIRECTIVES:全域性配置,通常不需要修改
    3. RULES:日誌記錄相關的規則配置
      [[email protected] ~]$vim /etc/rsyslog.conf
      #### RULES ####
      '主日誌,`*.info` 為一個組合,*表示哪個設施發生的事,info表示級別比info高的級別都要記錄,中間以點分隔,用來分隔多個組合'
      *.info;mail.none;authpriv.none;cron.none       /var/log/messages
      '身份驗證日誌'
      authpriv.*                                     /var/log/secure   
      '郵件日誌,-表示非同步寫入'
      mail.*                                         -/var/log/maillog   
      '計劃任務記錄'
      cron.*                                         /var/log/cron   
      '當發生emerg級別以上級別的事件,將給所有登入的使用者發訊息'
      *.emerg                                        :omusrmsg:*    
      'uucp和news類別當發生crit級別事件時,放入/var/log/spooler檔案中'
      uucp,news.crit                                 /var/log/spooler  
      '自定義級別7,記錄核心的資訊放在/var/log/boot.log'
      local7.*                                       /var/log/boot.log     
      |facility.Priority|                           |日誌存放地點|
      
  • RULES配置格式
    facility.priority; facility.priority… target

    1. facility
      *: 所有的facility
      facility1,facility2,facility3,...:指定的facility列表
    2. priority
      *:所有級別
      none:沒有級別,即不記錄
      PRIORITY:指定級別(含)以上的所有級別
      =PRIORITY:僅記錄指定級別的日誌資訊
    3. target
      檔案路徑:通常在/var/log/,檔案路徑前的-表示非同步寫入
      使用者:將日誌事件通知給指定的使用者,* 表示登入的所有使用者,與許可權有關係,普通使用者無法得到通知
      [[email protected] ~]$vim /etc/rsyslog.conf
      #### RULES ####
      local6.*              root
      
  • 管道:| COMMAND,轉發給其它命令處理

  • 日誌伺服器:@host,把日誌送往至指定的遠端伺服器記錄

    1. 在遠端伺服器上開啟udp的514埠
      [[email protected]  ~]$vim /etc/rsyslog.conf
      $ModLoad imudp           <==啟用udp介面
      $UDPServerRun 514
      #$ModLoad imtcp          <==tcp介面,使用哪種協議就啟用哪一種      
      #$InputTCPServerRun 514
      
    2. 以ssh服務為例,ssh預設記錄的日誌為authpriv型別,在本地伺服器上修改日誌配置檔案
      [[email protected] ~]$vim /etc/rsyslog.conf
      authpriv.*            /var/log/secure   <==註釋掉此項將不往本機發送   
      authpriv.*            @192.168.50.106   <==udp協議,指定為遠端主機ip
      authpriv.*            @@192.168.50.106  <==tcp協議指定為遠端主機ip格式,2個@
      
  • 自定義日誌檔案存放地點
    如果軟體本身不支援rsyslog日誌,需要基於rsyslog的API介面來開發才可以
    以ssh為例

    1. 在rsyslog配置檔案RULES部分,增加一行自定義規則
      [[email protected] ~]$vim /etc/rsyslog.conf
      #### RULES ####
      local6.*            /var/log/sshtest.log    <==增加行
      
    2. 修改ssh配置檔案中定義日誌記錄項
      [[email protected] ~]$vim /etc/ssh/sshd_config
      #SyslogFacility AUTHPRIV   <==原定義項,註釋掉
      SyslogFacility local6      <==自定義項
      
    3. 重啟ssh及日誌服務
      [[email protected] ~]$systemctl restart sshd
      [[email protected] ~]$systemctl restart rsyslog
      
  • 測試工具:‘logger’
    生成日誌資訊

    1. '生成一個新日誌資訊'
    [[email protected] ~]$logger "This is a log"
    2. '/var/log/messages記錄了大部分應用程式以及作業系統發生的事'
    [[email protected] ~]$tail -f /var/log/messages 
    Oct 26 07:53:13 hai7-6 root: This is a log   <==觸發生成的日誌資訊
    
  • 其他日誌

    1. /var/log/secure
      系統安裝日誌,文字格式,應週期性分析
    2. /var/log/btmp
      當前系統上,使用者的失敗嘗試登入相關的日誌資訊,二進位制格式,lastb命令進行檢視
      [[email protected] ~]$lastb
      root     ssh:notty    192.168.50.97    Fri Oct 26 09:19 - 09:19  (00:00)
      
    3. /var/log/wtmp
      當前系統上,使用者正常登入系統的相關日誌資訊,二進位制格式,last命令可以檢視
      [[email protected] ~]$last
      reboot   system boot  3.10.0-862.el7.x Wed Sep 19 16:23 - 09:19 (36+16:56)  
      (36+16:56),表示運行了多久,在什麼時間登入
      
    4. /var/log/lastlog
      每一個使用者最近一次的登入資訊,二進位制格式,lastlog命令可以檢視
      [[email protected] ~]$lastlog
      gdm    :0     Tue Sep 25 07:45:51 +0800 2018   <==此賬號為圖形介面部署時用到,變相說明系統安裝時間
      
    5. /var/log/dmesg
      系統引導過程中的日誌資訊,文字格式,使用dmesg命令檢視,或者cat檔案
    6. /var/log/messages
      系統中大部分的資訊
    7. /var/log/anaconda :
      anaconda的日誌,安裝系統過程日誌;centos6中此日誌在/var/log目錄下,anaconda開頭的檔案

3 日誌管理journalctl(centos7)

Systemd統一管理所有Unit 的啟動日誌,帶來的好處就是,可以只用journalctl一個命令,檢視所有日誌(核心日誌和應用日誌)。日誌的配置檔案/etc/systemd/journald.conf

  • journalctl用法
    1. 檢視所有日誌(預設情況下,只儲存本次啟動的日誌)
      journalctl
    2. 檢視核心日誌(不顯示應用日誌)
      journalctl -k
    3. 檢視系統本次啟動的日誌
      journalctl -b
      journalctl -b -0
    4. 檢視上一次啟動的日誌(需更改設定)
      journalctl -b -1
    5. 檢視指定時間的日誌
      1. journalctl–since=“2017-10-30 18:10:30”
      2. journalctl–since “20 min ago”
      3. journalctl–since yesterday
      4. journalctl–since “2017-01-10” --until “2017-01-11 03:00”
      5. journalctl–since 09:00 --until “1 hour ago”
    6. 顯示尾部的最新10行日誌
      journalctl -n
    7. 顯示尾部指定行數的日誌
      journalctl -n 20
    8. 實時滾動顯示最新日誌
      journalctl -f
    9. 檢視指定服務的日誌
      journalctl /usr/lib/systemd/systemd
    10. 檢視指定程序的日誌
      journalctl_PID=1
    11. 檢視某個路徑的指令碼的日誌
      journalctl /usr/bin/bash
    12. 檢視指定使用者的日誌
      journalctl_UID=33 --since today
    13. 檢視某個Unit 的日誌
      1. journalctl -u nginx.service
      2. journalctl -u nginx.service --since today
    14. 實時滾動顯示某個Unit 的最新日誌
      journalctl -u nginx.service -f
    15. 合併顯示多個Unit 的日誌
      journalctl -u nginx.service -u php-fpm.service --since today
  1. 日誌管理journalctl
    1. 檢視指定優先順序(及其以上級別)的日誌,共有8級
      0: emerg
      1: alert
      2: crit
      3: err
      4: warning
      5: notice
      6: info
      7: debug
    2. 示例
      journalctl -p err -b
      journalctl -p 3 -b
  2. 日誌輸出格式
    1. 預設分頁輸出,–no-pager 改為正常的標準輸出
      journalctl --no-pager
    2. 以JSON 格式(單行)輸出
      journalctl-b -u nginx.service -o json
    3. 以JSON 格式(多行)輸出,可讀性更好
      journalctl-b -u nginx.serviceqq -o json-pretty
    4. 顯示日誌佔據的硬碟空間
      journalctl --disk-usage
    5. 指定日誌檔案佔據的最大空間
      journalctl --vacuum-size=1G
    6. 指定日誌檔案儲存多久
      journalctl --vacuum-time=1years

4. 將日誌記錄於MySQL中

  • 需要安裝的程式包
    rsyslog-mysql
  • 搭建過程
    1. rsyslog伺服器上執行的操作
      1. 安裝模組mysql模組相關的程式包
        [[email protected] ~]$yum install rsyslog-mysql
        
      2. 檢視程式包包含檔案
        [[email protected] ~]$rpm -ql rsyslog-mysql
        /usr/lib64/rsyslog/ommysql.so
        'rsyslog所有模組都放在/usr/lib64/rsyslog/中'  
        /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql  
        'sql指令碼,將在mysql中建立的資料庫表等,需要匯入mysq'
        
      3. sql指令碼拷貝給資料庫伺服器,建立rsyslog伺服器的專用資料庫
        [[email protected] ~]$scp /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql  192.168.50.97:/data
        
      4. 修改rsyslog配置檔案,載入支援mysql的模組
        [[email protected] ~]$vim /etc/rsyslog.conf
        #### MODULES ####      <==在模組部分加入新增模組 
        # Provides TCP syslog reception
        1. $ModLoad imtcp         <==啟用tcp介面,將註釋去掉
           $InputTCPServerRun 514
        2. $ModLoad  ommysql      <==$ModLoad表示載入,後面跟模組名稱不需要.so字尾,/usr/lib64/rsyslog/下的模組不需要寫路徑
        #### RULES ####           <==在規則部分定義模組轉發功能
        3. *.info;mail.none;authpriv.none;cron.none        :ommysql:192.168.50.107,Syslog, syslog,centos
        |           facility.priority           |      |  模組名 |    資料庫ip,  |資料庫名,|賬號,|資料庫密碼| 
        
    2. 資料庫伺服器
      1. 在資料庫伺服器上為rsyslog建立資料庫及表
        [[email protected] data]$mysql < mysql-createDB.sql
        
      2. 在資料庫為rsyslog伺服器建立賬號
        [[email protected] data]$mysql -e "GRANT ALL ON Syslog.* TO [email protected]'192.168.50.97' IDENTIFIED BY 'centos'" 
        
    3. 測試,使用logger命令生成日誌

5. web頁面展示資料庫日誌(loganalyzer)

  • 搭建環境
    1. lamp或者lnmp架構
    2. 以模組方式搭建
    3. 額外需要的程式 php-gd,增加動態繪圖功能
  • 搭建過程
    1. 在rsyslog伺服器上準備amp或nmp組合
      [[email protected] ~]$yum install httpd php php-mysql  php-gd  -y   
      
    2. 安裝LogAnalyzer,官網獲取程式包,解壓
      [[email protected] ~]$tar xvf loganalyzer-4.1.6.tar.gz 
      
    3. 將解壓後生成的src目錄,拷貝到httpd頁面檔案目錄
      [[email protected] ~]$cp -ar loganalyzer-4.1.6/src/ /var/www/html/log
      
    4. 建立配置檔案
      1. '進入拷貝目錄'
      [[email protected] ~]$cd /var/www/html/log
      2. '建立配置檔案'
      [[email protected] ~]$touch config.php
      3. '授予許可權,這一步必須有,不然會報錯,官方指令碼要求為666,也可以手動授權寫許可權'
      [[email protected] /var/www/html/log]$chmod 666 config.php  
      根據環境可以授權寫許可權
      [[email protected] /var/www/html/log]$setfacl -m u:apache:w config.php
      
    5. 登入httpd頁面(http://192.168.50.110/log/ ),此實驗使用主機為192.168.50.110,前3步選擇預設,下一步就可以,第3步後直接跳轉到第7步,設定如下圖
      在這裡插入圖片描述
    6. 基於安全考慮,如果設定許可權為666,配置成功後要將許可權修改為644
      [[email protected] ~]$cd /var/www/html/log
      [[email protected] log]$chmod644 config.php
      

6. Logrotate日誌儲存

logrotate 程式是一個日誌檔案管理工具。用來把舊的日誌檔案刪除,並建立新的日誌檔案,稱為日誌轉儲或滾動。可以根據日誌檔案的大小,也可以根據其天數來轉儲,這個過程一般通過cron 程式來執行

  • 配置檔案

    1. 主配置檔案:/etc/logrotate.conf
    2. 子配置檔案:/etc/logrotate.d/
      /var/log/wtmp {
          monthly      			<==每個月生成一個新檔案
          create 0664 root utmp 	<==為舊檔案取一個新名字,給予許可權664
          minsize 1M    			<==最小達到1M,採取建立新的日誌檔案
          rotate 1    			<==保留1個版本
      }
      
  • 主要引數如下

    引數 描述
    compress 通過gzip 壓縮轉儲以後的日誌
    nocompress 不需要壓縮時,用這個引數
    copytruncate 用於還在開啟中的日誌檔案,把當前日誌備份並截斷
    nocopytruncate 備份日誌檔案但是不截斷
    create mode owner group 轉儲檔案,使用指定的檔案模式建立新的日誌檔案
    nocreate 不建立新的日誌檔案
    delaycompress和compress 一起使用時,轉儲的日誌檔案到下一次轉儲時才壓縮
    nodelaycompress 覆蓋delaycompress選項,轉儲並壓縮
    errors address 專儲時的錯誤資訊傳送到指定的Email 地址
    ifempty 即使是空檔案也轉儲,是預設選項
    notifempty 如果是空檔案的話,不轉儲
    mail address 把轉儲的日誌檔案傳送到指定的E-mail 地址
    nomail 轉儲時不傳送日誌檔案
    olddirdirectory 轉儲後的日誌檔案放入指定的目錄,必須和當前日誌檔案在同一個檔案系統
    noolddir 轉儲後的日誌檔案和當前日誌檔案放在同一個目錄下
    prerotate/endscript 在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行
    postrotate/endscript 在轉儲以後需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行
    daily 指定轉儲週期為每天
    weekly 指定轉儲週期為每週
    monthly 指定轉儲週期為每月
    size 大小指定日誌超過多大時,就執行日誌轉儲
    rotate count 指定日誌檔案刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份
    Missingok 如果日誌不存在,提示錯誤
    Nomissingok 如果日誌不存在,繼續下一次日誌,不提示錯誤