1

私のWARでは、log4j.properties(にあるWEB-INF/classes)を使用して独自の設定をしたいと考えています。ここで説明されているデプロイメントごとのロギングは機能しません。つまり、JBoss はアプリケーションから何もログに記録しません。私の単純なアプリ(問題を再現するため)には以下が含まれます:

WEB-INF/classes/log4j.properties
WEB-INF/classes/logging/LoggingContextListener.class
WEB-INF/lib/log4j-1.2.17.jar
WEB-INF/lib/slf4j-api-1.7.5.jar
WEB-INF/lib/slf4j-log4j12-1.7.5.jar

LoggingContextListenerランダムな文字列をログに記録するだけです 。log4j.properties内容:

log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

誰かが同様の問題に遭遇しましたか?

それが修正可能かどうか知っていますか?どのように?

ログのしきい値に関する混乱を避けるために、LoggingContextListener

System.err.println("Trying to log something using SLF4J-Log4J");
org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(getClass());
logger.error("Hello");
logger.warn("anybody home?");
logger.info("can you hear me?");
logger.debug("WTF?");
System.err.println("Did you notice any logs?");

log4j.propertiesクラスパスから削除すると、次のようになります。

ERROR [stderr] (ServerService Thread Pool -- 54) Trying to log something using SLF4J-Log4J
ERROR [logging.LoggingContextListener] (ServerService Thread Pool -- 54) Hello
WARN  [logging.LoggingContextListener] (ServerService Thread Pool -- 54) anybody home?
INFO  [logging.LoggingContextListener] (ServerService Thread Pool -- 54) can you hear me?
ERROR [stderr] (ServerService Thread Pool -- 54) Did you notice any logs?

しかし、これらのログは、設定されたJBossロガーから直接取得されますstandalone.xml-私が望むものではありません。

4

2 に答える 2

2

この問題には醜い回避策があります (これは私の質問に対する適切な回答ではありません)。

Properties props = new Properties();
props.load(getClass().getResourceAsStream("/log4j.xxx.properties"));
PropertyConfigurator.configure(props);

このコードは一度だけ実行する必要があるため、理想的には独自の ServletContextListener 実装で実行します。注意してください - log4j.properties の名前を変更する必要があります。そうしないと、JBoss が「処理」してすべてのログを飲み込んでしまいます。

しかし、これは最初に JBoss によって行われるべきです! 少なくとも、彼らがドキュメントに書いていることです。

これは明らかなバグなので、JIRA で報告します。

PS。面白いことに、クラスパスに log4j がある場合、デプロイ モジュールがルートから独立している必要がある場合でも、それは考慮されません。JBoss は自家製の log4j実装を使用します。結果:あなたが呼び出そうとしたとき:

PropertyConfigurator.configure(getClass().getResourceAsStream("/log4j.xxx.properties"));

ビルド クラスパスに元の log4j があると、PropertyConfigurator が configure(java.io.InputStream) を実装していないため、実行時に NoSuchMethodException が発生します。クールではありません :(

于 2013-09-24T16:25:35.383 に答える
0

これを試してlog4j.properties 、もう1つのプロパティを追加してください

log4j.appender.stdout.Threshold=debug

プロパティの下にコピーして貼り付けてテストします

log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=debug
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%m%n
于 2013-09-24T08:12:22.767 に答える