1

アプリケーションで log4j 2.0 を実行しようとしています。私のアプリケーションでは、2 つのロガーを設定しています。

  1. 何が起こっているかを確認できるように、コンソールに出力するもの。

  2. もう 1 つは、テスト実行結果を DB2 テーブルに出力するためのものです。これは、テストがいつ実行され、結果がどうなったかを追跡するための完全に異なるログです。

問題は DB2 ロガーにあります。テーブルにレコードを書き込めないようです。次の理由により、私はもうすぐそこにいることを知っています。

  • ダミーのライブラリまたはテーブル名を使用すると、構成中に log4j エラーが発生します。
  • 偽のユーザー ID またはパスワードを使用すると、構成中に log4j エラーが発生します。
  • ファイルに対する権限のない有効なユーザー ID/パスワードを使用すると、構成中に log4j エラーが発生します。
  • しかし...これらすべてが正しければ、エラーはなく、記録も書き込まれません。

コンソールで、log4j の再構成が正しく終了したことを確認できます。

2013-10-02 11:31:06,261 DEBUG Reconfiguration completed

だから....私は何が欠けていますか?log4j サイトには、これに関するドキュメントはあまりありません。

アプリケーションのコードは次のとおりです。

public static void testExists(String myProcedure) {
    final Logger console = LogManager.getLogger(myProcedure);
    final Logger mytestlog = LogManager.getLogger(myProcedure);

.... yadda, yadda, yadda ....
.... and then finally, call the loggers with ....

    console.info("== write this to the console ==");
    mytestlog.info("== write this to the db2 log ==");
}

ここに私のlog4j2.xmlがあります

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%date{HH:mm:ss.SSS} %-5level{lowerCase=false} %logger{36} | %msg%n"/>
    </Console>
    <JDBC name="jdbc" tableName="vqccommon.sptestlog">
        <ConnectionFactory class="foo.bar.chew.Log4jConnect" method="log4jConnect" />
        <Column name="timestamp" isEventTimestamp="true" />
        <Column name="testclass" pattern="%class" />
... some other columns ....
       </JDBC>
     </Appenders>
     <Loggers>
       <Logger name="sptestlog" level="trace">
           <AppenderRef ref="jdbc" ></AppenderRef>
       </Logger>
       <Root level="trace">
         <AppenderRef ref="Console" ></AppenderRef>
       </Root>
     </Loggers>

   </Configuration>
4

1 に答える 1

0

コメントで porfiriopartida が述べたように、ほぼそこにいると思いますが、(テスト) アプリケーションでロガーを作成する方法を変更するだけで済みます。

public static void testExists() {
    Logger console = LogManager.getLogger(getClass()); 
    Logger dbLog = LogManager.getLogger("sptestlog"); // match config Logger name!

    console.info("== write this to the console ==");
    dbLog.info("== write this to the db2 log ==");
}

で作成されたロガーのみLogManager.getLogger("sptestlog")が、構成した JDBC アペンダーに追加されます。他の名前のロガーは、コンソールにログを記録します。

この2013-10-02 11:31:08,224 DEBUG ServletContext not present - WebLookup not added行は、JDBC ロギングとは関係ありません。Log4J は、Web コンテナーで追加の初期化を行います。Web コンテナーが見つからない場合、この初期化を行う必要はありません。

于 2013-10-02T22:53:43.707 に答える