【问题标题】:How do I log every db change using Spring Boot in a file?如何使用 Spring Boot 在文件中记录每个数据库更改?
【发布时间】:2019-02-03 01:52:34
【问题描述】:

我需要将每个数据库更改记录到一个文件中。我需要展示数据之前的样子和数据之后的样子。
例如,如果我更改人员的姓名,如果将以下行附加到我的日志文件中就可以了:“更新的人员表:字段 'first_name' 从 'Alex' 更改为 'George' (person_id = 4622 )"。
如果我插入新人:“插入到人员表:'person_id' = 4623;'last_name' = 'Smith';'first_name' = 'John';'status' = 0”。

我使用使用扩展 JpaRepository 的接口的服务对 db 进行更改,理论上我可以添加代码以将日志文件附加到每个服务的每个方法。但这是很多代码,这种方法不遵循 DRY 原则,我相信应该有更好的解决方案我还没有找到。我应该使用什么来实现这一点?

我使用 Spring Boot 版本 2.0.3.RELEASE,我的数据库是 MariaDB。
日志文件可以是任何格式,但我想最好是 yaml。

【问题讨论】:

  • 我想要它,但将数据保存到数据库中的表而不是文件中。我该怎么办?

标签: spring spring-data-jpa spring-data


【解决方案1】:

您可以通过 log4jdbc 使用 JDBC 日志记录 - 请参阅我的相关 post

要让它在 Spring Boot 应用程序中运行,只需将 log4jdbc-spring-boot-starter 添加到您的项目中,然后将 jdbc 日志记录属性设置如下:

logging.level.resultsettable=info
logging.level.sqltiming=info
logging.level.sqlonly=fatal
logging.level.audit=fatal
logging.level.resultset=fatal
logging.level.connection=fatal

然后您会在应用日志中获得完整的 SQL 查询、它们的执行时间和结果。

要在一行中打印查询,您可以使用 log4jdbc 的这些设置:

log4jdbc.dump.sql.addsemicolon=true
log4jdbc.dump.sql.maxlinelength=0
log4jdbc.trim.sql.extrablanklines=false

然后你会在你的日志中得到如下内容:

2018-08-27 14:36:14.183  INFO 5452 --- [127.0.0.1] jdbc.sqltiming       : SELECT 1; {executed in 1 msec}
2018-08-27 14:36:14.184  INFO 5452 --- [127.0.0.1] jdbc.resultsettable  : 
|---------|
|?column? |
|---------|
|1        |
|---------|

您还可以将这些 SQL 查询和/或其结果输出到不同的日志文件。如何做到这一点你可以阅读here

【讨论】:

  • 那太好了,但你能告诉我,而不是在控制台上显示它,我们如何将它添加到文件中,我也不想在 application.properties 中指定配置,有没有办法在 logback-spring.xml 中定义这些配置。
【解决方案2】:

您可以turn on show_sql and log hibernate output to a file,但它不会开箱即用地为您提供更改中使用的数据,只是 sql 的形式。要获取数据,您还需要to spy on the jdbc driver

您可以使用spring data envers 记录对审计表的更改。然后,如果您愿意,您可以从表中导出到文件。

或者你可以看看do the auditing at the db level的方法

这些是首先想到的选项。

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多