Spring, SLF4J, & Logback - Custom DB appender



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

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

我如何设置这个appender/logger,以便只能将某些异常记录到我的自定义表中?

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

您对"appender using Spring’s DB info"的要求有点奇怪。在Spring启动期间,日志记录已经可用,如果启动期间的日志需要通过该appender,它将不起作用,因为您的appender还不能正确配置。我建议你单独配置你的appender(尽管它不是不可能实现你想要的)

对于您的其他问题:

如果我要创建一个像"SpecialExceptionLogger"这样的自定义记录器,我可以将DB Appender添加到该特定记录器中,然后在获得特殊异常时使用该记录器吗?

你当然可以。它应该是使用Logback的基础。请确保您先阅读文档以了解基本知识。

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

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

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

我相信Logback中的过滤器可以满足您的需求。您可以在StackOverflow 中的现有答案中找到它

我不喜欢坏死,但这可以用DelegatingLogbackAppender实现。该appender只保留任何事件,直到您稍后可以在初始化Spring(和数据源)后配置正确的DBAppender

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

如果您已经创建了自己的自定义数据库appender,那么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)
    }
}

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

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

检查http://logback.qos.ch/manual/configuration.html有关更多配置选项,

最新更新