Logback dbAppender自定义SQL

时间:2011-10-05 10:21:48

标签: database logging logback

有没有办法更改logback使用dbAppender将其数据写入的表,它有三个必须在使用dbAppender之前创建的默认表,但我想自定义它以写入我选择的一个表。类似于Log4J的东西,我可以指定在将日志插入数据库时​​执行的SQL。

4 个答案:

答案 0 :(得分:4)

Tomasz,也许我错过了一些东西,但我不知道如何使用自定义DBNameResolver可以解决Magezy的问题。 DBAppender通过SQLBuilder使用DBNameResolver来构造3个SQL插入查询 - 通过DBNameResolve,只能影响将插入数据的表和列的名称,但不能仅限于插入一个表,更不用说仅通过在那里实现DBNameResolver无法控制实际插入的内容。

要匹配log4j的JDBCAppender IMO,必须扩展logback的DBAppender或DBAppenderBase,或者甚至可以实现全新的自定义Appender。

答案 1 :(得分:1)

您需要实施ch.qos.logback.classic.db.names.DBNameResolver并在配置中使用它:

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

答案 2 :(得分:1)

对我来说最简单的方法是从头开始做一个追随者。我使用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让我能够解决这个问题。

答案 3 :(得分: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查找(参见11月17日16:03回答的解决方案)