【问题标题】:How to store json value using JDBC appender如何使用 JDBC appender 存储 json 值
【发布时间】:2022-01-26 17:49:55
【问题描述】:

我想使用 Log4j 2 通过 JDBC appender 存储一个 JSON 字段。这是我的配置,我无法存储到 PostgreSQL JSON 类型列中:

<Configuration status="WARN">
    <Appenders>
        <JDBC name="databaseAppender" tableName="logs.logs">
            <ConnectionFactory
                class="eu.dedalus.phaedra.log.appender.ConnectionFactory"
                method="getDatabaseConnection" />
            <Column name="id" literal="nextval('logs.logs_id_seq')" />
            <Column name="date" isEventTimestamp="true" />
            <Column name="level" pattern="%level" isUnicode="false" />
            ...
            <Column name="data" ??? />
        </JDBC>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="databaseAppender" />
        </Root>
    </Loggers>
</Configuration>

这是我在 PostgreSQL 中的元表定义:

CREATE TABLE logs (
    id int4 NOT NULL,
    message varchar NULL,
    fullinfo varchar NULL,
    "level" varchar NULL,
    ...
    "data" json NULL,
    CONSTRAINT id_logs PRIMARY KEY (id)
);

我的 Java 代码填充了一个 MapMessage,然后调用 ExtendedLogger 的 info 方法:

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ExtendedLogger log = ctx.getLogger(clazz.getName());
MapMessage map = new MapMessage();
... // put all other data into MapMessage
map.put("data", new JSONObject()) // or JsonNode, String or whatever else
log.info(map);

如何使用 JDBC Appender 的 ConnectionFactory 将“data”字段存储到 PostgreSQL JSON 列中?是否可以使用 Log4j 2?

【问题讨论】:

    标签: java json postgresql jdbc log4j2


    【解决方案1】:

    您可以使用“columnMapping”标签代替“column”,它支持“parameter”属性,您可以在其中使用“?”插入表达式作为标记并向 json 添加强制转换。 在你的情况下:

    <ColumnMapping name="data" pattern="%K{data}" parameter="?::json" />
    

    或者如果数据可以为空,它可以使用 COALESCE 来检查它。它必须合并为 NULLIF 因为默认情况下未定义键的 K 返回一个空字符串

    <ColumnMapping name="data" pattern="%K{data}" parameter="COALESCE(NULLIF(?,''),'[]')::json" />
    

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 2016-06-26
      相关资源
      最近更新 更多