【发布时间】:2021-12-01 20:41:22
【问题描述】:
我正在为一个项目设置日志记录,并且想知道是否可以将 id 发送到 postges 数据库。后来我会用 fluentd 收集所有日志,并使用 efk(elastic search, fluentd, kibana) 堆栈来查看日志。这就是为什么如果可以在数据库日志中设置 id 将非常有用。
【问题讨论】:
标签: postgresql spring-boot logging
我正在为一个项目设置日志记录,并且想知道是否可以将 id 发送到 postges 数据库。后来我会用 fluentd 收集所有日志,并使用 efk(elastic search, fluentd, kibana) 堆栈来查看日志。这就是为什么如果可以在数据库日志中设置 id 将非常有用。
【问题讨论】:
标签: postgresql spring-boot logging
谢谢@jjane, 给了我这么好的主意。经过一番谷歌搜索后,我找到了一个描述如何拦截休眠的页面logs 然后我对如何将检查器添加到 spring-boot 进行了更多研究,这就是我想出的解决方案:
@Component
public class SqlCommentStatementInspector
implements StatementInspector {
private static final Logger LOGGER = LoggerFactory
.getLogger(
SqlCommentStatementInspector.class
);
private static final Pattern SQL_COMMENT_PATTERN = Pattern
.compile(
"\\/\\*.*?\\*\\/\\s*"
);
@Override
public String inspect(String sql) {
LOGGER.info(
"Repo log, Correlation_id:"+ MDC.get(Slf4jMDCFilter.MDC_UUID_TOKEN_KEY),
sql
);
return String.format("/*Correlation_id: %s*/", MDC.get(Slf4jMDCFilter.MDC_UUID_TOKEN_KEY)) + SQL_COMMENT_PATTERN
.matcher(sql)
.replaceAll("");
}
}
及其配置:
@Configuration
public class HibernateConfiguration implements HibernatePropertiesCustomizer {
@Autowired
private SqlCommentStatementInspector myInspector;
@Override
public void customize(Map<String, Object> hibernateProperties) {
hibernateProperties.put("hibernate.session_factory.statement_inspector", myInspector);
}
}
【讨论】:
您可以让您的连接将 application_name 设置为包含您想要的 id 的内容,然后配置您的日志记录以包含 application_name 字段。或者,您可以在 SQL 注释中包含 id,例如 select /* I am number 6 */ whatever from whereever。但是只有包含 sql 的日志消息才能看到 id。 (将注释放在select 关键字之后的原因是某些客户端会去掉前导的 cmets,因此服务端永远不会看到它们)
【讨论】: