首页 文章

Spring,SLF4J和Logback - 自定义DB appender

提问于
浏览
0

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

到目前为止,我已经开始设置一个Logback Database Appender,它扩展了AppenderBase类,然后是一个初始化器,它在Spring中扩展了InitializingBean,所以一旦Spring初始化,它就会将appender添加到根 Logger 中(所以我可以使用Spring的数据库信息) .XML) .

如何设置此appender / logger,以便我只能将某些例外记录到我的自定义表中?

编辑:在做了一些更多的研究后,让我问一个额外的问题来验证 . 如果我要创建一个像“SpecialExceptionLogger”这样的自定义 Logger ,我可以将DB Appender添加到该特定 Logger 中,然后在得到特殊异常时使用该 Logger 吗?

3 回答

  • 1

    您对“使用Spring的DB信息的appender”的要求有点奇怪 . 在Spring启动期间已经可以进行日志记录,并且如果启动期间的日志需要通过该appender,它将无法正常工作,因为您的appender尚未正确配置 . 我建议你单独配置你的appender(虽然你不是不可能实现你想要的)

    对于您的其他问题:

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

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

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

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

    如何设置此appender / logger,以便我只能将某些例外记录到自定义表中

    我相信Logback中的过滤器可以实现您的需求 . 您可以在StackOverflow中的existing answer中找到它

  • 0

    在logback config.xml中,您应该像下面一样指定Appender类名 .

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

    检查http://logback.qos.ch/manual/configuration.html以获取更多配置选项

  • 0

    我讨厌necro,但这是可以实现的 DelegatingLogbackAppender . 该appender只保留任何事件,直到您可以在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)
        }
    }
    

相关问题