【问题标题】:Logback dbAppender Custom SQLLogback dbAppender 自定义 SQL
【发布时间】:2011-10-05 10:21:48
【问题描述】:

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

【问题讨论】:

标签: database logging logback


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 嗨,谢谢你的回答,你知道哪里有这个实现的例子吗,我已经实现了 DBNameresolver 但我不确定这些方法采用什么以及它们返回什么。
    • 默认情况下,此类采用ch.qos.logback.classic.db.names.ColumnName 的实例并返回每个枚举值的名称。查看 Logback 分发中的两个可用实现。请提交问题以记录此功能。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      <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 查找(请参阅 2011 年 10 月 17 日 16:03 回答的解决方案)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        相关资源
        最近更新 更多