在Java

时间:2019-07-05 10:21:59

标签: java jdbc log4j2 appender

我正在尝试使用log4j2将事件记录在数据库中。为此,我特别在属性配置文件中使用log4j2 jdbc appender。 这是我的log4j2属性文件中的附加程序:

# Custom log levels
customLevels = D
customLevels.D.name = ACTIVITY
customLevel.ACTIVITY = 50
# JDBC appender
appender.db.type = Jdbc
appender.db.name = databaseAppender
appender.db.tableName = db_name.test
appender.db.cf.type = ConnectionFactory
appender.db.cf.class = com.myproject.FactoryConnection
appender.db.cf.method = getConnection
appender.db.col1.type = Column
appender.db.col1.name = id
appender.db.col1.pattern = ${id}
appender.db.col2.type = Column
appender.db.col2.name = message
appender.db.col2.pattern = ${message}
appender.db.filter.threshold.type = ThresholdFilter
appender.db.filter.threshold.level = activity
appender.db.filter.threshold.onMatch = Accept
appender.db.filter.threshold.onMismatch = Deny

我将字符串ID和消息放置在地图中,并将它们作为以下内容传递到我的日志中:

    Map<String, String> map = new HashMap<>();
    map.put("id", "12");
    map.put("message", "this is test");
    LOG.log(Level.getLevel("ACTIVITY"), new StringMapMessage(map));

它成功地将其记录到我的数据库中。

现在,我的问题是我已将数据库中id的数据类型设置为VARCHAR,以便可以从此处发送字符串。但是我在数据库中的ID必须为INT(11)类型。而且当我设置时,由于StringMapMessage仅采用字符串值,因此无法如上所述设置日志记录。

现在我不能这样做:

    Map<String, Object> map = new HashMap<>();
    map.put("id", 12345);    //<<<send integer value
    map.put("message", "this is test");
    LOG.log(Level.getLevel("ACTIVITY"), new StringMapMessage(map));

我已经尝试使用对象消息等几个小时了。我该如何解决?谢谢。

1 个答案:

答案 0 :(得分:0)

您不需要将其放在整数上。您可以在写入数据库的过程中在String中传递数值,它会自动转换为整数。但是,如果将非数字值放在int数据库字段中,则会收到类似“由以下原因引起的错误:java.sql.BatchUpdateException:错误的整数值:“ column_name”列的“非数字(可能是a)”。因此,在将String值传递给整数数据库字段时要小心。

Map<String, String> map = new HashMap<>();
map.put("id", "12345");   //make it String log4j2 automatically configures to int in db
map.put("message", "this is test");
LOG.log(Level.getLevel("ACTIVITY"), new StringMapMessage(map));

如果您仍然遇到其他方面的问题所导致的错误,则以上示例是正确的解决方案。谢谢。