2011-10-05 122 views
2

有沒有辦法改變logback使用dbAppender將其數據寫入到的表的方法,它有三個必須在使用dbAppender之前創建的默認表,但我想定製它以寫入一個表我的選擇。類似於Log4J,我可以指定將日誌插入數據庫時​​執行的SQL。Logback dbAppender自定義SQL

+0

可能重複[DBAppender - 如何更改默認表名稱?](http://stackoverflow.com/questions/4690381/dbappender-how-to-change-default-table-names) –

回答

0

您需要實現ch.qos.logback.classic.db.names.DBNameResolver,並在配置中使用它:

<appender name="DB" class="ch.qos.logback.classic.db.DBAppender"> 
    <dbNameResolver class="com.example.MyDBNameResolver"/> 
    <!-- ... --> 
</appender> 
+0

嗨,謝謝你的回答,你知道哪裏有這個實現的例子,我已經實現了DBNameresolver,但我不知道這些方法需要什麼和什麼他們回來了。 – Magezy

+0

默認情況下,此類採用'ch.qos.logback.classic.db.names.ColumnName'的實例並返回每個枚舉值的名稱。查看Logback發行版中的兩個可用實現。請提交問題以記錄此功能。 –

3

托馬斯,也許我失去了一些東西,但我不知道如何只使用自定義的DBNameResolver可能是答案什麼Magezy問。 DBNameResolver由DBAppender通過SQLBuilder使用來構造3個SQL插入查詢 - 通過DBNameResolve,只能影響將要插入數據的表和列的名稱,但不能限制插入到一個表中,更不用說只通過在那裏實現DBNameResolver無法控制實際插入的內容。

要匹配log4j的JDBCAppender IMO,必須擴展logback的DBAppender或DBAppenderBase,或者甚至可以實現全新的自定義Appender。

1

對我來說最簡單的方法是從頭開始製作一個appender。我使用Spring JDBC附加到單個表。它的工作原理是這樣的:

public class MyAppender extends AppenderBase<ILoggingEvent> 
{ 
    private String _jndiLocation; 
    private JDBCTemplate _jt; 

    public void setJndiLocation(String jndiLocation) 
    { 
    _jndiLocation = jndiLocation; 
    } 

    @Override 
    public void start() 
    { 
    super.start(); 

    if (_jndiLocation == null) 
    { 
     throw new IllegalStateException("Must have the JNDI location"); 
    } 
    DataSource ds; 
    Context ctx; 
    try 
    { 
     ctx = new InitialContext(); 
     Object obj = ctx.lookup(_jndiLocation); 
     ds= (DataSource) obj; 

     if (ds == null) 
     { 
     throw new IllegalStateException("Failed to obtain data source"); 
     } 
     _jt = new JDBCTemplate(ds); 
    } 
    catch (Exception ex) 
    { 
     throw new IllegalStateException("Unable to obtain data source", ex); 
    } 

    } 

    @Override 
    protected void append(ILoggingEvent e) 
    { 
    // log to database here using my JDBCTemplate instance 
    } 
} 

我遇到了麻煩與SLF4J - 這裏所描述的替代記錄錯誤: http://www.slf4j.org/codes.html#substituteLogger

This thread on multi-step configuration使我能夠解決這個問題。

1
<appender name="CUSTOM_DB_APPENDER" class="com.....MyDbAppender"> 
     <filter class="com......MyFilter"/> 
     <param name="jndiLocation" value="java:/comp/env/jdbc/....MyPath"/> 
</appender> 

而你的java MyDbAppender應該有setter字符串jndiLocation。 現在做一個jndi查找(請參閱解決方案在十月17 '11在16:03回答)