Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以禁用c3p0记录到System.err吗?_Java_Slf4j_C3p0_Java.util.logging - Fatal编程技术网

Java 我可以禁用c3p0记录到System.err吗?

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

根据,您可以手动指定日志应该放在哪里,无论是通过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.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

这将避免必须:

  • 将整个日志后端更改为log4j,或
  • 使用“双跳”将您的登录路由到另一个答案中提供的网桥
  • 这就是我们正在做的路由到slf4j和logback。然而,在一个应用程序中,我们仍然需要使用log4j桥,直到发布更新c3p0版本的新版本hibernate的
    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