Logback dbAppender 自定义 SQL

3

是否有一种方法可以通过dbAppender更改logback写入其数据的表格?它有三个默认表格必须在使用dbAppender之前创建,但我想自定义将日志写入我选择的一个表格。类似于Log4J,我可以指定插入日志到数据库时执行的SQL。


可能是DBAppender - 如何更改默认表名?的重复问题。 - Tomasz Nurkiewicz
4个回答

5
Tomasz,也许我漏掉了什么,但我并没有看到只使用自定义的DBNameResolver就可以回答Magezy所问的问题。DBNameResolver是由DBAppender通过SQLBuilder使用的,用于构建3个SQL插入查询 - 通过DBNameResolve,只能影响数据将被插入的表和列的名称,但无法限制插入到一个表中,更不用说仅插入一张表,而且仅实现DBNameResolver并不能控制实际插入的内容。
为了与log4j的JDBCAppender匹配,在我看来,必须扩展logback的DBAppender、DBAppenderBase,甚至可能要完全实现新的自定义Appender。

2

对我来说最简单的方法是从头开始创建一个 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

多步骤配置中的这个线程使我解决了这个问题。


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应该有一个名为jndiLocation的字符串属性,并且需要提供setter方法。 现在进行JNDI查找(请参见2011年10月17日16:03回答中的解决方案)


1

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

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

嗨,谢谢你的回答。请问你知道有没有这个实现的示例?我已经实现了DBNameresolver,但我不确定方法需要什么参数以及返回什么结果。 - Magezy
默认情况下,该类接受 ch.qos.logback.classic.db.names.ColumnName 的实例并返回每个枚举值的名称。请查看 Logback 发行版中提供的两个可用实现。请提交问题以记录此功能。 - Tomasz Nurkiewicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接