問題タブ [apache-commons-logging]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - log4j2.0とslf4jおよびCommonsLoggingを一緒に使用する方法
現在、新しいWebアプリケーション(tomcat 6で実行)を開始しています。slf4jを使用するコンポーネントとコモンズロギングを使用するコンポーネントがあります。いくつかの理由(主にアペンダー:SocketAppenderとSyslogAppenderだけでなく、ログイベントを失うことなく構成の再読み込みを促進しました)
今私の質問は次のとおりです。-新しいクラスをどのインターフェイスにプログラムしますか?loag4jまたはslf4j?またはコモンズロギング?
jarをデプロイするための好ましい方法は何ですか?それらをアプリケーション戦争に入れますか、それともTomcatライブラリに入れますか?
どのjarをデプロイする必要がありますか?log4j(slf4jおよびcommonsバインディングを含む)、commonsロギング(slf4j-api-1.7.2.jar)およびslf4j api(slf4j-api-1.7.2.jar)
exception - Bean のインスタンス化に失敗しました。ネストされた例外は java.lang.NoClassDefFoundError: org/apache/log4j/Logger です
log4j 構成でコモンズ ロギングを機能させようとしていますが、サーバーの起動時に例外が発生し続けます。別のコモンズ ライブラリから入手できる StringUtils を使用しようとすると、同様の例外が発生します。
pom の依存関係:
java - 春とログのプロパティファイル
Springを使おうとしています。Springの依存関係は
そこで、ビルドパスに追加commons-logging-1.1.1.jar
しました。これはすべて正常に機能します。そして、私はこのようなものを手に入れます:
これはすべて素晴らしいですが、これを標準に出力したくないので、ファイルに送信することをお勧めします。
DirectoryStructure:
そのため、代わりにすべてのログを標準からログファイルにリダイレクトしたいと思います。これはSpringで可能ですか?
ここからプロパティファイルを使用しました:http ://www.tutorialspoint.com/spring/logging_with_log4j.htmここからSpringの例を入手しました。しかし、これは何の違いももたらさないようです。例外がスローされるかどうかを確認するために、そこにもゴミを追加しましたが、何もありません。ファイルを別のディレクトリに移動しようとしましたが、それでも機能しません。
ここにあります:
誰かアイデアがありますか?
前もって感謝します。
log4j - 7.1.1 の最終ログとしての jboss
サブ展開として戦争を持っている耳を持っています。ear ファイルには、ejb-recievers 要素と webscheduler.war だけを持つ jboss-ejb-client.xml ファイルを含む META-INF ディレクトリがあります。この war は commons-logging-api.jar を使用します。このアプリケーションは 7.1.1.final として jboss にデプロイされます。ロギングにApache log4jを使用したい。そこで、ear の meta-inf ディレクトリに jboss-deployment-structure.xml を追加しました。
war の lib ディレクトリに commons-logging.properties ファイルがあり、次の内容が含まれています。
log4j.configuration=/usr/share/wth/jboss/jboss-as-7.1.1/standalone/configuration/log4j.xml
また、log4j-1.2.11.jar を除いて、lib には他のロギング フレームワーク jar がありません (SLF4j など)。ご覧のとおり、log4j.xml は上記のプロパティで記述されたディレクトリにあります。
問題は、jboss を起動したときに、いくつかのアプリケーション ログが log4j.xml (たとえば /a/b/c/srv.log) に記述されているログ ファイルに書き込まれますが、同時にログがデフォルトの srv にも書き込まれることです。 jboss ログ内に直接記録します (jboss/standalone/log/srv.log)。
jboss が独自のロギングを使用せず、提供した log4j 構成を使用するために欠けているものは何ですか。
java - Log4j と commons-logging を混在して使用すると、「クラス読み込みのデッドロック」が発生しますか?
log4j を a) 直接使用する場合と b) commons-logging を介して使用する場合で、ある種のクラスローディングのデッドロックが発生する状況を見つけたと思います。そのような状況が可能であるかどうか (JVM はそれを検出するべきではないでしょうか?) と、それに対して何をすべきかはわかりません。
問題
私たちのビルド システムでは、現在ユニット テストを順番に実行しています。ビルドを高速化するために、ユニット テストを並行して実行するように変更できます。ただし、そうすると、一部のビルドで実行タイムアウトが発生します。このような「ハング ビルド」のスレッド ダンプを分析すると、ほとんどの場合、さまざまなテストが含まれるさまざまなモジュールにいることがわかります。しかし、ロガーを初期化しようとするスレッドは常に 2 つに要約されLogger.getLogger
ますLogFactory.getLog
。
私の分析
したがって、1 つのスレッド (log4j を直接使用するスレッド) がこの場所で待機しています。
残念ながら、これはかなり「混雑した」行です。
そして、ここで待機している別のスレッド (commons-logging を使用):
これは簡単です:
だから私には、2番目のスレッドがクラスの初期化の過程にありPriority
、クラスのロードを待っているようLevel
です。最初のスレッドはおそらくクラスをロードしようとしLevel
(その行の他の部分は無関係のようです)、Level
クラスが拡張されるPriority
と、クラスがロードされるのを待ちPriority
ます。
ここでデッドロックが発生します。
では、この分析が正しいかどうか教えていただけますか? それとも私は何かを逃しましたか?
アップデート I
私はいくつかのテスト ケースを書きました。
この問題を示すいくつかのテスト ケースがあります。
TestLoadingByClassForName
デッドロックがかなり早く発生するはずです(私のマシンでは3回ごとに実行されます)TestLoadingMixed
観測されたスタック トレースの最小値まで取り除かれた問題のバージョンを表します。これははるかにまれに失敗します(おおよそ4倍)TestMixedLoggerInstantiation
動作を模倣します。1 つのクラスは log4j を使用してロガーをインスタンス化し、別のクラスは commons-logging を使用します。デッドロックはここでキャッチするのが難しいです。コードがはるかに多く含まれているためです。ランダムなスリープを追加する必要がありましたが、これはマシンに合わせて調整する必要があります。
TestMixedLoggerInstantiation
これは、ハングしたテスト ケースのスタック トレースです。
デッドロックの再現
https://github.com/sebastiankirsch/classloadingからコードをダウンロードします。
TestLoadingByClassForName
これは、複雑なシナリオでシステム/JVM が最終的にデッドロックに陥る前提条件です (数回実行するだけです)。
TestMixedLoggerInstantiation
これで数回実行します。平均実行時間をメモし、開いてUseLog4JLogger
、スリープ タイマーの合計を平均実行時間より少し短く設定します。これにより最終的にデッドロックが発生しますが、まれにしか発生しません。
したがって、次のようにコマンド ラインで実行します。
手動で組み立てる代わりtestExecution
に、テストでブレーク ボインを設定し、デバッグps -ef | grep TestMixedLoggerInstantiation
し、シェルを入力して、IDE が使用するコマンドをコピーします。
logging - パッケージ以外のすべてにエラーしきい値を設定する方法
org.apache.log4j.PropertyConfigurator を介してロギングを構成しました
直接呼び出してロギングを使用するサードパーティコードを使用しています
この呼び出しはレベル チェックをスキップし、アペンダーのしきい値のみに依存します。私のパッケージからのログもそれを通過しないため、アペンダーのしきい値を上げることはできません。コードの INFO ログ レベルとサード パーティのエラーが必要です。
java - Hibernate は apache commons ロギングと slf4j を使用します - なぜ 2 つのロギング抽象化レイヤーが必要なのですか?
私は Java ロギング ライブラリの世界ではあまり経験がありません。休止状態の使用を開始した後、apache commons ロギング ライブラリと sl4j ライブラリを含める必要があることがわかりました。実際のロギング ライブラリは log4j であるため、そのライブラリも含めました。
apache commons logging と sl4j libs について読んだ後、どちらも別のライブラリ (私の場合は log4j) でログを記録するための抽象化レイヤーを表していることがわかりました。
2 つの抽象化レベルが必要なのはなぜですか?
java - 別のファイルにログインできません: Log4j
abcAPI を使用して 2 つの異なるログ ファイルにメッセージを記録しようとしていlog4j
ます。以下は私のlog4j.xmlです
なぜかOnline.logにしかログインしていません。以下の方法で正しいものを取得してもSample.logにログインできません
何が悪いのか理解できません!何か助けはありますか?
oracle - コモンズ ロギング用の WebLogic ロギングのコンフィグレーション
WebLogic 10.3.3 サーバーにデプロイされた Spring Web アプリケーションを作成しています。ここのOracleドキュメントで説明されているように、ログを有効にしようとしました: http://docs.oracle.com/cd/E14571_01/web.1111/e13739/config_logs.htm#WLLOG154
commons-logging-1.1.1.jar と com.bea.core.weblogic.commons.logging_1.4.0.0.jar の両方が WebLogic ドメインの lib フォルダに配置されており、ロガーを正確に初期化しようとしています。 Oracle の例で説明されています。サーバー コンソールに次の例外が表示されます。
原因: org.apache.commons.logging.LogConfigurationException: 選択された LogFactory 実装は LogFactory を拡張しません。構成を確認してください。(java.lang.ClassCastException:weblogic.logging.commons.LogFactoryImpl が原因)
考えられる解決策を知っている人はいますか?