2015年7月1日水曜日

rsyslog 圧縮した状態でログを出力するには

今回は、保存されたログを後から加工(gzipなどで圧縮)するのではなく、rsyslog単体でログを出力すると同時に圧縮もしてみよう!という内容です。
※評価は、CentOS6.6(x86_64) + rsyslog-8.10.0で行っています



設定例


以下、ファシリティがmailのログを圧縮した状態で出力する例です。

template(name="for_postfix"
         type="string"
         string="/var/log/postfix/%$year%%$month%%$day%.log.gz"
)

if \
        $syslogfacility-text == "mail" \
then {
        action(
                type="omfile"
                zipLevel="1"
                dynaFile="for_postfix"
        )
        stop
}

※ドキュメントにも書いてありますが、zipLevelで指定する数字が大きくなると圧縮率も高く(良く)なりますが、それに伴ってCPUの使用率も高くなるので、本番環境で設定する場合はそのあたりを十分確認(検証)したうえで設定をしてください。



ログの確認方法


設定例どおりにログが出力されると以下のようになります。
# ls -l /var/log/postfix/
total 4
-rw-r--r-- 1 root root 157 Jun 30 23:43 20150630.log.gz
#
# file /var/log/postfix/20150630.log.gz
/var/log/postfix/20150630.log.gz: gzip compressed data, from Unix, max speed
#

ログは圧縮されている状態なので、zcatやzlessで確認します。
またtailに相当するコマンドはないかさがしたら、そのままずばりのztailコマンドが存在し、tailと同じ操作でログを確認する事ができました。

  • ztailの配布元
http://emysoutlet.com/linux/ztail/index.html


2015年3月12日木曜日

ログに特定の文字列が出力されたらメールで通知するには(rsyslog編)

今回は、rsyslogをswatchのように使ってみようという内容です。
※評価は、CentOS6.6(x86_64) + rsyslog-8.8.0で行っています


以下に、rsyslogの比較的新しいフォーマットでの記述方法と昔ながらの記述方法の2種類を記載します。
⇒ログに'network connection error' あるいは'authentication failures'の文字列が出力されたら、メールでの通知を想定した例です



RainerScript styleフォーマットでの記述例


module(load="ommail")
template(name="mailSubject"
         type="string"
         string="Error on %hostname%"
)
template(name="mailBody"
         type="string"
         string="RSYSLOG Alert\r\nmsg='%msg%'"
)

if \
        ( $msg contains 'network connection error' ) or \
        ( $msg contains 'authentication failures' ) \
then {
        action(
          type="ommail"
          server="localhost"
          port="25"
          mailfrom="alert@rsyslog.example.com"
          mailto="user01@rsyslog.example.com"
          subject.template="mailSubject"
          template="mailBody"
          body.enable="on"
          #action.execonlyonceeveryinterval="3600"
        )
}
※コメントアウトしているaction.execonlyonceeveryintervalパラメータは、メールの通知間隔を調整するのに使います。監視している文字列がログに大量に出力された時に、メールがバーストするのを防ぐ為に利用します。
⇒上記の記述をそのまま有効にした場合、1度メールを送信したら同じメールを送信できるのは1時間(3600秒)後になります



Legacyフォーマットでの記述例


$ModLoad ommail
$template mailSubject,"Error on %hostname%"
$template mailBody,"RSYSLOG Alert\r\nmsg='%msg%'"
$ActionMailSMTPServer localhost
$ActionMailFrom alert@rsyslog.example.com
$ActionMailTo user01@rsyslog.example.com
$ActionMailSubject mailSubject
#$ActionExecOnlyOnceEveryInterval 3600
if \
        ( $msg contains 'network connection error' ) or \
        ( $msg contains 'authentication failures' ) \
then :ommail:;mailBody
※コメントアウトしている部分は、先のaction.execonlyonceeveryintervalパラメータと同じ目的で利用します。



動作検証

Puttyなどの端末を2つ立ち上げておき、

  • 1つはメールログをtail、
  • もう一つで以下のようにloggerコマンドを実行 (⇒私の環境では/var/log/messagesに出力されました)

する事で動作を確認する事ができます。

# logger network connection error


実際に届いたメールはこんな感じになります。




2015年2月7日土曜日

rsyslog プロパティを操作する


今回は、rsyslogでテンプレートを定義する時に利用するプロパティについてです。
※評価は、CentOS6.6(x86_64) + rsyslog-8.7.0で行っています



利用できるプロパティには、hostnameやfromhostなどがあり、
 (参考)http://www.rsyslog.com/doc/v8-stable/configuration/properties.html

プロパティの書式は以下のようになっていています。
 (参考)http://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html
%property:fromChar:toChar:options%

通常は、propertyの部分だけを利用することが多いと思いますが、他の部分を操作することにより、ログの出力を色々と変化させる事ができます。

以下、2例ほどピックアップしてみます。


1.自動的に作成されるディレクトリを大文字とする

例えば、/var/log/<ホスト名>/<日付>.logのようにログを出力する際、ホスト名で作成されるディレクトリ部分を大文字にするには以下のようにuppercaseオプションを付与します。

$template   DEFAULT,  "/var/log/%FROMHOST:::uppercase%/$YEAR%%$MONTH%%$DAY%.log"
※逆に小文字にしたい場合は、lowercaseオプションを付与します


2.ログの必要な箇所だけ抽出する

fromCharとtoCharを指定すれば、シスログのどこからどこまでを抽出するかといった事が指定できます。
例えば、冗長な部分をカットした上で、RFC3339フォーマットっぽくログを出力させたい場合、

 (もともとの出力)
 2015-02-07T23:23:11.485286+09:00 rsyslog crond[10005]: (CRON) INFO (@reboot ・・・

 (冗長な部分をカットした出力)
 2015-02-07 23:23:11 rsyslog crond[10005]: (CRON) INFO (@reboot ・・・

以下のようなテンプレートを作成します(改行されてますが、1行で記述します)。
→先頭から10文字目までと、先頭から数えて12文字目から19文字目までを指定
$template RFC3339like, "%timestamp::10:date-rfc3339% %timestamp:12:19:date-rfc3339% %hostname% %syslogtag%%msg%\n"






2015年1月12日月曜日

rsyslog + MySQL 特定ホストだけMySQLへの出力を停止するには No.2

少し前に「rsyslog + MySQL 特定ホストだけMySQLへの出力を停止するには」という記事を書いているのですが、実現手段としてもう一つ追加します。
※評価は、CentOS6.6 + rsyslogのver8.6.0で行っています



ログを受信するポート + rulesetで除外する方法


リモートホスト側で、ログを転送するポートが自由に変更(例えばTCPの5140ポートなどに)できる場合には、以下のように設定することで、テンプレートSTOPSQLとして指定した先にのみログを出力し、その他のファイルやMySQLへの出力を止める事ができます。


input(type="imtcp" port="5140" ruleset="stopsql")

$template STOPSQL, "/var/log/%fromhost%/%$year%%$month%%$day%.log"

ruleset(name="stopsql"){
     action(type="omfile" dynaFile="STOPSQL")
}


(備考)
※詳細は以下のページで確認してください。
http://www.rsyslog.com/doc/v8-stable/concepts/multi_ruleset.html?highlight=ruleset

設定次第で、特定のホストのログだけを特別扱いするといった事が、より簡単に実現できると思います。

2015年1月6日火曜日

ソースの中のmanをインストール前に参照するには

ソースの中に含まれるmanをインストール前の事前確認として参照したい時ってありませんか?

そんな時の対応方法を2例ほど。
 →カレントディレクトリでpostfixのソースを展開後、anvil(8)を参照する例


1.manコマンドを使って参照
$ man postfix-2.12-20141228/man/man8/anvil.8

2.lessコマンドを使って参照
$ less -is postfix-2.12-20141228/man/man8/anvil.8

(備考)
より詳細な内容は、man(1)のDESCRIPTIONやENVIRONMENTなどで確認してください。

2015年1月4日日曜日

CentOS(RHEL)6 クラッシュダンプ用のメモリ割り当てを無効にする


クラッシュダンプを取得する必要がない + kexec-toolsのパッケージを導入していない(kdumpの機能を有効にしていない)にもかかわらず、クラッシュダンプ用にメモリの割り当て(消費)だけはされてしまうという状況を回避しようというのが今回の内容です。
※評価は、CentOS6.6(x86_64)でメモリ2GBを搭載したマシンで行っています


grub.confのkernel行にある”crashkernel=auto”の記述を削除する方法

(注意)
CentOS(RHEL)6系では、新しいkernelをインストールすると、必ず”crashkernel=auto”が付与されるようになっているので、新しいkernelをインストールした場合はその都度、削除をする必要があります
 ⇒ rpm -q --scripts kernel-<version> とするとその付与する処理が確認できます


/etc/init/kexec-disable.confを修正する方法

ファイルの中で”crashkernel=auto"をgrepしているのですが、/proc/cmdlineには実際に割り当てられたメモリの容量が入ってくるので、修正をしないと機能しません。
具体的には以下のように修正するか、その行自体を削除してしまっても良いと思います。

# diff -u /etc/init/kexec-disable.conf.orig /etc/init/kexec-disable.conf
--- /etc/init/kexec-disable.conf.orig     2015-01-02 23:02:11.067185577 +0900
+++ /etc/init/kexec-disable.conf  2015-01-02 23:06:03.607481618 +0900
@@ -8,7 +8,7 @@
 script
        if [ ! -x /sbin/kexec ] || ! chkconfig kdump 2>/dev/null ; then
-               grep -q "crashkernel=auto" /proc/cmdline && \
+               grep -q "crashkernel" /proc/cmdline && \
                echo -n "0" > /sys/kernel/kexec_crash_size 2>/dev/null
        fi
        exit 0
#

これで以下の条件にマッチすると、メモリの割り当てが無効になります。
・kexec-toolsパッケージがインストールされていない
・kexec-toolsパッケージがインストールされているが、自動起動がonになっていない

2014年12月1日月曜日

rsyslog 複数のポートで待ち受けるには

ログサーバとしてrsyslogを稼動させる時に、複数のポートで待ち受けしてみようというのが今回の内容です。
#検証は、CentOS6.6 + rsyslog-8.5.0で行っています


TCPの514ポートと5140ポートで待ちうけをする場合は、rsyslog.confを以下のように編集します。
module(load="imtcp")
input(type="imtcp" port="514")
input(type="imtcp" port="5140")

編集完了後にrsyslogをrestartし、状態を確認すると以下のようになります。
# netstat -antup | grep rsyslog
tcp        0      0 0.0.0.0:5140    0.0.0.0:*   LISTEN      1333/rsyslogd
tcp        0      0 0.0.0.0:514     0.0.0.0:*    LISTEN      1333/rsyslogd
#


※UDPでも同様の方法で設定できます。