Java 我可以禁用c3p0记录到System.err吗?
根据,您可以手动指定日志应该放在哪里,无论是通过JDK1.4日志、Log4j还是通过System.out。我正在运行SLF4J,因此我在应用程序中加入了Java 我可以禁用c3p0记录到System.err吗?,java,slf4j,c3p0,java.util.logging,Java,Slf4j,C3p0,Java.util.logging,根据,您可以手动指定日志应该放在哪里,无论是通过JDK1.4日志、Log4j还是通过System.out。我正在运行SLF4J,因此我在应用程序中加入了org.SLF4J.jul-to-SLF4J并调用SLF4JBridgeHandler.install(),以强制所有Java util日志记录通过SLF4J。此外,我已在我的c3p0.properties文件中包含以下属性: com.mchange.v2.log.MLog = com.mchange.v2.log.jdk14logging.Jd
org.SLF4J.jul-to-SLF4J
并调用SLF4JBridgeHandler.install()
,以强制所有Java util日志记录通过SLF4J。此外,我已在我的c3p0.properties
文件中包含以下属性:
com.mchange.v2.log.MLog = com.mchange.v2.log.jdk14logging.Jdk14MLog
根据文档,这将迫使c3p0登录到jdk1.4日志,而jdk1.4日志又将把事情记录到SLF4J。这确实起到了一定的作用,但我仍然看到一些日志命中了系统。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]
上面的前两行被记录到System.err
,这根本没有任何意义,因为它也按预期记录到SLF4J
有没有办法禁用从c3p0到
System.err
的日志记录?您可以使用System.setErr()将System.err指向另一个打印流。它不会修改C3PO,但是日志输出将显示在您想要的地方。我建议尝试一下log4j绑定,并配置c3p0以使用它
java.util.logging是我使用过的最让人困惑的东西之一。如果使用,c3p0的MLog将记录到“假”log4j,而这个“假”log4j又将是slf4j,那么您可以使用您喜欢的任何提供程序来输出slf4j
编辑:当我使用它并提交了这个答案时,它起了作用,但几个月后他们明确地打破了这个。请参阅中的其他必要修改。添加以下依赖关系可以解决部分问题,但不是全部问题
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.2</version><!-- Or whatever you want/need... -->
</dependency>
关于这个问题的一些辩论可以在这里找到:
为此,我计划创建一个依赖于log4j-over-slf4j的单类依赖项,但它在一个项目中工作正常。我现在可以从slf4j nop切换到slf4j simple to logback,并从我自己的代码和Hibernate/C3P0中获得预期的结果。自从被接受的答案被写出来(大约三年前),在
McChange commons java
工件的0.2.5版本中添加了对slf4j登录到任何后端的直接支持,这是什么
例如:“com.mchange.v2.log.MLog=com.mchange.v2.log.slf4j.Slf4jMLog
”
然而。。。最新的稳定版本在Maven Central(0.9.2.1)的c3p0中没有使用该版本。您必须升级到至少0.9.5-pre2才能使用该配置。最新的未发布版本是0.9.5-pre7
这将避免必须:
hibernate-c3p0
我怀疑这是弗雷德库克的答案所指的问题之一。。。但这可能会混淆两个问题。Hibernate将jboss日志依赖项引入类路径,但如果存在,它将智能地使用logback。但是,c3p0需要额外配置
com.mchange.v2.log.MLog=com.mchange.v2.log.log4j.Log4jMLog
将其日志条目发送到log4j,然后被“log4j=>slf4j”桥捕获。您尝试过使用log4j而不是JUL吗?@matt b,回答这个问题,您就赢了;)重定向输出流在我所知道的任何日志框架中都不起作用。如果日志记录器配置为登录到文件?或者其他的流?我今天尝试了这个解决方案。我曾经有过OP面临的同样恼人的消息。在去掉这个答案中的依赖项之后,所有c3p0消息都消失了。0.9.5已经发布。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.2</version><!-- Or whatever you want/need... -->
</dependency>
org.apache.log4j.Hierarchy