如何使用 JDBC appender 存储 json 值
How to store json value using JDBC appender
我想使用 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 中的元 table 定义:
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?
您可以使用“columnMapping”标签而不是“column”,后者支持“parameter”属性,您可以在其中使用“?”插入表达式作为标记并向 json 添加演员表。
你的情况:
<ColumnMapping name="data" pattern="%K{data}" parameter="?::json" />
或者如果数据可以为空,它可以使用 COALESCE 检查它。它必须组合成 NULLIF 因为默认情况下 K of undefined key returns a empty string
<ColumnMapping name="data" pattern="%K{data}" parameter="COALESCE(NULLIF(?,''),'[]')::json" />
我想使用 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 中的元 table 定义:
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?
您可以使用“columnMapping”标签而不是“column”,后者支持“parameter”属性,您可以在其中使用“?”插入表达式作为标记并向 json 添加演员表。 你的情况:
<ColumnMapping name="data" pattern="%K{data}" parameter="?::json" />
或者如果数据可以为空,它可以使用 COALESCE 检查它。它必须组合成 NULLIF 因为默认情况下 K of undefined key returns a empty string
<ColumnMapping name="data" pattern="%K{data}" parameter="COALESCE(NULLIF(?,''),'[]')::json" />