wiki:tech/Syslog

Syslogメモ

Syslogを使うと複数のサーバのログをログサーバに集約することができます。ここでは、RedHat?系OSで利用されているSyslogの実装の一つであるrsyslogの使い方を紹介します。

rsyslogの設定

syslogでは、ファシリティと呼ばれるログのグループにより、カーネルのログやアプリケーションなどログの種類を指定します。アプリケーションのログをlocal0という名前のファシリティで出力するには、

/etc/rsyslog.conf

local0.*                 /var/log/application.log

複数のサーバのログを集約するには、UDP(もしくはTCP)を利用してログを受け取る設定を行う必要があります。ネットワーク経由でログを受け取る設定は、rsyslogのSYSLOGD_OPTIONSを下記のように変更します。

/etc/sysconfig/rsyslog

SYSLOGD_OPTIONS="-m 0 -r514"

設定が終わったら下記のコマンドによりrsyslogdを再起動すれば有効になります。

# /etc/init.d/rsyslogd restart

CentOS/RedHatの注意点(ファイアウォールの設定)

CentOSやRedHatではデフォルトでは、ファイアウォールの設定によりsyslog(514ポート)のメッセージを受け付けないようになっています。 下記のようにREJECTルールの手前に514番のUDPを有効にする設定を記述します。

/etc/sysconfig/iptables

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 514 -j ACCEPT #この行を追加
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

変更したファイアウォールの設定を有効にするには、下記のコマンドを実行します。

# service iptables restart

Log4jの設定

JavaのアプリケーションからSyslogにログを出力するには、log4jを利用すると簡単です。Syslogを利用するには、SyslogAppender?を利用します。以下、log4j.xmlの設定サンプルを示します。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appender name="syslog" class="org.apache.log4j.net.SyslogAppender">
    <!-- ログを転送するサーバ:ポート番号 -->
    <param name="SyslogHost" value="logserver.ultimania.org:514" />
    <!-- ファシリティの設定 -->
    <param name="Facility" value="local0" />
    <!-- ファシリティをログに出力? -->
    <param name="FacilityPrinting" value="true" />
    <!-- ホスト名をログに含める? -->
    <param name="Header" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"
        value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>
  </appender>


  <root>
    <priority value ="debug" />
    <appender-ref ref="syslog"/>
  </root>
</log4j:configuration>