【问题标题】:Spring, SLF4J, & Logback - Custom DB appenderSpring、SLF4J 和 Logback - 自定义 DB 附加程序
【发布时间】:2016-02-18 05:40:26
【问题描述】:

我是使用 Spring、SLF4J 和 Logback 的新手。我正在尝试实现一个自定义数据库 Appender,它只会在 Spring Batch 处理期间将特定类型的异常记录到数据库中。

到目前为止,我已经开始设置一个扩展 AppenderBase 类的 Logback 数据库 Appender,然后设置一个在 Spring 中扩展 InitializingBean 的初始化程序,以便在 Spring 初始化后将附加程序添加到根记录器(这样我就可以使用我的数据库spring.xml 中的信息)。

如何设置此附加程序/记录器,以便我只能将某些异常记录到我的自定义表中?

编辑:在做了更多研究之后,让我再问一个问题来验证。如果我要创建像“SpecialExceptionLogger”这样的自定义记录器,我是否可以将 DB Appender 添加到该特定记录器,然后在遇到特殊异常时使用该记录器?

【问题讨论】:

    标签: java spring logging slf4j logback


    【解决方案1】:

    我讨厌死灵,但这可以通过DelegatingLogbackAppender 实现。该附加程序只会保留任何事件,直到您稍后可以在 Spring(和您的数据源)初始化后配置正确的 DBAppender

    在我的示例中,我在 Grails 中创建了一个名为 logging 的数据源,我在 bean 配置中引用了它。如果您想并且能够在根数据源中创建必要的表,您可以直接传递 ref(dataSource)(注意大写的 S)。

    如果您像我们一样创建了自己的自定义数据库附加程序,DelegatingLogbackAppender 也很有用,因为罐装的DBAppender 非常严格。

    有很多理由希望将日志事件放入数据库。对我们的要求是,我们的应用可以跨数十个实例进行扩展,这使得搜索数十个日志文件变得很繁琐。

    logback.groovy(省略导入)

    appender('STDOUT', ConsoleAppender) {
        encoder(PatternLayoutEncoder) {
           pattern = "%level %logger - %msg%n"
        }
    }
    
    appender('DB', DelegatingLogbackAppender)
    
    root(ERROR, ['STDOUT', 'DB'])
    

    resources.groovy(省略导入)

    beans = {
        applicationContextHolder(ApplicationContextHolder)
    
        loggerContext(LoggerFactory) { bean ->
            bean.factoryMethod = "getILoggerFactory"
        }
    
        patternLayoutEncoder(PatternLayoutEncoder) { bean ->
            bean.initMethod = 'start'
            bean.destroyMethod = 'stop'
    
            context = ref(loggerContext)
            pattern = "%level %logger - %msg%n"
        }
    
        // Configure a console appender JIC    
        STDOUT(ConsoleAppender) { bean ->
            bean.initMethod = 'start'
            bean.destroyMethod = 'stop'
            context = ref(loggerContext)
            encoder = ref(patternLayoutEncoder)
        }
    
        connectionSource(DataSourceConnectionSource) { bean ->
            bean.initMethod = 'start'
            bean.destroyMethod = 'stop'
            context = ref(loggerContext)
            dataSource = ref(dataSource_logging)
        }
    
        DB(DBAppender) { bean ->
            bean.initMethod = 'start'
            bean.destroyMethod = 'stop'
            context = ref(loggerContext)
            connectionSource = ref(connectionSource)
        }
    }
    

    【讨论】:

      【解决方案2】:

      您对“使用 Spring 的数据库信息的附加程序”的要求有点奇怪。日志在 Spring 启动期间已经可用,如果启动期间的日志需要通过该 appender,它将无法工作,因为您的 appender 尚未正确配置。我建议您单独配置您的附加程序(尽管并非不可能实现您所寻找的)

      关于您的其他问题:

      如果我要创建像“SpecialExceptionLogger”这样的自定义记录器,我是否可以将 DB Appender 添加到该特定记录器,然后在遇到特殊异常时使用该记录器?

      当然可以。它应该是使用 Logback 的基础。请务必先阅读文档以了解基础知识。

      XML 看起来像(不是真实的,只是给你一个想法)

      <appender name="dbAppender" ...> ... </appender>
      <logger name="SpecialExceptionLogger">
          <appender-ref ref="dbAppender"/>
      </logger>
      

      如何设置此附加程序/记录器,以便我只能将某些异常记录到我的自定义表中

      我相信 Logback 中的过滤器可以满足您的需求。你可以在 StackOverflow 的 existing answer 中找到它

      【讨论】:

      • 所以我的问题源于对日志系统的设置方式的整体无知,并且在尝试解决不需要解决的问题时走得太远了。您的回复有助于清除它,在我完成所有工作后,我们决定完全改变方向并注销到文件。谢谢您的帮助。 :)
      • 明智的选择登录到文件。实际上很少值得记录到 DB,除非是一些非常具体的日志消息
      【解决方案3】:

      在 logback config.xml 中,您应该指定 Appender 类名称,如下所示。

      <appender name="CUSTOM_DB_APPENDER" class="my.custom.DBAppender" />
      

      查看http://logback.qos.ch/manual/configuration.html 了解更多配置选项

      【讨论】:

      • 根据我的查找,我不能使用这种方法,因为日志记录在春天之前初始化。但我真正的问题是在它初始化之后,我怎样才能将它与我的普通记录器分开,以便仅将这个附加程序用于某些异常?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2022-11-10
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多