我是初次使用Spring,SLF4J和&的logback。我正在尝试实现一个自定义数据库Appender,它只会在Spring Batch处理期间将特定类型的异常记录到数据库中。
到目前为止,我已经开始设置一个Logback Database Appender,它扩展了AppenderBase类,然后是一个初始化器,它在Spring中扩展了InitializingBean,所以一旦Spring初始化它就会将appender添加到根记录器(所以我可以使用我的DB来自spring.xml的信息。)
如何设置此appender / logger,以便我只能将某些例外记录到我的自定义表中?
编辑:在做了更多研究之后,让我再问一个问题进行验证。如果我要创建一个像“SpecialExceptionLogger”这样的自定义记录器,我可以将DB Appender添加到该特定记录器中,然后在得到特殊异常时使用该记录器吗?答案 0 :(得分:2)
您使用Spring的DB信息" appender的要求"有点奇怪。在Spring启动期间已经可以进行日志记录,并且如果启动期间的日志需要通过该appender,它将无法正常工作,因为您的appender尚未正确配置。我建议你单独配置你的appender(虽然不是不可能实现你想要的)
对于您的其他问题:
如果我要创建一个类似" SpecialExceptionLogger"的自定义记录器,我可以将DB Appender添加到该特定记录器中,然后在得到特殊异常时使用该记录器吗?
当然可以。它应该是使用Logback的基础知识。请务必先阅读文档以了解基础知识。
XML看起来像(不是真实的,只是给你一个想法)
<appender name="dbAppender" ...> ... </appender>
<logger name="SpecialExceptionLogger">
<appender-ref ref="dbAppender"/>
</logger>
如何设置此appender / logger,以便我只能将某些例外记录到我的自定义表
我相信Logback中的过滤器可以实现您的需求。您可以在StackOverflow中的existing answer
中找到它答案 1 :(得分:1)
我讨厌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)
}
}
答案 2 :(得分:0)
在logback config.xml中,您应该指定Appender类名,如下所示。
<appender name="CUSTOM_DB_APPENDER" class="my.custom.DBAppender" />