Hibernateログをコマンドボックスコンソールにリダイレクトする


私の最後のブログ記事では、Hibernateログレベルをlog 4 jで調整する方法を取り上げました.

マイケルボーン
@ michaelbornstricme私

もう一つの速いブログ柱、Lucee Hibernateの同時修正修正例外を解決することについてのこの時間.フィックスのために!💪 michaelborn.me/entry/resolvin…
午後12時00分- 2021年8月20日
これによって、あるデータベースエンティティをDEBUG ロガー、しかし、それはまた、log 4 j構成との更なるインタラクションのために我々をセットアップします.今週は、Hibernateロガーによって発行されたすべてのlog 4 jメッセージを取り出し、コンソールにリダイレクトします.このコンソールは実行時に表示されるものですbox server log --follow コマンドボックスで.

Not sure what Log4j is? and I'll happily cover basic Log4j usage in a blog post.


開始するには、Hibernateロガーをつかむためにlog 4 j“logger”オブジェクトが必要です.
var Logger = createObject( "java", "org.apache.log4j.Logger" );
var hibernateLog = Logger.getLogger( "org.hibernate" );
我々log 変数には、ルートHibernateロガーへのリファレンスが含まれます.Hibernateのどんなクラスからも放出されるすべてのログメッセージは、このロガーを通過します.
ログレベルを設定することができますWARN or DEBUG :
var level = createObject( "java", "org.apache.log4j.Level" );
hibernateLog.setLevel( level.DEBUG );
注意:DEBUG ログレベルでエンティティの問題が発生する可能性がありますResolving Concurrent Exceptions in Hibernate Logger .
Loggerのログ出力を設定するには、Logeeの既存のlog 4 j appendersのいずれかを再利用することができます.これは基本的にすべてを渡すためにルーシーでpiggybacksですorg.hibernate ログを“コンソール”の添付ファイルをSystem.Out .
var printWriter = getPageContext().getConfig().getOutWriter();
var layout = createObject( "java", "lucee.commons.io.log.log4j.layout.ClassicLayout");
var consoleAppender = createObject( "java", "lucee.commons.io.log.log4j.appender.ConsoleAppender" ).init( printWriter, layout );
最後に、log 4 jを使用して、すべてのHibernateログにLuceeのコンソールアペンダを使用できます.
hibernateLog.addAppender( consoleAppender );
すべてをまとめてください.
public function setHibernateLogging(){
  /**
   * Resolves Hibernate ConcurrentModificationException when flushing an entity save with one-to-many relationships.
   * 
   * @see https://access.redhat.com/solutions/29774
   * @see https://michaelborn.me/entry/resolving-concurrent-exceptions-in-hibernate-logger
   */
  var Logger = createObject( "java", "org.apache.log4j.Logger" );
  var level = createObject( "java", "org.apache.log4j.Level" );
  var hibernateLog = Logger.getLogger( "org.hibernate" );
  hibernateLog.setLevel( level.WARN );

  /**
   * Redirect all Hibernate logs to system.out
   */
  if ( listFindNoCase( "Lucee", server.coldfusion.productname ) ) {
    var printWriter = getPageContext().getConfig().getOutWriter();
    var layout = createObject( "java", "lucee.commons.io.log.log4j.layout.ClassicLayout");
    var consoleAppender = createObject( "java", "lucee.commons.io.log.log4j.appender.ConsoleAppender" ).init( printWriter, layout );
    hibernateLog.addAppender( consoleAppender );
  }
}
このメソッドはApplication.cfc アプリケーションのライフサイクルの初期.このメソッドがページリクエストまたはonRequestStart() , Hibernateは既に初期化されており、貴重な出力をたくさん失っています.
このメソッドが適切になったら、Commandboxから利用できます.
box server log --follow
これは、より良いログの詳細を拾うために素晴らしい、と言うのは、無効なORMエンティティです.