关闭Hibernate c3p0的日志记录

11

我正在使用Hibernate的c3p0连接池和标准Java 1.4 java.util.logging。在启动时,我的应用程序使用static块设置其日志属性(包括格式化程序和日志级别)。每次启动我的应用程序时,我都会看到以下内容:

2011-04-16 17-43-51 [com.mchange.v2.log.MLog] INFO: {MLog.<clinit>) MLog clients using java 1.4+ standard logging.
2011-04-16 17-43-51 [com.mchange.v2.c3p0.C3P0Registry] INFO: {C3P0Registry.banner) Initializing c3p0-0.9.1 [built 16-January-2007 14:46:42; debug? true; trace: 10]
2011-04-16 17-43-51 [com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource] INFO: {AbstractPoolBackedDataSource.getPoolManager)
...

我已经尝试过了

Logger.getLogger("com.mchange").setLevel(Level.WARNING);
com.mchange.v2.log.MLog.getLogger().setLevel(MLevel.WARNING);
System.setProperty("com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL", "WARNING");

目前我发现唯一防止这种情况的方法是:

Logger.getLogger("").setLevel(Level.WARNING);

这会影响到所有事情 - 这不是一个好的副作用。谷歌没有帮助。请问有人能帮忙吗?

7个回答

21
我找到的方法是设置系统属性。
System.setProperty("com.mchange.v2.log.MLog", "com.mchange.v2.log.FallbackMLog");

除了

System.setProperty("com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL", "WARNING");

我一开始认为缺少任何其他记录系统会使其可选,但显然我错了。

P.S.

该死的重新发明轮子的自定义日志记录实现,比如 c3p0 使用的那个...


将日志重定向到控制台非常有用[在我的情况下是Tomcat日志]。 - Fakrudeen

17

我找到的实现方法是:

在你的classpath中创建一个名为mchange-log.properties的文件,并将Frozen Spider建议的属性放入其中。

com.mchange.v2.log.MLog=com.mchange.v2.log.FallbackMLog
com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=WARNING

即使您无法直接设置系统属性,该方法仍能正常工作。


1
将以下内容添加到我的log4j.properties文件中。另外,com.mchange.v2.log.MLog.getLogger().setLevel(MLevel.SEVERE); - adityalad
我们可以将这个添加到log4j2.xml文件中吗? - Pritam Patil

4

似乎c3p0的日志记录默认设置为DEBUG级别,这可能会导致大量无用信息的输出。

通过在log4j.properties文件中添加以下内容,您可以告诉日志记录器不再输出c3p0的消息,除非这些消息很重要:

log4j.logger.com.mchange.v2=WARN

3

您不想看到任何c3p0日志吗?

如果是这样,请尝试:

Logger.getLogger("com.mchange.v2.c3p0").setLevel(Level.WARNING);

或者,如果您甚至不想看到日志的第一行:

Logger.getLogger("com.mchange.v2").setLevel(Level.WARNING);

你在什么时候以编程方式设置上述日志级别?也许,你试图摆脱的日志是在上面的代码执行之前记录的。你能验证一下想要删除的日志是否发生在上面的代码执行之前吗? - hooknc
不,它们发生在那之后。可以通过使用Logger.getLogger("").setLevel(Level.WARNING);或我在自己的回复中描述的方法进行验证。重点是要摆脱令人讨厌(至少对我来说)的配置文件堆积 - Hibernate已经需要足够多的配置文件了。此外,我仍然没有看到log4j或Logback相对于jdk1.4日志记录包的任何实质性优势。 - Alex Abdugafarov

1
这可能已经很晚了,但根据c3p0项目网站的说法,可以在mchange-log.properties中配置日志记录,从而使用slf4j或log4j(因此也可以使用Logback)捕获信息。
链接http://www.mchange.com/projects/c3p0/#configuring_logging提供了以下信息:在mchange-log.properties文件中设置属性com.mchange.v2.log.MLog等于com.mchange.v2.log.slf4j.Slf4jMLog,然后在logback.xml中提供一个类似于这样的记录器:
<logger name="com.mchange" level="warn" additivity="false">
    <appender-ref ref="c3p0-log" />
</logger>

注意:在使用这段代码之前,您需要创建一个名为c3p0-log的logback appender。

0
在您的根类路径下创建一个名为log4j.properties的文件,将以下内容设置在其中:
# Configure the name of the file for the LOGGER appender
log4j.appender.LOGGER=org.apache.log4j.ConsoleAppender
log4j.appender.LOGGER.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGGER.layout.ConversionPattern=%d{MM-dd@HH:mm:ss} %-5p (%13F:%L) %3x - %m%n
log4j.appender.LOGGER.append=false

# this line logs everything from hibernate package at info level, you can refine this to include only some pachages like log4j.logger.org.hibernate.hql etc.,
log4j.logger.org.hibernate=INFO, LOGGER

log4j.logger.org.jboss.cache=INFO, LOGGER

这是一种更好的实现日志记录的方式,因为如果您以编程方式设置日志记录策略,则配置有时可能根本不起作用(就像您的情况一样)... 如果您使用log4j.properties文件,则配置将在应用程序启动时应用,并且一切都可以顺利运行。


0

这只发生在较旧的c3p0版本上。因此,检查是否可以更新到新版本也可能是值得的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接