2013-04-10 132 views
2

我正在使用logback進行日誌記錄的應用程序。我使用logback DBAppender將日誌插入到數據庫中。具有logback的異步DBAppender

所有的工作對我很好,我能夠插入並看到數據庫中的日誌。

我用200行日誌代碼做了一些測試,並測量了這200個日誌的時間消耗,並且在不使用DBAppender的情況下獲得了10毫秒的時間消耗。當我添加DBAppender時,我獲得了大約2700毫秒。

我試圖使用ch.qos.logback.classic.AsyncAppender沒有運氣使它異步工作。我總是得到0結果插入到我的數據庫。

我的配置看起來像如下:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration debug="true"> 

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are by default assigned the type 
     ch.qos.logback.classic.encoder.PatternLayoutEncoder --> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
    </appender> 

    <appender name="DBAppPostgreSQL" class="ch.qos.logback.classic.db.DBAppender"> 
     <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"> 
      <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
        <driverClass>org.postgresql.Driver</driverClass> 
        <url>jdbc:postgresql://127.0.0.1:5678/DB</url> 
        <user>YYYYY</user> 
        <password>XXX</password> 
      </dataSource> 
     </connectionSource> 
     <sqlDialect class="ch.qos.logback.core.db.dialect.PostgreSQLDialect" /> 
     <insertHeaders>true</insertHeaders> 
</appender> 

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> 
      <appender-ref ref="DBAppPostgreSQL" /> 
      <includeCallerData>true</includeCallerData> 
    </appender> 

    <root level="debug"> 
     <appender-ref ref="ASYNC" /> 
     <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 

有什麼用我的配置缺失?或者有沒有其他方法可以使日誌更快地插入數據庫?

請注意,我使用PostgreSQL

感謝,

編輯:

我使用的logback 1.0.11在SLF4J 1.7.5。另外我使用postgresql 8.0.325。

的的logback的內部狀態是:

10:52:09,693 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 
10:52:09,693 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 
10:52:09,693 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/D:/BOOM/BoomFinancial/BoomMonitoringTesting/bin/logback.xml] 
10:52:09,759 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] 
10:52:09,761 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT] 
10:52:09,771 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property 
10:52:09,800 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.classic.db.DBAppender] 
10:52:09,803 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [DBAppPostgreSQL] 
10:52:09,809 |-ERROR in [email protected]:75 - no applicable action for [dataSource], current pattern is [[configuration][appender][connectionSource][dataSource]] 
10:52:09,866 |-INFO in [email protected] - Could not call supportsGetGeneratedKeys method. This may be recoverable 
10:52:09,866 |-INFO in [email protected] - Driver name=PostgreSQL Native Driver 
10:52:09,866 |-INFO in [email protected] - Driver version=PostgreSQL 8.0 JDBC2 with NO SSL (build 325) 
10:52:09,866 |-INFO in [email protected] - supportsGetGeneratedKeys=false 
10:52:09,867 |-ERROR in [email protected]:77 - no applicable action for [sqlDialect], current pattern is [[configuration][appender][sqlDialect]] 
10:52:09,868 |-ERROR in [email protected]:21 - no applicable action for [insertHeaders], current pattern is [[configuration][appender][insertHeaders]] 
10:52:09,870 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.classic.AsyncAppender] 
10:52:09,872 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [ASYNC] 
10:52:09,872 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [DBAppPostgreSQL] to ch.qos.logback.classic.AsyncAppender[ASYNC] 
10:52:09,872 |-INFO in ch.qos.logback.classic.AsyncAppender[ASYNC] - Attaching appender named [DBAppPostgreSQL] to AsyncAppender. 
10:52:09,874 |-INFO in ch.qos.logback.classic.AsyncAppender[ASYNC] - Setting discardingThreshold to 51 
10:52:09,874 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG 
10:52:09,875 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [ASYNC] to Logger[ROOT] 
10:52:09,875 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT] 
10:52:09,875 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration. 
10:52:09,876 |-INFO in [email protected] - Registering current configuration as safe fallback point 
+0

配置文件看起來不錯。你使用的是哪個版本的logback?你可以在你的問題中包含logback的內部狀態消息嗎? – Ceki 2013-04-10 16:59:59

+0

感謝Ceki的評論。我編輯了問題並添加了logback的版本以及內部狀態消息。 – CharbelBadr 2013-04-11 07:54:29

回答

4

有通過的logback報告一個錯誤消息:

0:52:09,809 |-ERROR in [email protected]:75 - no applicable action for [dataSource], current pattern is [[configuration][appender][connectionSource][dataSource]] 

這表明內嵌套的元件不能被理解。下面是配置文件的相關部分:

<appender name="DBAppPostgreSQL" class="ch.qos.logback.classic.db.DBAppender"> 
    <!-- DriverManagerConnectionSource does not have a dataSource property --> 
    <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"> 
    <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <driverClass>org.postgresql.Driver</driverClass> 
     <url>jdbc:postgresql://127.0.0.1:5678/DB</url> 
     <user>YYYYY</user> 
     <password>XXX</password> 
    </dataSource> 
    </connectionSource> 
    <sqlDialect class="ch.qos.logback.core.db.dialect.PostgreSQLDialect" /> 
    <insertHeaders>true</insertHeaders> 
</appender> 

ch.qos.logback.core.db.DriverManagerConnectionSource沒有dataSource財產而ch.qos.logback.core.db.DataSourceConnectionSource一樣。您可能想要配置DBAppPostgreSQL:

<appender name="DBAppPostgreSQL" class="ch.qos.logback.classic.db.DBAppender"> 
    <!-- use DataSourceConnectionSource instead of DriverManagerConnectionSource --> 
    <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource"> 
    <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <driverClass>org.postgresql.Driver</driverClass> 
     <url>jdbc:postgresql://127.0.0.1:5678/DB</url> 
     <user>YYYYY</user> 
     <password>XXX</password> 
    </dataSource> 
    </connectionSource> 
    <sqlDialect class="ch.qos.logback.core.db.dialect.PostgreSQLDialect" /> 
    <insertHeaders>true</insertHeaders> 
</appender> 
0

感謝您的Ceki的答案。我不能評論它,所以我添加了一個新的答案: Ceki的答案包含另外一件事情是不正確的:元素「url」應替換爲「jdbcUrl」。所以配置應該是這樣的:

<appender name="DBAppPostgreSQL" class="ch.qos.logback.classic.db.DBAppender"> 
    <!-- use DataSourceConnectionSource instead of DriverManagerConnectionSource --> 
    <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource"> 
    <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <driverClass>org.postgresql.Driver</driverClass> 
     <jdbcUrl>jdbc:postgresql://127.0.0.1:5678/DB</jdbcUrl> 
     <user>YYYYY</user> 
     <password>XXX</password> 
    </dataSource> 
    </connectionSource> 
    <sqlDialect class="ch.qos.logback.core.db.dialect.PostgreSQLDialect" /> 
    <insertHeaders>true</insertHeaders> 
</appender>