1. 程式人生 > >rsyslogd、syslog遠端傳輸、日誌儲存、轉存

rsyslogd、syslog遠端傳輸、日誌儲存、轉存

一、產生本地日誌

1、/etc/resolv.conf 配置檔案 local0~local7是使用者自定義的日誌
這裡我們使用local1,新增以下   local1.* /www/admin/admin/log/web_log 配置完需要重啟 rsyslogd程式  /etc/init.d/rsyslog restart

2、程式中用以下記入日誌     openlog("audit_as_cgi", LOG_PID, LOG_LOCAL1);
    syslog(LOG_DEBUG,"%s",write_buf);
    closelog();
audit_as_cgi :
是日誌字首

LOG_PID:每條日誌都包含程序號
LOG_LOCAL1:是我們自定義的日誌型別
LOG_DEBUG:日誌等級

3、產生的本地日誌,如下所示


二、遠端傳送日誌

rsyslog提供三個遠端日誌傳輸方式:

  • UDP: 資料包傳輸可信度不高
  • TCP: 資料包傳輸可信度比較高
  • RELP: 資料包傳輸可信度最高,避免資料丟失,比較新的協議,目前應用較少

關於RELP的更進一步瞭解可以參考 Using TLS with RELP

 RELP Input Module RELP Output Module (omrelp)

TCP配置和UDP類似,如下

Server端配置
/etc/rsyslog.conf
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
$AllowedSender TCP, 192.168.80.0/24

# 根據客戶端的IP單獨存放主機日誌在不同目錄       
$template Remote,"/var/log/syslog/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
# 排除本地主機IP日誌記錄,只記錄遠端主機日誌 :fromhost-ip, !isequal, "127.0.0.1" ?Remote & ~
Client端配置
/etc/rsyslog.conf ,這裡我們把使用者自定義的local1型別日誌傳送給2.108裝置
local1.*	    @@192.168.2.108:514

當然,如果你是用的之前老版本的syslogd程式,則傳送端不需要配置檔案,直接syslogd -R 伺服器地址即可,只不過syslogd好像是UDP協議的514埠,照樣可以用rsyslogd接收。

客戶端和服務端重啟相關服務即可在伺服器(192.168.2.108)端看的如下結果:


重啟rsyslogd之後如果沒有收到日誌,檢視防火牆是否開啟了514埠,沒有開啟就在伺服器端開啟514埠

 iptables -I INPUT -p tcp --dport 514 -j ACCEPT
 iptables -I OUTPUT -p tcp --dport 514 -j ACCEPT

三、日誌自動轉存-logrotate程式

logrotate是個十分有用的工具,它可以自動對日誌進行截斷(或輪循)、壓縮以及刪除舊的日誌檔案。例如,你可以設定logrotate,讓/var/log/foo日誌檔案每30天輪循,並刪除超過6個月的日誌。配置完後,logrotate的運作完全自動化,不必進行任何進一步的人為干預。另外,舊日誌也可以通過電子郵件傳送,不過該選項超出了本教程的討論範圍。

1、在/etc/logrotate.d/ 路徑下建立自己的日誌配置檔案,如下所示:

第一行:要管理的日誌檔案

daily: 按天轉存

dateext: 按日誌備份檔案

rotate: 共備份5份,之後會依次替換掉最舊的檔案

size=1M:當日志文件達到1M時,才備份

最後3句:必須重啟rsyslogd程式,否則日誌轉存之後,不會寫入最新的檔案


另外,如果你的遠端伺服器沒有建立好連線,也會影響本地日誌的生產速度


四、logrotate觸發過程

centos從6開始,daily   hourly  monthly weekly等這些資料夾裡面的任務已經不用crond處理,而是交給了anacron處理

1、/etc/cron.hourly/0anacron 會每小時定時執行,由 /etc/cron.d/0hourly 每小時呼叫一次

/etc/cron.hourly/0anacron 內容如下

if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi


# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power >/dev/null 2>&1
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

它會檢測系統當前時間和/var/spool/anacron/cron.daily(誰寫入的還沒搞清楚)檔案裡的日期是否一致,一致就退出,否則執行anacron 


2、anacron 程式啟動,它的配置檔案為/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=54   (延時54分、預設延時最小為6分)
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22  這個設定就是你看到日誌切割的時間範圍,一般是凌晨3點+RANDOM_DELAY+5 大約是凌晨3:59切割檔案

下面任務列表:第一列是輪詢天數、第2列是延時時間(單位分鐘)、第3、4列是任務描述和命令,在此呼叫daily、weekly、monthly任務
#period in days   delay in minutes   job-identifier   command
15cron.dailynice run-parts /etc/cron.daily
725cron.weeklynice run-parts /etc/cron.weekly
@monthly 45cron.monthlynice run-parts /etc/cron.monthly


3、由上面的anacron 呼叫cron.daily任務後,logrotate程式得以執行

cat /etc/cron.daily/logrotate ,內容如下:

#!/bin/sh
/usr/sbin/logrotate -s
/var/lib/logrotate.status /etc/logrotate.conf    (這裡的路徑要注意,有的是 /var/lib/logrotate/logrotate.status
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

logrotate程式呼叫配置檔案/etc/logrotate.conf 及/etc/logrotate.d/路徑下的配置,生成按天、周、月為週期的檔案。


遺留問題:

logrotate生成的備份日誌,日期不太對,沒有明確的分隔點。例如16號生成的日誌,備份到了17號檔案裡,而17檔案裡包含部分18號的內容。

我感覺這類問題,應該通過START_HOURS_RANGE這個引數來設定以儘量縮小時間誤差。


一、產生本地日誌

1、/etc/resolv.conf 配置檔案 local0~local7是使用者自定義的日誌
這裡我們使用local1,新增以下   local1.* /www/admin/admin/log/web_log 配置完需要重啟 rsyslogd程式  /etc/init.d/rsyslog restart

2、程式中用以下記入日誌     openlog("audit_as_cgi", LOG_PID, LOG_LOCAL1);
    syslog(LOG_DEBUG,"%s",write_buf);
    closelog();
audit_as_cgi :是日誌字首
LOG_PID:每條日誌都包含程序號
LOG_LOCAL1:是我們自定義的日誌型別
LOG_DEBUG:日誌等級

3、產生的本地日誌,如下所示


二、遠端傳送日誌

rsyslog提供三個遠端日誌傳輸方式:

  • UDP: 資料包傳輸可信度不高
  • TCP: 資料包傳輸可信度比較高
  • RELP: 資料包傳輸可信度最高,避免資料丟失,比較新的協議,目前應用較少

關於RELP的更進一步瞭解可以參考 Using TLS with RELP RELP Input Module RELP Output Module (omrelp)

TCP配置和UDP類似,如下

Server端配置
/etc/rsyslog.conf
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
$AllowedSender TCP, 192.168.80.0/24

# 根據客戶端的IP單獨存放主機日誌在不同目錄       
$template Remote,"/var/log/syslog/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"

# 排除本地主機IP日誌記錄,只記錄遠端主機日誌
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
& ~
Client端配置
/etc/rsyslog.conf ,這裡我們把使用者自定義的local1型別日誌傳送給2.108裝置
local1.*	    @@192.168.2.108:514

當然,如果你是用的之前老版本的syslogd程式,則傳送端不需要配置檔案,直接syslogd -R 伺服器地址即可,只不過syslogd好像是UDP協議的514埠,照樣可以用rsyslogd接收。

客戶端和服務端重啟相關服務即可在伺服器(192.168.2.108)端看的如下結果:


重啟rsyslogd之後如果沒有收到日誌,檢視防火牆是否開啟了514埠,沒有開啟就在伺服器端開啟514埠

 iptables -I INPUT -p tcp --dport 514 -j ACCEPT
 iptables -I OUTPUT -p tcp --dport 514 -j ACCEPT

三、日誌自動轉存-logrotate程式

logrotate是個十分有用的工具,它可以自動對日誌進行截斷(或輪循)、壓縮以及刪除舊的日誌檔案。例如,你可以設定logrotate,讓/var/log/foo日誌檔案每30天輪循,並刪除超過6個月的日誌。配置完後,logrotate的運作完全自動化,不必進行任何進一步的人為干預。另外,舊日誌也可以通過電子郵件傳送,不過該選項超出了本教程的討論範圍。

1、在/etc/logrotate.d/ 路徑下建立自己的日誌配置檔案,如下所示:

第一行:要管理的日誌檔案

daily: 按天轉存

dateext: 按日誌備份檔案

rotate: 共備份5份,之後會依次替換掉最舊的檔案

size=1M:當日志文件達到1M時,才備份

最後3句:必須重啟rsyslogd程式,否則日誌轉存之後,不會寫入最新的檔案


另外,如果你的遠端伺服器沒有建立好連線,也會影響本地日誌的生產速度


四、logrotate觸發過程

centos從6開始,daily   hourly  monthly weekly等這些資料夾裡面的任務已經不用crond處理,而是交給了anacron處理

1、/etc/cron.hourly/0anacron 會每小時定時執行,由 /etc/cron.d/0hourly 每小時呼叫一次

/etc/cron.hourly/0anacron 內容如下

if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi


# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power >/dev/null 2>&1
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

它會檢測系統當前時間和/var/spool/anacron/cron.daily(誰寫入的還沒搞清楚)檔案裡的日期是否一致,一致就退出,否則執行anacron 


2、anacron 程式啟動,它的配置檔案為/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=54   (延時54分、預設延時最小為6分)
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22  這個設定就是你看到日誌切割的時間範圍,一般是凌晨3點+RANDOM_DELAY+5 大約是凌晨3:59切割檔案

下面任務列表:第一列是輪詢天數、第2列是延時時間(單位分鐘)、第3、4列是任務描述和命令,在此呼叫daily、weekly、monthly任務
#period in days   delay in minutes   job-identifier   command
15cron.dailynice run-parts /etc/cron.daily
725cron.weeklynice run-parts /etc/cron.weekly
@monthly 45cron.monthlynice run-parts /etc/cron.monthly


3、由上面的anacron 呼叫cron.daily任務後,logrotate程式得以執行

cat /etc/cron.daily/logrotate ,內容如下:

#!/bin/sh
/usr/sbin/logrotate -s
/var/lib/logrotate.status /etc/logrotate.conf    (這裡的路徑要注意,有的是 /var/lib/logrotate/logrotate.status
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

logrotate程式呼叫配置檔案/etc/logrotate.conf 及/etc/logrotate.d/路徑下的配置,生成按天、周、月為週期的檔案。


遺留問題:

logrotate生成的備份日誌,日期不太對,沒有明確的分隔點。例如16號生成的日誌,備份到了17號檔案裡,而17檔案裡包含部分18號的內容。

我感覺這類問題,應該通過START_HOURS_RANGE這個引數來設定以儘量縮小時間誤差。