当前位置: 首页 > 知识库问答 >
问题:

log4j2.xmlJDBC Appender中不接受上下文变量

暴博远
2023-03-14

我有一个使用log4j2的java应用程序,它连接到两个不同的mysql实例(一个存储加密数据,一个存储解密数据),每个实例使用多个模式。我正在尝试实现log4j2jdbc Appender,以便使用特定的标记将错误记录到相关的数据库模式中。

但是,我遇到了一个障碍,试图将模式名称动态分配给记录器。这是我的日志4J2。xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" dest="out" name="default">
<Appenders>
    ...
    <JDBC name="decryptedMySQLDatabase" tableName="LogTable">
        <DriverManager connectionString="jdbc:mysql://decryptedmysqldb.testdomain.com/${ctx:migration.encrypted-connection:-n/a}" driverClassName="com.mysql.jdbc.Driver" userName="${env:MYSQL_USERNAME:-sometestuser}" password="${env:MYSQL_PW:-sometestpass}" />
        <Filters>
            <MarkerFilter marker="TEST_MARKER_DECRYPTED" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
        <Column name="level" pattern="%level" />
        <Column name="logger" pattern="%logger" />
        <Column name="message" pattern="%message" />
        <Column name="exception" pattern="%ex{full}" />
        <Column name="lastUpdated" isEventTimestamp="true" />
    </JDBC>
    <JDBC name="encryptedMySQLDatabase" tableName="LogTable">
        <DriverManager connectionString="jdbc:mysql://encryptedmysqldb.testdomain.com/${ctx:migration.encrypted-connection:-n/a}" driverClassName="com.mysql.jdbc.Driver" userName="${env:MYSQL_UNAME:-sometestuser}" password="${env:MYSQL_PASSWORD:-sometestpass}" />
        <Filters>
            <MarkerFilter marker="TEST_MARKER_ENCRYPTED" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>
        <Column name="level" pattern="%level" />
        <Column name="logger" pattern="%logger" />
        <Column name="message" pattern="%message" />
        <Column name="exception" pattern="%ex{full}" />
        <Column name="lastUpdated" isEventTimestamp="true" />
    </JDBC>
</Appenders>
<Loggers>
    <Root level="${env:LOG_LEVEL:-info}" additivity="false">
        <AppenderRef ref="console" />
        <AppenderRef ref="decryptedMySQLDatabase" />
        <AppenderRef ref="encryptedMySQLDatabase" />
    </Root>
</Loggers>

我已经将值添加到ThreadContext中,这种方式适用于此模板中的其他ctx键,但我无法让它在DriverManager配置的连接字符串属性中获取此特定值。我错过了什么愚蠢的事吗?

共有1个答案

林曦之
2023-03-14

在初始化日志记录时读取log4j配置并尝试建立与数据库的连接时,将创建appender。除非您控制日志初始化,否则使用ThreadContextLookup将无法工作,因为ThreadContext在初始化期间不会包含任何数据。

您可以尝试为此使用RoutingAppender,但需要小心,因为这可能会导致创建到数据库的许多数据库连接。

 类似资料:
  • log4j:warn可持续解析错误10和列78 log4j:warn文档根元素“configuration”必须与DOCTYPE根“null”匹配。LOG4J:WARN可持续解析错误10和列78 LOG4J:WARN文档无效:找不到语法。log4j:错误DOM元素是-不是元素。使用Spark默认的log4j配置文件:org/apache/spark/log4j-defaults.propertie

  • 问题内容: 我创建了一个文件,创建变量时出现错误。但是在我的其他.java文件中,这些错误都没有出现。在枚举Foo中,唯一不会引起错误的是Foo构造函数不带参数并且枚举内没有其他变量。 错误的范围从字符串(无效的修饰符)到要删除的布尔值。 问题答案: 您缺少枚举中最重要的元素:枚举实例。 射击,仅添加分号即可解决编译错误,但是如果没有枚举实例,则枚举是无用的。 例如,

  • 有人能告诉我为什么switch语句不能识别字符串变量吗。告诉我

  • 我的邮递员运行示例JSON文件: 预先请求脚本: 带参数的主体: 对于仅接受字符串变量 - name 和布尔字段正常工作,并且为其他两个字段填充值,则不传递变量值。

  • 问题内容: 首先,我要指出的是我几乎没有python经验。 替代文字http://www.aquate.us/u/9986423875612301299.jpg 如您所知,只需在Windows PC上的“发送到”文件夹中放置一个快捷方式,就可以允许程序将文件作为参数。 我将如何编写一个以该文件为参数的python程序? 而且,如果有机会,这是一笔红利-我如何将它与urllib2集成以将文件发布到服

  • Iam试图创建一个API来接受CSV和json主体请求等文件。我尝试在spring boot使用对象。 endpoint如下所示。 内容头是通过邮递员设置的。 是,是。 抛出的错误是 我该怎么解决这个?