5

log4j と rsyslog を使用して集中ログを取得しようとしています。

私がこれまでに持っているもの

次の log4j および sl4j ライブラリを使用して、RHEL6 の tomcat6 内で実行される Solr

# lsof -u tomcat | grep log4j
java    14503 tomcat  mem    REG              253,0      9711    10208 /usr/share/java/tomcat6/slf4j-log4j12-1.6.6.jar
java    14503 tomcat  mem    REG              253,0    481535    10209 /usr/share/java/tomcat6/log4j-1.2.16.jar
java    14503 tomcat  mem    REG              253,0    378088  1065276 /usr/share/java/log4j-1.2.14.jar
java    14503 tomcat   20r   REG              253,0    378088  1065276 /usr/share/java/log4j-1.2.14.jar
java    14503 tomcat   21r   REG              253,0    481535    10209 /usr/share/java/tomcat6/log4j-1.2.16.jar
java    14503 tomcat   35r   REG              253,0      9711    10208 /usr/share/java/tomcat6/slf4j-log4j12-1.6.6.jar
# 

Solr は次の log4j.properties ファイルを使用しています (-Dlog4j.configuration=file:///opt/solr/lib/log4j.properties 経由)

#  Logging level
log4j.rootLogger=INFO, file, CONSOLE, SYSLOG

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n

#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9

#- File to log to and log format
log4j.appender.file.File=/var/log/tomcat6/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n

log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN

# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF

#- Local syslog server
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.syslogHost=localhost
log4j.appender.SYSLOG.facility=LOCAL1
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=${sysloghostname} %-4r [%t] java %-5p %c %x %m%n
log4j.appender.SYSLOG.Header=true

同じサーバーで rsyslog を実行しており、log4j からのログ メッセージを受け入れています。

# rpmquery -a | grep syslog
rsyslog-5.8.10-7.el6_4.x86_64
# 

rsyslog構成

# #### MODULES ####
$MaxMessageSize 32k
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
$ModLoad imfile   # provides file monitoring support
#
$ModLoad imudp.so
$UDPServerRun 514
$WorkDirectory /var/lib/rsyslog # where to place spool files
# #### GLOBAL DIRECTIVES ####
# # Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$ActionQueueType LinkedList   # run asynchronously
$ActionQueueFileName fwdRule1 # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionResumeRetryCount -1    # infinite retries if host is down

$ActionSendStreamDriverMode 0 # require TLS for the connection
$ActionSendStreamDriverAuthMode anon # chain and server are verified
#local1.*;*.* @@(o)XXXXXXXX:5544
local1.*                                                /var/log/remote.log
# # The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
# # Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
# # Log cron stuff
cron.*                                                  /var/log/cron
# # Everybody gets emergency messages
*.emerg                                                 *
# # Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler
# # Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

Solr の logj4 から local1 メッセージをキャッチし、それらを /var/log/remote.log にリダイレクトしています。INFO メッセージの例

Oct 31 13:57:08 hostname.here 3431839 [http-8080-10] java INFO  org.apache.solr.core.SolrCore  [collection1] webapp=/solr path=/select params={indent=true&q=*:*&wt=json&rows=1} hits=42917 status=0 QTime=1

また、スタック トレースは ERROR メッセージと同じ行にあります。

Oct 31 12:27:17 hostname.here 157666248 [http-8080-7] java ERROR org.apache.solr.core.SolrCore  org.apache.solr.common.SolrException: undefined field *#012#011at org.apache.solr.schema.IndexSchema.getDynamicFieldType(IndexSchema.java:1223)#012... Cut for brevity....#011at java.lang.Thread.run(Thread.java:724)#012

#012 を行末に、#011 タブに注意してください。

このセットアップを使用すると、ログを TCP 経由でリモート rsyslog サーバーに送信し、それらを fluentd/elaticsearch/kibana などにパイプすることができます...すべてが期待どおりに機能します。

上記のように、同じ tomcat コンテナー内で実行されている別の webapp をログに記録しようとしている問題 は、スタック トレースを除いてすべてが期待どおりに機能し、スタック トレースの各行が個別の行 (個別の syslog メッセージ) で終了します。

Oct 31 12:54:47  hostname.here 4909 [main] java ERROR org.hibernate.tool.hbm2ddl.SchemaUpdate  could not get database metadata
Oct 31 12:54:47 hostname.here org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure
Oct 31 12:54:47 hostname.here 
Oct 31 12:54:47 hostname.here The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)

webapp には、独自の log4j ライブラリと log4j.xml 構成が付属しています。ライブラリは、solr で使用されるものと同じバージョンです。

このアプリの log4j.xml ファイル

 <appender name="SYSLOG" class="org.apache.log4j.net.SyslogAppender">
                <param name="SyslogHost" value="localhost" />
                <param name="Facility" value="LOCAL1" />
                <param name="Header" value="false" />
                <property name="facilityPrinting" value="false"/>
                <param name="Threshold" value="DEBUG" />
                <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern"
                      value="%-4r [%t] java %-5p %c %x %m%n"/>
                </layout>
                </appender>

新しいアプリケーションからのスタック トレースが、Solr と同じように同じ行に表示されるようにしたいと考えています。

これがlog4j構成の問題であるかどうかは誰にもわかりますか?

どうもありがとう。

4

1 に答える 1

4

私は最近似たようなことに取り組んでいます (実際、この質問は現在開いています)。

これはおそらくあまり良い答えではありませんが、コメントに収まりきらないほどの情報があるので、ここに行きます(その一部があなたにとって新しいものであることを願っています)。rsyslog imfile rsyslog ドキュメントには、次のセクションがあります。

ReadMode [モード]

このモードは、複数行のメッセージがある場合に定義する必要があります。値の範囲は 0 ~ 2 で、複数行の検出方法を決定します。
0 (デフォルト) - 行ベース (各行は新しいメッセージです)
1 - 段落 (ログ メッセージ間に空白行があります)
2 - インデント (新しいログ メッセージは行の先頭から始まります。行がスペースで始まる場合それはその前のログメッセージの一部です)

imudp rsyslog ドキュメントには、そのような構成オプションはありません。私の推測では、UDP 入力モジュールは複数行のログをサポートしていません。したがって、スタック トレースの各行は、個別のログ エントリとして送信されます。

/etc/rsyslog.d に構成ファイルはありますか? そこにもっと情報があるかもしれません。

于 2014-01-21T20:53:43.100 に答える