1

WebSphere Portalにデプロイされたアプリケーション用に、次のlog4j.propertiesファイルがあります。

log4j.rootLogger=DEBUG, InfoAppender, DebugAppender

log4j.appender.InfoAppender=org.apache.log4j.RollingFileAppender
log4j.appender.InfoAppender.Threshold=INFO
log4j.appender.InfoAppender.File=C:/info.log
log4j.appender.InfoAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.InfoAppender.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.DebugAppender=org.apache.log4j.RollingFileAppender
log4j.appender.DebugAppender.Threshold=DEBUG
log4j.appender.DebugAppender.File=C:/debug.log
log4j.appender.DebugAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.DebugAppender.layout.ConversionPattern=%d %p [%c] - %m%n

コーディングするときは、クラスレベルでロガーを定義します。

private static Logger logger = Logger.getLogger(IWannaLogThis.class);

そして私はこれでINFOメッセージを記録します:

logger.info(theObjectToLog);

アプリケーションをデプロイすると、debug.logファイルはログに記録したものすべてを取得しますがlogger.debug()、書き込みに使用したものはすべて無視しますlogger.info()。反対側では、info.logファイルは空のままです。

最も奇妙なことはdebug.loginfo.logクラスパスにあるいくつかのJARS(Hibernate Validatorなど)によって作成されたINFOメッセージとDEBUGメッセージが表示されますが、コードにログインしようとするすべてのものを無視することです。

何か案は?

4

4 に答える 4

2

これは、クラスローディング関連の問題である可能性があります。WebSphere Portalは内部でLog4Jを使用するため、WebSpherePortalが提供するLog4JJARファイルと独自のLog4Jプロパティを使用することになります。

サーバーインスタンスのJVM引数に以下を追加することで、これを確認できます。

-Dlog4j.debug=true

次に、ファイルを調べSystemOut.logます。Log4Jは、読み取った構成ファイルに関する多くのトレース情報を吐き出します。

これを回避する最善の方法は、次のことを行うことです。

  1. Log4JJARファイルをアプリケーションにバンドルします。
  2. 共有ライブラリをサーバーに関連付けます。その共有ライブラリに、Log4J構成ファイルを配置します。

手順2の代わりに、Log4J構成ファイルをアプリケーション自体にバンドルすることもできますが、それには独自の欠点があります(たとえば、Log4J構成の変更を実行するたびにアプリケーションを再パッケージ化する必要があります)。

于 2012-10-28T20:56:12.710 に答える
1

もう 1 つの一般的な問題は、クラスパスにある JAR も log4j を使用し、独自のアペンダーが設定されていることです。したがって、使用する設定とクラスが存在するパッケージによっては、説明した問題が発生する可能性があります。

そう:

  • パッケージ名が一意であり、サードパーティのライブラリで使用されていないことを確認してください。
  • クラスパス内のすべてのライブラリの log4j 設定を確認してください。あなたの設定を上書きする一般的な設定を含めるべきではありません。
  • ロガーが log4j.properties を使用していることを確認してください (ファイルに加えた変更がロガーに期待どおりに影響するかどうかを確認できます)。
  • 可能であれば、サードパーティのライブラリのいずれかが構成をリセットした場合に備えて、log4j のものを最後にロードするようにしてください。彼らはすべきではありませんが、誰が彼らを止めることができますか.

通常、これは次のいずれかになります。うまくいかない場合は、より明確な例を投稿してください。

幸運を!

于 2012-10-28T20:39:42.747 に答える
0

私が過去に行ったことは、ログに記録したいクラスに特定のログを設定することです。ルートロガーをINFOに設定して、必要なメッセージが表示されるかどうかを確認できるようです。これが私のlog4jプロパティファイルの一部です。クラスごとにロガーを設定し、ログレイアウトを定義する「データ」アペンダーに割り当てます。ロガーでは、ログに記録する特定のクラスを指定し、それらのログレベルを個別に設定します。私が持っているロガーで定義されていないログを記録するクラスは、rootCategoryのデフォルトのログレベルを使用します。

log4j.rootCategory=INFO, rollingFile, stdout

#GetData Loggers
log4j.logger.com.myapp.data=INFO, data
log4j.logger.com.myapp.data.SybaseConnection=DEBUG, data
log4j.logger.com.myapp.data.GetData=ERROR, data


# data appender
log4j.appender.data=org.apache.log4j.RollingFileAppender
log4j.appender.data.layout=org.apache.log4j.PatternLayout
log4j.appender.data.File=c\:\\Program Files\\MyApp\\logs\\MyApp-data.log
log4j.appender.data.Append=true
log4j.appender.data.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n
于 2012-10-28T18:26:25.503 に答える
0

ロガーをルートすると、デバッグ モードでログ プロパティが開きます。

プロパティ ファイルの最初の行で、DEbug の代わりに INFO を使用します。

于 2013-01-09T09:34:21.913 に答える