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

时间:2019-08-22 09:59:40

标签: java logging c3p0 java.util.logging

我正在使用Java 8,Hibernate 4.3.11和c3p0 9.2.1和标准Java日志记录程序包,但是在将调试信息从c3p0写入我的调试日志时遇到了麻烦。

我添加了

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

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

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

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

2 个答案:

答案 0 :(得分:0)

  

此外,写入控制台的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");

答案 1 :(得分:0)

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

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知道我正在使用标准日志记录。

尽管不能从代码中调用类使逻辑上有些问题,但这解决了这个问题。