2016年8月11日 星期四

Rsyslog

修改20161007

產生hostname/年/月/日.log 檔案



參考:rsyslog-configuration
版本:Red Hat 4.4.7-17, rsyslog-5.8.10-10.el6_6.x86_64

目的

1.rsyslog server已運作.

2.產生log檔在 /var/log/rsyslog/${hostname}/${yesr}/${month}/${hostname}-${day}.log
外面傳來的log依照log的hostname在 /var/log/rsyslog下分開,並在分成年月資料夾,最後產生 hostname-日期.log,每天存一份.

3.使用舊式的設定,在/etc/rsyslog.d/test.conf設定兩個tamplate,一個tamplate是定義動態log檔案名稱,另一個是定義收到log message轉成文字檔時的格式.

設定

/etc/rsyslog.d/test.conf
$template DynFile,"/var/log/rsyslog/%HOSTNAME%/%$YEAR%/%$MONTH%/%HOSTNAME%-%$DAY%.log"
$template TraditionalFormat,"%timegenerated% %HOSTNAME% from ip:%fromhost-ip% %syslogtag%%msg:::drop-last-lf%\n"



*.* ?DynFile;TraditionalFormat
$template {templatename},"{format}"
templatename定義template名稱,format定義路徑檔名和輸出文字檔格式.

%HOSTNAME% %$YEAR% %timegenerated%
兩個%之間使用rsyslog Properties,如果多$是指rsyslog server系統上的參數.

from ip:%fromhost-ip%
我是使用原本舊有的範本,再加入遠端丟log的設備ip

*.* ?template1;template2
*.*第一個*是指所有服務,第二個*是指所有log的等級,?後面接template,也可以?前面加 - 代表輸出的log與rsyslog server時間同步,template1指存檔的路徑和檔名,template2只輸出的文字檔格式

寫完記得重啟服務 service rsyslog restart


驗證

可以看到有四台設備,其中一台已有兩天log,並記錄log來源的ip.


Rsyslog Listen

目的

預設rsyslog不會監聽port,修改config產生監聽。

實作


vim /etc/rsyslog.conf 

#$ModLoad imudp
#$UDPServerRun 514
#$ModLoad imtcp
#$InputTCPServerRun 514
把註解#去掉

重新啟動 service rsyslog restart

驗證




Filtering And Forwarding

目的

篩選和轉發rsyslog的資料.

Topology


juniper 的 hostname是R6,送出syslog給centos6.7
centos6.7收到R6封包,刪掉只有下指令的log,轉發給other linux

實作

Filtering


位置:centos6.7
centos6.7上已經可以接收R6的syslog

位置:centos6.7
: rawmsg, regex, ".*mgd.*" ~
這行代表,在rawmsg裡使用正規表示法搜尋有mgd的內容,然後刪掉

rawmsg代表整個封包接收到的內容
regex表示選擇使用正規表示法
".*mgd.*"表示正規表示法,有出現mgd都match
~表示match的都移除(如果沒有~,則只有math的會留下)


位置:juniper R6
在R6上,2016-10-07-17:33:37下show user perry指令

位置:centos6.7
可以看到時間上,沒有出現那個syslog,如果會出現就會像最後一行那樣


Forwarding

位置:centos6.7
*.* @192.168.20.199
表示轉寄給192.168.20.199
*.* 表示所有資訊所有等級
@表示使用utp,@@表示使用tcp
192.168.20.199表示轉發的ip,預設port是514,可以用192.168.20.199[:port number]


位置:other linux
可以找到R6的syslog

2016年8月7日 星期日

logrotate:使用有日期的資料夾

修改20160807
參考man logrotate(8)

介紹

logrotate是linux用來控制log檔案數量`大小`存放地點和檔案名稱.

logrotate不是一個daemon,他是靠cron每天執行的,可以參考下面設定檔順序

版本


Red Hat 4.4.7-17
logrotate-3.7.8-26.el6_7.x86_64

目的

把syslog檔案用年和月資料夾分開.


logrotate configation

預設log設定檔案
/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

# use date as a suffix of the rotated file
dateext

# 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 and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}


# system-specific logs may be also be configured here.
weekly:每週執行一次rotate.
其他還有dailymonthly, or yearly

rotate:rotate的次數
create:將會創造新的空白檔案放入新的log.

dateext:設定log檔名稱是YYYYMMDD.
另一個dateformat format_string 可以自訂格式.

#compress:ZIP壓縮檔案
include /etc/logrotate.d:指定後面要執行的logrotate

其他還有像minsize size 可以指定要被log檔案必須至少多少size,等等....

logrotate.conf是所有logrotate檔預設設定,在logrotate.conf定義後所有的logrotate檔都會執行,但如果個別的logrotate檔有定義參數,將使用個別的logrotate檔的設定.

個別log檔案設定
/etc/logrotate.d/syslog

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
        daily
        olddir /var/log/syslog
        dateext
        rotate 4
    firstaction
       /bin/mkdir -p /var/log/syslog
    endscript
    lastaction
        /bin/mkdir -p /var/log/syslog/$(/bin/date '+%Y')/$(/bin/date '+%m');
        cd /var/log/syslog;
        /bin/cp $(/bin/ls /var/log/syslog|/bin/grep $(/bin/date '+%Y%m%d')) /var/log/syslog/$(/bin/date '+%Y')/$(/bin/date '+%m');
        cd -;
    endscript

    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript

}
因為後面只想要驗證syslog的關係,所以也把預設有設定的東西也放在這裡.

以下參數跟endscript之間可以寫類似script的內容
firstaction:執行時間是執行所有log之前
lastaction:執行時間是執行所有log之後
prerotate:執行時間是執行單個log之前
postrotate:執行時間是執行單個log之後
注意:無法使用萬用字元,如果有更輕鬆的用法請告訴我


1./bin/mkdir -p /var/log/syslog 創一個專屬的資料夾
2.olddir /var/log/syslog 指定log檔的資料夾
3./bin/mkdir -p /var/log/syslog/$(/bin/date '+%Y')/$(/bin/date '+%m'); 創日期資料夾
4./bin/cp $(/bin/ls /var/log/syslog|/bin/grep $(/bin/date '+%Y%m%d')) /var/log/syslog/$(/bin/date '+%Y')/$(/bin/date '+%m'); copy已rotate的檔案過去

驗證

驗證要執行 logrotate -v /etc/logrotate.d/syslog,因為不知道logrotate的流程,我只要rotate一次他就不會再產生資料,就算我加入參數-v或刪掉/var/lib/logrotate.status裡面的資料也是一樣,這就會只要rotate錯一次就要等至少一天,我不太想這樣,所以只好用虛擬機的快照還原去測試.


可以看到原本/var/log/syslog沒有東西,執行完logrotate /etc/logrotate.d/syslog 後/var/log/syslog裡面就會出現東西,因為我是copy所以/var/log/syslog裡的log檔案可以保留最多四個,但是/var/log/syslog/2016/08裡的log檔案就不會被刪掉.