linux logrotate rsyslog 日志回滾


轉 : https://www.cnblogs.com/yorkyang/p/5943618.html

rsyslog和logrotate

 
  • 簡介

  rsyslog 是一個 syslogd 的多線程增強版。
  現在Fedora和Ubuntu, rhel6默認的日志系統都是rsyslog了
  rsyslog負責寫入日志, logrotate負責備份和刪除舊日志, 以及更新日志文件

  可以用一台服務器當日志服務器,別的機子的日志上傳到上面去,也是用syslog功能,具體請查閱相關資料

  • 安裝

  yum install rsyslog rsyslog-mysql  logrotate

  一般系統都已裝好

我們先看一下它的進程::
[root@centos ~]# ps -ef | grep rsyslogd | grep -v grep
root      1343    1  0 12:09 ?        00:00:00 /sbin/rsyslogd -c 5
從上面命令的輸出結果看到rsyslog執行時使用的參數是-c 5.
它的意思是指定rsyslog運行(兼容)的版本號, 這個參數必須是第一個參數, 當然也可以省略, 默認為-c0, (命令行兼容sysklogd)
這個參數是在文件/etc/sysconfig/rsyslog中指定

# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-c 5"

 

 

日志輪替logrotate:
程序:/usr/sbin/logrotate 
配置:/etc/logrotate.conf  和/etc/logrotate.d/ 
在crontab里排期: /etc/cron.daily/logrotate

11、/etc/logrotate.d下文件說明:
例:
[root@www ~]# vi /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \
/var/log/boot.log /var/log/cron {
  sharedscripts
  postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
  endscript
}

prerotate:在啟動 logrotate 之前進行的指令,例如修改登錄檔的屬性等動作; 
postrotate:在做完 logrotate 之后啟動的指令,例如重新啟動 (kill -HUP) 某個服務!
sharedscripts .... endscript 內放腳本。

#dateext 表示切換后的日志文件會附加上一個短橫線和YYYYMMDD格式的日期,如果沒有這個配置項則會附加一個小數點加一個數字序號
#copytruncate     表示在復制當前日志文件后,將日志文件清空;而不是將當前日志文件改名后創建一個新的

13、測試是否成功,強制輪替:[root@www ~]# logrotate -vf /etc/logrotate.d/admin

14、注意:系統是自動一天檢查一次,如果一天還沒到,但達到size了也不輪替,如果要每小時檢查一次,就得加入crontab里

 

格式::
日志設備(類型).(連接符號)日志級別   日志處理方式(action)
日志設備(可以理解為日志類型):
———————————————————————-
auth        –pam產生的日志
authpriv    –ssh,ftp等登錄信息的驗證信息
cron        –時間任務相關
kern        –內核
lpr         –打印
mail        –郵件
mark(syslog)–rsyslog服務內部的信息,時間標識
news        –新聞組
user        –用戶程序產生的相關信息
uucp        –unix to unix copy, unix主機之間相關的通訊
local 1~7   –自定義的日志設備
日志級別:
———————————————————————-
debug       –有調式信息的,日志信息最多
info        –一般信息的日志,最常用
notice      –最具有重要性的普通條件的信息
warning     –警告級別
err         –錯誤級別,阻止某個功能或者模塊不能正常工作的信息
crit        –嚴重級別,阻止整個系統或者整個軟件不能正常工作的信息
alert       –需要立刻修改的信息
emerg       –內核崩潰等嚴重信息
none        –什么都不記錄
從上到下,級別從低到高,記錄的信息越來越少
詳細的可以查看手冊: man 3 syslog
連接符號
———————————————————————-
.xxx: 表示大於等於xxx級別的信息
.=xxx:表示等於xxx級別的信息
.!xxx:表示在xxx之外的等級的信息
Actions
———————————————————————-
1. 記錄到普通文件或設備文件::
*.*     /var/log/file.log   # 絕對路徑
*.*     /dev/pts/0
測試: logger -p local3.info ‘KadeFor is testing the rsyslog and logger ‘   logger 命令用於產生日志
2. 轉發到遠程::
*.* @192.168.0.1            # 使用UDP協議轉發到192.168.0.1的514(默認)端口
*.* @@192.168.0.1:10514     # 使用TCP協議轉發到192.168.0.1的10514(默認)端口
3. 發送給用戶(需要在線才能收到)::
*.*   root
*.*   root,kadefor,up01     # 使用,號分隔多個用戶
*.*   *     # *號表示所有在線用戶
4. 忽略,丟棄::
local3.*   ~    # 忽略所有local3類型的所有級別的日志
5. 執行腳本::
local3.*    ^/tmp/a.sh      # ^號后跟可執行腳本或程序的絕對路徑
# 日志內容可以作為腳本的第一個參數.
# 可用來觸發報警
.. note::
日志記錄的順序有先后關系!
======================================================================
一個標准的簡單的配置文件
======================================================================
::
*.info;mail.none;authpriv.none;cron.none      /var/log/messages
authpriv.*                                    /var/log/secure
mail.*                                        /var/log/maillog
cron.*                                        /var/log/cron
*.emerg                                       *
uucp,news.crit                                /var/log/spooler
local7.*                                      /var/log/boot.log
======================================================================
實例: 指定日志文件, 或者終端
======================================================================
[root@kadefor ule-sa3]# vi /etc/rsyslog.conf
[root@kadefor ule-sa3]# grep local3 !$
grep local3 /etc/rsyslog.conf
local3.*                                                /var/log/local3.log
[root@kadefor ule-sa3]# rm -rf /var/log/local3.log
[root@kadefor ule-sa3]# /etc/init.d/rsyslog reload
Reloading system logger…                                 [  OK  ]
[root@kadefor ule-sa3]# ls /var/log/local3.log
/var/log/local3.log
[root@kadefor ule-sa3]# logger -t ‘LogTest’ -p local3.info ‘KadeFor is testing the rsyslog and logger’
[root@kadefor ule-sa3]# cat /var/log/local3.log
Jun 10 04:55:52 kadefor LogTest: KadeFor is testing the rsyslog and logger
[root@kadefor ule-sa3]#
自己實驗日志發送給某個終端
======================================================================
實例:  過濾特定的日志到文件, 忽略(丟棄)包含某個字符串的日志
======================================================================
# 過濾日志, 由:號開頭
:msg, contains, “error” /var/log/error.log
:msg, contains, “error” ~         # 忽略包含error的日志
:msg, contains, “user nagios”   ~
:msg, contains, “user kadefor”   ~
:msg, contains, “module-alsa-sink.c: ALSA woke us up to write new data to the device, but there was actually nothing to write” ~
local3.*    ~
PS.
&   ~       # 忽略所有的日志
把包含’oracle’的日志保存在/var/log/oracle.log
======================================================================
實例:  使用模板來定義日志格式
======================================================================
定義默認的日志格式:

 
  1. $template myFormat,”%rawmsg%\n”  

  2. $ActionFileDefaultTemplate myFormat  

  3. #如果不要$ActionFileDefaultTemplate myFormat這一行, 就需要像這樣來使用模板:

  4. #在日志文件后添加模板名, 並用;號分隔

  5. $template myFormat,”%rawmsg%\n”  

  6. # The authpriv file has restricted access.

  7. authpriv.*      /var/log/secure;myFormat  

  8. # Log all the mail messages in one place.

  9. mail.*          /var/log/maillog;myFormat  

  10. # Log cron stuff

  11. cron.*          /var/log/cron;myFormat  

  12. # Everybody gets emergency messages

  13. *.emerg                                       *  

  14. # Save news errors of level crit and higher in a special file.

  15. uucp,news.crit  /var/log/spooler;myFormat  

  16. # Save boot messages also to boot.log

  17. local7.*        /var/log/boot.log;myFormat  

======================================================================
實例: remote log 遠程發送與接收:
======================================================================
如果要修改為非514的端口, 需要設置selinux
只要在rsyslog.conf中加入
*.* @192.168.0.10
*.* @192.168.0.10:10514     # 帶端口號
*.* @@192.168.0.10      # TCP
但是沒有定義保存在遠程的哪一個文件啊?
其實保存在什么文件, 那是遠程日志服務器接收到日志之后它自己的事情了.
例1:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
———————————————————————-
Client(send):
———————————————————————-
::
local3.*   @@192.0.2.1:10514
# if you need to forward to other systems as well, just
# add additional config lines:
# *.*   @@other-server.example.net:10514
# Log anything (except mail) of level info or higher.
# Don’t log private authentication messages!
*.info;mail.none;authpriv.none;cron.none      /var/log/messages
# The authpriv file has restricted access.
authpriv.*                                    /var/log/secure
# Log all the mail messages in one place.
mail.*                                        /var/log/maillog
# Log cron stuff
cron.*                                        /var/log/cron
# Everybody gets emergency messages
*.emerg                                       *
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                /var/log/spooler
# Save boot messages also to boot.log
local7.*                                      /var/log/boot.log
———————————————————————-
Server(receive): <1>
———————————————————————-
::
# for TCP use:
$modload imtcp
$InputTCPServerRun 10514
# for UDP use:
$modload imudp
$UDPServerRun 514
# Log anything (except mail) of level info or higher.
# Don’t log private authentication messages!
*.info;mail.none;authpriv.none;cron.none      /var/log/messages
# The authpriv file has restricted access.
authpriv.*                                    /var/log/secure
# Log all the mail messages in one place.
mail.*                                        /var/log/maillog
# Log cron stuff
cron.*                                        /var/log/cron
# Everybody gets emergency messages
*.emerg                                       *
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                /var/log/spooler
# Save boot messages also to boot.log
local7.*                                      /var/log/boot.log
local3.*    /var/log/local3.log     # 測試用
例2 (僅做了解, 不做要求)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#配置服務端(接收)
———————————————————————-
vi /etc/rsyslog.conf        #在文件開始加上,同時確保514端口能夠被客戶端用tcp訪問
$ModLoad imtcp.so              # needs to be done just once #使用tcp方式
$InputTCPMaxSessions 500    # tcp接收連接數為500個
$InputTCPServerRun 514      # tcp接收信息的端口
$template logformat,”%TIMESTAMP:::date-mysql% %FROMHOST-IP%%msg%\n”     # 定義一個名為logformat模板, 為信息加上日志時間
$template DynFile,”/var/log/tlog%$year%%$month%%$day%.log”     # 定義日志文件的名稱,按照年月日
:rawmsg, contains, “sdns_log” ?DynFile;logformat    # 把rawmsg(也可以使用msg)日志中包含sdns_log標志的信息寫到DynFile定義的日志文件里
:rawmsg, contains, “sdns_log”  ~                     # 這個表示丟棄包含sdns_log標志的信息, 一般都加上它, 以免多個日志文件記錄重復的日志
#配置客戶端(發送)
———————————————————————-
vi /etc/rsyslog.conf  #在文件開始加上
#把包含sdns_log的信息通過tcp發到192.168.1.2 @@表示tcp @表示udp
:rawmsg, contains, “sdns_log”       @@192.168.1.2       # 默認514端口
#這個表示丟棄包含sdns_log標志的信息,防止這個信息寫到本機的/var/log/message
:rawmsg, contains, “sdns_log”       ~
#測試
———————————————————————-
在客戶端上執行
logger -p user.info “sdns_log 34334″
在服務端的/var/log/目錄里是否有tlog*日志產生
補充:
———————————————————————-
如果要把不同服務器發送過來的日志保存到不同的文件, 可以這樣操作:
:fromhost-ip, isequal, “192.168.0.160″ /var/log/host160.log
:FROMHOST-IP, isequal, “192.168.0.161″ /var/log/host161.log
:FROMHOST-IP, startswith, “192.168.1.” /var/log/network1.log
:FROMHOST-IP, startswith, “192.168.2.” /var/log/network2.log
練習:
======================================================================
1. 實現把ssh服務的日志自定義保存到/var/log/newsshd.log (先不做)
2. mail日志保存在遠程日志服務器/var/log/newmail.log
3. 過濾日志, 如果日志包含有”daydayup”, 則執行腳本/tmp/a.sh
腳本內容:
#!/bin/bash
echo  “KO::** $1″ > /dev/tty2
======================================================================
logrotate服務
======================================================================
rotate 輪換,日志切換
logrotate服務的啟動方式
logrotate是一個日志管理程序,用來把舊的日志文件刪除(備份),並創建新的日志文件,這個過程稱為“轉儲”。我們可以根據日志的大小,或者根據其使用的天數來轉儲。
logrotate 的執行由crond服務實現。在/etc/cron.daily目錄中,有個文件logrotate,它實際上是個shell script,用來啟動logrotate。logrotate程序每天由cron在指定的時間(/etc/crontab)啟動。
因此,使用ps是無法查看到logrotate的。如果它沒有起來,就要查看一下crond服務有沒有在運行。
在執行logrotate時,需要指定其配置文件/etc/logrotate.conf
這 個配置文件的注釋寫得很清楚,沒有必要再羅嗦了。只想強調下面這行,它的作用包含存放在/etc/logrotate.d目錄下面的配置文件,不可或缺。 如果你安裝了一個新的服務,它的日志轉儲的規則可以建立一個專門的配置文件,放在/etc/logrotate.d下面。它其實也因為下面的這句話,在 logrotate服務啟動時被讀取。
每個存放在/etc/logrotate.d目錄里的文件,都有上面格式的配置信息。在{}中定義的規則,如果與logrotate.conf中的沖突,以/etc/logrotatate.d/中的文件定義的為准。
logrotate啟動腳本放在 /etc/cron.daily/logrotate 中,可人工執行命令進行測試:
/usr/sbin/logrotate -f /etc/logrotate.conf
dateext表示轉儲文件會以日期來結束*
::
[root@kadefor log]# vim /etc/logrotate.conf
# see “man logrotate” for details
# rotate log files weekly
weekly          –每周輪轉一次
# keep 4 weeks worth of backlogs
rotate 4        –保留四個
# create new (empty) log files after rotating old ones
create          –rotate后,創建一個新的空文件
# uncomment this if you want your log files compressed
#compress       –默認是不壓縮的
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d        –這個目錄下面配置文件生效
# no packages own wtmp — we’ll rotate them here
/var/log/wtmp {             –定義/var/log/wtmp這個日志文件
monthly                 –每月輪轉一次,取代了上面的全局設定的每周輪轉一次
minsize 1M              –定義日志必須要大於1M大小才會去輪轉
create 0664 root utmp   –新的日志文件的權限,屬主,屬主
rotate 1                –保留一個,取代了上面的全局設定的保留四個
}
/var/log/btmp {
missingok       –如果日志丟失, 不報錯
monthly
create 0600 root utmp
rotate 1
}
::
# sample logrotate configuration file
compress
# 全局設置, 壓縮
/var/log/messages {
rotate 5     # 保留5份日志
weekly       # 每周輪換一次
postrotate   # 輪換之后重啟syslogd服務
/usr/bin/killall -HUP syslogd
# rhel6中為:/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
# 可查看/etc/logrotate.d/下的配置文件
endscript
}
“/var/log/httpd/access.log” /var/log/httpd/error.log {   #  指定多個文件, 如果有特殊字符需要用單引號
rotate 5
mail www@my.org
size 100k        # 超過100k后切換日志, 並把老的日志發送郵件給www@my.org
sharedscripts    # 共享腳本. 下面的postrotate腳本只運行一次.
postrotate
/usr/bin/killall -HUP httpd
endscript
}
/var/log/news/* {    # 少用通配符, 因會它會包括已經切換過的日志, 要用的話最好在*號后加上擴展名, 如*.log
monthly
rotate 2
olddir /var/log/news/old
missingok
postrotate
kill -HUP ‘cat /var/run/inn.pid‘
endscript
nocompress
}
例:
修改/etc/logrotate.conf
/var/log/wtmp {
monthly
minsize 10k
create 0664 a b
rotate 2
}
logrotate -f /etc/logrotate.conf  –強制輪轉
logrotate -vf /etc/logrotate.conf    –再加一個-v參數查看輪轉的過程
———————————
[root@kadefor log]# vim /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts   –表示切換時腳本只執行一次
postrotate      –表示rotate后執行的腳本
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript       –表示腳本結束
}
[root@kadefor log]# logger -t ‘aaaa’ ‘bbbbbb’–在日志里加一個內容tag和內容
[root@kadefor log]# tail /var/log/messages
Jun 12 19:38:55 kadefor dhclient[3166]: bound to 192.168.1.101 — renewal in 3384 seconds.
Jun 12 20:34:22 kadefor aaaa: bbbbbb

 

 

 

注意,prerotate和postrotate必須和sharescripts...endscript一起用。上面的信息表示日志文件轉儲后,重啟rsyslogd服務。

      每個存放在/etc/logrotate.d目錄里的文件,都有上面格式的配置信息。在{}中定義的規則,如果與logrotate.conf中的沖突,以/etc/logrotatate.d/中的文件定義的為准


免責聲明!

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



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