在自定义日志中传递模型对象,然后使用jdbc附加程序log4j2

时间:2019-05-26 10:30:55

标签: java jdbc log4j2 appender

我正在使用log4j2 jdbc附加程序登录我的数据库。我的log4j2属性文件当前是:

customLevel.DIAG =350 

# 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.ConnectionFactory
appender.db.cf.method = getConnection
appender.db.col2.type = Column
appender.db.col2.name = message
appender.db.col2.pattern = %m
appender.db.col3.type = Column
appender.db.col3.name = category
appender.db.col3.pattern = %M{1}
appender.db.col4.type = Column
appender.db.col4.name = timestamp
appender.db.col4.isEventTimestamp = true
appender.db.col5.type = Column
appender.db.col5.name = log_level
appender.db.col5.pattern = %-5p
appender.db.filter.threshold.type = ThresholdFilter
appender.db.filter.threshold.level = diag
appender.db.filter.threshold.onMatch = Accept
appender.db.filter.threshold.onMismatch = Deny

使用以下命令记录事件时,信息已成功存储在数据库中:

LOG.log(Level.forName("DIAG", 350), "a diagnostic message");

但是现在我必须存储必须为之建模的多种消息(例如数量,定购给谁)。

public class LogModel {

String quantity, orderedTo, amount;

public LogModel(String quantity, String orderedTo, String amount) {
    this.quantity = quantity;
    this.orderedTo = orderedTo;
    this.amount = amount;
}

public String getQuantity() {
    return quantity;
}

public void setQuantity(String quantity) {
    this.quantity = quantity;
}

public String getOrderedTo() {
    return orderedTo;
}

public void setOrderedTo(String orderedTo) {
    this.orderedTo = orderedTo;
}

public String getAmount() {
    return amount;
}

public void setAmount(String amount) {
    this.amount = amount;
}
} 

我已经相应地为日志定义了mysql数据库中的列字段。我的问题是如何将该模型对象传递给jdbc附加程序,以便它可以将数据映射到我的数据库列。

我尝试的另一件事(不需要制作模型)是将ThreadContext用作:

ThreadContext.put("amount", amount);

并因此在log4j2属性文件中:

appender.db.col3.type = Column
appender.db.col3.name = amount
appender.db.col3.pattern = %X{amount}

但这是我唯一的选择吗?就像我每次都必须清除threadContext一样,否则threadcontext中的值正在为我的另一个日志工作。 如果可能的话,我实际上正在加紧使用模型对象。像这样:

LogModel logModel = new LogModel("100", "Mr. John", "12345");
LOG.log(Level.forName("DIAG", 350), logModel);

您的指导将不胜感激。谢谢。

0 个答案:

没有答案