プロセス内から別のプロセスを呼ぶような jar があって、それぞれが同じファイルにログを出力する場合にサブプロセスからのログ出力が無視されそうな場合の対処として rsyslog を使いたい。
log4j には最初から syslog に出力するような Appender があるけれども単純にそれだけだとメッセージしか出力されずクラス名メソッド名などが拾えないのでどうにかしたい
rsyslog を更新する
CentOS7,8では出力した構造化データを解析して云々するためのモジュール mmpstrucdata.so がインストールされないので更新する
cd /etc/yum.repos.d/
wget http://rpms.adiscon.com/v8-stable/rsyslog.repo
yum install rsyslog
rsyslog.conf を編集する
以下
# 以下コメントアウトを解除する
$ModLoad imudp
$UDPServerRun 514
# モジュール mmpstrucdata をロードする
module(load="mmpstrucdata")
action(type="mmpstrucdata")
# 出力フォーマットを定義する
template(name="MyAppFormat" type="list") {
property(name="timereported" dateFormat="rfc3339")
constant(value=" ")
property(name="hostname")
constant(value=" ")
property(name="syslogtag")
constant(value=" ")
property(name="$!rfc5424-sd!location@32473!class")
constant(value=" (")
property(name="$!rfc5424-sd!location@32473!method")
constant(value=":")
property(name="$!rfc5424-sd!location@32473!line")
constant(value=") ")
property(name="msg" droplastlf="on")
constant(value="\n")
}
# ファシリティ local0 の出力指定
local0.* /var/log/application.log;MyAppFormat
log4j の設定
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Properties>
<Property name="ptn">
%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %C#%M %m %n %throwable
</Property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="${ptn}" />
</Console>
<RollingFile name="file" fileName="/var/log/fooapp/fooapp.log"
filePattern="/var/log//fooapp/fooapp_%d{yyyyMMdd}_%i.log"
append="true">
<PatternLayout pattern="${ptn}" />
<Policies>
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="10" />
</RollingFile>
<Syslog name="syslog" host="localhost" port="514" protocol="UDP" facility="local0" appName="app" >
<Rfc5424Layout appName="MyApp" facility="LOCAL0">
<LoggerFields enterpriseId="32473" sdId="location">
<KeyValuePair key="logger" value="%c" />
<KeyValuePair key="class" value="%C" />
<KeyValuePair key="method" value="%M" />
<KeyValuePair key="line" value="%L" />
</LoggerFields>
</Rfc5424Layout>
</Syslog>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="syslog" />
<AppenderRef ref="file" />
</Root>
</Loggers>
</Configuration>
Appender "Syslog" を追加する
その他
syslog出力はたしか fluentd に拾わせることが出来たと思うので、出力を mongodbに食わせるとかもできるかも。