是否有一种方法可以通过dbAppender更改logback写入其数据的表格?它有三个默认表格必须在使用dbAppender之前创建,但我想自定义将日志写入我选择的一个表格。类似于Log4J,我可以指定插入日志到数据库时执行的SQL。
对我来说最简单的方法是从头开始创建一个 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
多步骤配置中的这个线程使我解决了这个问题。
<appender name="CUSTOM_DB_APPENDER" class="com.....MyDbAppender">
<filter class="com......MyFilter"/>
<param name="jndiLocation" value="java:/comp/env/jdbc/....MyPath"/>
</appender>
你的Java MyDbAppender应该有一个名为jndiLocation的字符串属性,并且需要提供setter方法。 现在进行JNDI查找(请参见2011年10月17日16:03回答中的解决方案)
您需要实现ch.qos.logback.classic.db.names.DBNameResolver
并在配置中使用它:
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<dbNameResolver class="com.example.MyDBNameResolver"/>
<!-- ... -->
</appender>
ch.qos.logback.classic.db.names.ColumnName
的实例并返回每个枚举值的名称。请查看 Logback 发行版中提供的两个可用实现。请提交问题以记录此功能。 - Tomasz Nurkiewicz