8

c3p0 のドキュメントによると、JDK 1.4 ロギング、Log4j、または System.out のいずれかを介して、ログの送信先を手動で指定できます。私は SLF4J を実行しているので、すべての Java util ログが SLF4J を通過するように、アプリケーションに含めorg.slf4j.jul-to-slf4jて呼び出しました。SLF4JBridgeHandler.install()さらに、c3p0.propertiesファイルに次のプロパティを含めました。

com.mchange.v2.log.MLog = com.mchange.v2.log.jdk14logging.Jdk14MLog

ドキュメントによると、これにより c3p0 は JDK 1.4 ロギングに強制的にログを記録し、次に SLF4J にログを記録します。これはある程度機能しますが、まだいくつかのログがヒットしていSystem.errます:

例 1:

17:24:32.648 [main] INFO  com.mchange.v2.log.MLog - MLog clients using java 1.4+ standard logging.
Jul 27, 2011 5:24:32 PM com.mchange.v2.log.MLog <clinit>
INFO: MLog clients using java 1.4+ standard logging.
Jul 27, 2011 5:24:32 PM com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
17:24:32.754 [main] INFO  com.mchange.v2.c3p0.C3P0Registry - Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]

上記の 1 行目と 6 行目は SLF4J に書き込まれ、その他は に書き込まれSystem.errます。

例 2:

Jul 27, 2011 5:24:33 PM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> z8kflt8huk1hupkhyfms|13b33a0e, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> org.sqlite.JDBC, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> z8kflt8huk1hupkhyfms|13b33a0e, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:sqlite:/tmp/floodstream.db, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 1800, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
17:24:33.603 [main] INFO  com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> z8kflt8huk1hupkhyfms|13b33a0e, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> org.sqlite.JDBC, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> z8kflt8huk1hupkhyfms|13b33a0e, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:sqlite:/tmp/floodstream.db, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 1800, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]

上記の最初の 2 行は に記録されていますがSystem.err、意図したとおりに SLF4J にも記録しているため、まったく意味がありません。

System.errc3p0 からのログを無効にする方法はありますか?

4

5 に答える 5

3

受け入れられた回答が書かれて以来 (ほぼ 3 年前)、任意のバックエンドへの slf4j ログインの直接サポートがmchange-commons-javaアーティファクトのバージョン 0.2.5 に追加されました。これはc3p0 ドキュメントで使用されているものです。

例: ' com.mchange.v2.log.MLog = com.mchange.v2.log.slf4j.Slf4jMLog'

ただし... c3p0 の Maven Central (0.9.2.1) の最新の安定版リリースは、そのバージョンを使用していません。その構成を使用するには、少なくとも 0.9.5-pre2 にアップグレードする必要があります。最新の未発表バージョンは 0.9.5-pre7 です

これにより、次のいずれかを行う必要がなくなります。

  1. ログ バックエンド全体を log4j に変更する、または
  2. 別の回答で提供されているブリッジにログインをルーティングする「ダブルホップ」を使用します。

これは、slf4j と logback にルーティングするために行っていることです。hibernate-c3p0ただし、あるアプリケーションでは、c3p0 バージョンを更新する新しいバージョンの hibernate がリリースされるまで、引き続き log4j ブリッジを使用する必要があります。

これは、FredCookeの回答が参照している問題の1つであると思われます...しかし、2つの問題を混乱させる可能性があります. Hibernate は jboss-logging の依存関係をクラスパスにもたらしますが、logback が存在する場合はすでにインテリジェントに使用されます。com.mchange.v2.log.MLog = com.mchange.v2.log.log4j.Log4jMLogただし、c3p0 は、「log4j => slf4j」ブリッジによってキャッチされる log4j にログ エントリを送信するように追加で構成する必要があります。

于 2014-03-31T03:45:16.060 に答える
3

次の依存関係を追加すると、問題の一部が処理されますが、すべてではありません。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.2</version><!-- Or whatever you want/need... -->
</dependency>

それに加えて、このファイルの刺激的なロジックをバイパスする必要があります。

https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java#L93

この空のクラスを提供することにより:

org.apache.log4j.Hierarchy

この問題に関する議論は次の場所にあります。

https://issues.jboss.org/browse/JBLOGGING-65

この目的のために log4j-over-slf4j に依存する単一のクラス依存関係を作成する予定ですが、1 つのプロジェクトでそのまま動作しています。slf4j-nop から slf4j-simple に切り替えてログバックし、自分のコードと Hibernate/C3P0 の両方から期待される結果を得ることができます。

于 2013-02-18T09:22:49.617 に答える
2

log4j-over-slf4jを使用する場合、c3p0 の MLog はその「偽の」log4j にログを記録し、それが slf4j になるため、slf4j の出力に好みのプロバイダーを使用できます。

編集:これは、私がそれを使用してこの回答を送信したときに機能しましたが、数か月後に具体的に壊れました。FredCooke回答で必要な追加の変更を参照してください。

于 2012-04-02T01:53:05.590 に答える
-3

System.setErr() を使用して、System.err が別の PrintStream を指すようにすることができます。C3PO は変更されませんが、ログ出力出力は必要な場所に表示されます。

于 2011-07-28T00:46:34.267 に答える