【问题标题】:Unable to get c3p0 logging to go to file无法让 c3p0 日志记录到文件
【发布时间】:2019-08-22 09:59:40
【问题描述】:

我正在使用 Java 8、Hibernate 4.3.11 和 c3p0 9.2.1 以及标准 Java 日志记录包,在将调试信息从 c3p0 写入我的调试日志时遇到问题。

我加了

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

启动,这让 c3p0 使用标准日志记录并写入控制台,但它不会写入我的调试日志文件。

我为我的应用程序和库初始化记录器

SongKong.ioLogger = Logger.getLogger("org.jaudiotagger");
MainWindow.logger = Logger.getLogger("com.jthink");

然后调用我的 LogProperties 类来配置日志文件和控制台并写入数据,这样就可以了。

我做错了什么

  package com.jthink.songkong.logging;


    import com.jthink.songkong.cmdline.SongKong;
    import com.jthink.songkong.preferences.GeneralPreferences;
    import com.jthink.songkong.preferences.UserPreferences;
    import com.jthink.songkong.ui.MainWindow;
    import com.jthink.songkong.util.Platform;

    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.util.logging.ConsoleHandler;
    import java.util.logging.FileHandler;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    /**
     * This defines the command line properties of SongKong, currently consists of logger settings
     */
    public final class LogProperties
    {

        public static int LOG_SIZE_IN_BYTES = 10000000;

        public LogProperties()
        {
            try
            {

                //Set logging for jaudiotagger lib, user configurable
                SongKong.ioLogger.setLevel(Level.parse(String.valueOf(GeneralPreferences.getInstance().getIoDebugLevel())));
                SongKong.ioLogger.setUseParentHandlers(false);

                //Set logging for songkongdebug, user configurable
                MainWindow.logger.setLevel(Level.parse(String.valueOf(GeneralPreferences.getInstance().getDebugLevel())));
                MainWindow.logger.setUseParentHandlers(false);

                //C3p0 Logger
                Logger c3p0Logger = Logger.getLogger("com.mchange.v2.c3p0");
                c3p0Logger.setLevel(Level.FINEST);
                c3p0Logger.setUseParentHandlers(false);

                //Set Filehandler used for writing to debug log
                String logFileName = Platform.getPlatformLogFolderInLogfileFormat() + "songkong_debug%u-%g.log";
                FileHandler fe = new FileHandler(logFileName, LOG_SIZE_IN_BYTES, 10, true);
                fe.setEncoding(StandardCharsets.UTF_8.name());
                fe.setFormatter(new com.jthink.songkong.logging.LogFormatter());
                fe.setLevel(Level.FINEST);

                //Write output from these loggers to the debug log file
                MainWindow.logger.addHandler(fe);
                SongKong.ioLogger.addHandler(fe);
                c3p0Logger.addHandler(fe);

                ConsoleHandler ch = new ConsoleHandler();
                ch.setFormatter(new com.jthink.songkong.logging.LogFormatter());
                ch.setLevel(Level.FINEST);
                MainWindow.logger.addHandler(ch);
                SongKong.ioLogger.addHandler(ch);
                c3p0Logger.addHandler(ch);
            }
            catch (IOException ioe)
            {
                MainWindow.userInfoLogger.severe("Unable to open log file");
            }
        }

    }

我需要调试才能写入日志文件,因为我希望客户运行一些测试,所以如果数据只是写入控制台是不好的。此外,写入控制台的 c3p0 数据的格式不是我的其他消息的格式(由 com.jthink.songkong.logging.LogFormatter() 定义),所以看起来我对 LogProperties() 的调用实际上被忽略了,即使在我第一次访问 c3p0 之前调用它。

例如,这是在启动时输出到控制台

debuglogfile is:C:\Users\Paul\AppData\Roaming\SongKong\Logs/songkong_debug%u-%g.log
userlogfile is:C:\Users\Paul\AppData\Roaming\SongKong\Logs/songkong_user%u-%g.log
23/08/2019 10.44.26:BST:SongKong:setLocale:SEVERE: Locale is:en
23/08/2019 10.44.27:BST:SongKong:setFonts:WARNING: Fonts Enabled:true
23/08/2019 10.44.27:BST:SongKong:setFonts:WARNING: Fonts configured successfully
23/08/2019 10.44.27:BST:SongKong:init:WARNING: end
23/08/2019 10.44.27:BST:SongKong:finish:WARNING: finish
23/08/2019 10.44.29:BST:SongKong:writeSystemInfo:WARNING: SongKong 6.3 Psychocandy 1099 24/07/2019 using Java 1.8.0_181 25.181-b13 64bit on Windows 10 10.0 amd64 initialized successfully
23/08/2019 10.44.29:BST:SongKong:writeSystemInfo:WARNING: No of CPUs:8
23/08/2019 10.44.29:BST:SongKong:writeSystemInfo:WARNING: SongKong has been configured with minimum heap memory of 100 mb, maximum heap memory of 1,778 mb and maximum permanent memory of -32 mb
23/08/2019 10.44.29:BST:SongKong:writeSystemInfo:WARNING: Total Computer Memory is 24,466 mb
23/08/2019 10.44.30:BST:SongKong:writeSystemInfo:WARNING: Username:Paul:Domain:pclaptop:RunningAsAdmin:false
23/08/2019 10.44.30:BST:SongKong:checkDatabase:WARNING: Setting Db Folder:C:\Users\Paul\AppData\Roaming\SongKong/Database
23/08/2019 10.44.30:BST:SongKong:checkDatabase:WARNING: Lock File remaining from previous, deleting lock
23/08/2019 10.44.30:BST:HibernateUtil:createFactory:SEVERE: ----Initilizing Hibernate Session factory
Aug 23, 2019 10:44:31 AM com.mchange.v2.log.MLog <clinit>
INFO: MLog clients using java 1.4+ standard logging.
Aug 23, 2019 10:44:32 AM com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10]
Aug 23, 2019 10:44:32 AM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@3c73cbbb [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@adb66302 [ acquireIncrement -> 3, acquireRetryAttempts -> 10, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> true, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 2rwcn5a41gohnzr1p7tndj|54e1c68b, idleConnectionTestPeriod -> 3000, initialPoolSize -> 1, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 2000, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 5, maxStatements -> 3000, maxStatementsPerConnection -> 50, minPoolSize -> 1, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@2d7c4b75 [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 2rwcn5a41gohnzr1p7tndj|f736069, jdbcUrl -> jdbc:h2:async:C:\Users\Paul\AppData\Roaming\SongKong/Database/Database;FILE_LOCK=SOCKET;MVCC=TRUE;DB_CLOSE_ON_EXIT=FALSE;CACHE_SIZE=50000;, properties -> {user=******, password=******} ], preferredTestQuery -> null, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 10, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 2rwcn5a41gohnzr1p7tndj|a38c7fe, numHelperThreads -> 3 ]
23/08/2019 10.44.36:BST:SongKong:checkDatabase:SEVERE: Accessed Database okay
23/08/2019 10.44.36:BST:SongKong:checkCache:WARNING: Checking Cache:C:\Users\Paul\AppData\Roaming\SongKong\Database\EhCache
23/08/2019 10.44.38:BST:SongKong:checkCache:WARNING: Checked Cache:C:\Users\Paul\AppData\Roaming\SongKong\Database\EhCache
23/08/2019 10.44.39:BST:SongKong:setUserAgent:WARNING: start
23/08/2019 10.44.41:BST:AbstractAcoustidQuery:performBasicSubmissionQuery:SEVERE: Posting to url:http://api.acoustid.org/v2/user/lookup?format=xml&client=8XaBELgH&user=7st7qtJpzr
23/08/2019 10.44.42:BST:SongKong:setUserAgent:WARNING: end
23/08/2019 10.44.42:BST:SongKong:finish:WARNING: finish

【问题讨论】:

    标签: java logging c3p0 java.util.logging


    【解决方案1】:

    此外,控制台写入的 c3p0 数据的格式不是我的其他消息的格式(由 com.jthink.songkong.logging.LogFormatter() 定义),所以看来我对 LogProperties() 的调用实际上是即使在我第一次访问 c3p0 之前调用它也被忽略。

    记录器受garbage collection 约束。您的代码中的一个错误如下: Logger c3p0Logger = Logger.getLogger("com.mchange.v2.c3p0");

    删除该行并创建一个常量:

    private static final Logger c3p0Logger = Logger.getLogger("com.mchange.v2.c3p0");

    【讨论】:

      【解决方案2】:

      我的方法的根本缺陷是我从应用程序本身调用我的日志记录代码。但我需要指定以下属性

      java.util.logging.config.class
      

      在启动时使用我的日志记录配置类的名称

      例如

      -Djava.util.logging.config.class=com.jthink.songkong.logging.LogProperties 
      

      我也需要

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

      以便 c3p0 知道我使用的是标准日志记录。

      这解决了这个问题,虽然无法从代码中调用类导致一些逻辑问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-02
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        相关资源
        最近更新 更多