我正在尝试将日志消息保存到中央数据库.为了做到这一点,我在log4j的xml配置中配置了以下Appender:
<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
<param name="URL" value="jdbc:postgresql://localhost/logging_test" />
<param name="user" value="test_user" />
<param name="password" value="test_password" />
<param name="sql" value="INSERT INTO log_messages ( log_level, message, log_date ) VALUES ( '%p', '%m', '%d{yyyy-MM-dd HH:mm:ss}' )" />
</appender>
Run Code Online (Sandbox Code Playgroud)
这工作正常,除了一些消息包含',然后appender失败.
是否有捷径可寻?
我建议创建一个自定义appender并覆盖你可以转义字符串或使用的方法flushBuffer
和execute
方法PreparedStatement
:
public class MyJDBCAppender extends JDBCAppender {
}
Run Code Online (Sandbox Code Playgroud)
要解释为什么需要覆盖flushBuffer
- appender将LogEvent
对象放入缓冲区,稍后将其刷回目标(在本例中为数据库).这里,该flushBuffer
方法使用getLogStatement
和(通过execute
)法线Statement
.您可以完全替换该行为.看看当前的源代码
然后注册你的appender JDBCAppender
.