2011-07-28 34 views
8

c3p0 documentationによれば、JDK 1.4ロギング、Log4j、またはSystem.outを介して、ログをどこに転送するかを手動で指定できます。私はSLF4Jを実行しているので、私はorg.slf4j.jul-to-slf4jを含めて、アプリケーションにSLF4JBridgeHandler.install()を呼び出して、すべてのJavaユーティリティのログがSLF4Jを経由するように強制します。また、私は私のc3p0.propertiesファイルに次のプロパティを含めました:c3p0のSystem.errへのロギングを無効にすることはできますか?

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

これ、マニュアルに従って、順番にSLF4Jに物事をログアウトしますJDK 1.4のログにログインするためにC3P0を強制します。これは、やや動作しませんが、私はまだいくつかのログが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行は意図したとおり、それはまた、SLF4Jにログインしていますから、まったく意味をなさないSystem.errに記録されます。

c3p0からSystem.errへのログを無効にする手段はありますか?

+0

JULではなくlog4jを試してみましたか? –

+0

@matt b、それを答えてあなたが勝つ;) –

答えて

9

私はlog4jバインディングにtryを与え、それを使用するようにc3p0を設定することをお勧めします。

java.util.loggingは、私が今まで使ってきたより混乱しやすいものの1つです。

-3

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

+1

私が知っているロギングフレームワークでは、出力ストリームをリダイレクトすることはできません。 – TheLQ

+0

そして、ロガーがファイルにログするように設定されていれば?または他のストリームに? – Grod

2

log4j-over-slf4jを使用すると、c3p0のMLogは "偽の" log4j(これはslf4j)に記録され、slf4jの出力に使用するプロバイダを使用することができます。

編集:これは私がそれを使用してこの回答を提出したときに機能しましたが、数ヶ月後にこれが明確に破られました。 FredCookeanswerに必要な追加の変更を参照してください。

3

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

org.apache.log4j.Hierarchy 

いくつかの議論:この空のクラスを提供することにより

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

それに加えて
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>log4j-over-slf4j</artifactId> 
    <version>1.7.2</version><!-- Or whatever you want/need... --> 
</dependency> 

、あなたは、このファイルに刺激性のロジックをバイパスする必要がありますここに見つけることができます:

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

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

+0

今日このソリューションを試しました。私はOPで直面した同じ厄介なメッセージを持っていました。この回答に示されている依存関係を削除した直後に、すべてのc3p0メッセージは単に消滅します。 – Stephan

3

mchange-commons-javaアーチファクトのバージョン0.2.5では、受け入れられた回答が書かれていた(ほぼ3年前)ので、バックエンドへのslf4jログの直接サポートが追加されました。これはthe c3p0 documentation usesです。

は、例えば: 'com.mchange.v2.log.MLog = com.mchange.v2.log.slf4j.Slf4jMLog'

しかし... C3P0のMavenの中央で最新の安定版リリース(0.9.2.1)は、そのバージョンを使用していません。その設定を使用するには、少なくとも0.9.5-pre2にアップグレードする必要があります。最新の未発表バージョンこれは、どちらかすることを避けるためでしょう

0.9.5-pre7です:

    あなたのログをルーティングの「ダブルホップ」を使用しLog4jのためにあなたの全体的なログのバックエンドを変更したり、
  1. 別の答えで提供される橋に

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

これはFredCookeの回答が参照している問題の1つと考えていますが、2つの問題が混乱する可能性があります。 Hibernateはクラスパスにjboss-loggingの依存関係を持ちますが、それはlogbackが存在する場合にそれを知的に使用します。しかし、c3p0はlog4jにログエントリを送るためにさらにcom.mchange.v2.log.MLog = com.mchange.v2.log.log4j.Log4jMLogで設定する必要があり、log4j => slf4j 'ブリッジで捕捉されます。

+0

0.9.5がリリースされました。 – SingleShot