1

slf4j-log4j12 で sl4j-api 1.7.2 を使用しています。

次のようなログを記録したいと思います。

22:52:27,345 警告 [クラス] ユーザー 1 のロードに失敗しました - 理由: javax.ejb.EJBException: javax.persistence.NoResultException: org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor .java:166) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final] at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:230) [jboss- as-ejb3-7.1.1.Final.jar:7.1.1.Final] at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:304) [jboss-as-ejb3-7.1.1. Final.jar:7.1.1.Final] ... fullstackTrace

だから私は試しました

try {
            //...
        } catch (Exception e) {
            logger.warn("Failed to load User {} - Reason : {}", userId, e);
        }

または

try {
               // ...
            } catch (Exception e) {
                logger.warn("Failed to load User {} - Reason : ", userId, e);
            }

しかし、この2つのソリューションはどれも機能しません

最初の試みは :

ユーザー 4 の読み込みに失敗しました - 理由: javax.ejb.EJBException: javax.persistence.NoResultException: クエリのエンティティが見つかりません

二番目 :

Failed to load User 4 - Reason :

作ることは可能ですか?

ありがとう。

4

1 に答える 1

2

Logger APISL4J FAQを確認してください。1.6.0 より前のバージョンの SL4J を使用している可能性があります。これは、パラメーター プレースホルダーがある場合eは単純なオブジェクトとして解釈され (つまり、SL4J は を呼び出しますe.toString())、パラメーター プレースホルダーがない場合は無視されます。

1.7.2 とは異なるバージョンを使用している理由については、アプリケーション サーバーのクラスパスに以前のバージョンが含まれていて、アプリケーションを起動する前に読み込まれている可能性があります。

クラスローディングの問題を修正するか、古いバージョンの動作を回避することができます。

後者のパスを選択した場合、オーバーロードされたバージョンからwarn(String msg, Throwable t))、スタック トレースを自動展開するバージョンのいずれかが必要です。

logger.warn("Failed to load User " + userId + " - Reason",  e);

または、warn(String format, Object arg1, Object arg2)スタックトレースを拡張するコードを含むもの。

if (logger.isWarnEnabled()) {
   StringWriter sw = new StringWriter();
   PrintWriter pw = new PrintWriter(sw);
   e.printStackTrace(pw);
   String expanded = sw.toString(); // stack trace as a string
   logger.warn("Failed to load User {} - Reason : {}", userId, expanded);
}
于 2013-01-03T22:32:21.170 に答える