无法获取 c3p0 日志以转到文件

Unable to get c3p0 logging to go to file

我正在使用 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 class 来配置日志文件和控制台并写入数据,这有效。

我做错了什么

  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

Also the format of c3p0 data written the console is not in the format of my other messages (as defined by com.jthink.songkong.logging.LogFormatter()) so it seems that my call to LogProperties() is effectively being ignored even though it is called before I access c3p0 for the first time.

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

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

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

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

java.util.logging.config.class

启动时使用我的日志配置名称 class

例如

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

我也需要

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

以便 c3p0 知道我正在使用标准日志记录。

这解决了问题,尽管无法从代码中调用 class 导致一些逻辑问题。