如何使用Spring Boot在文件中记录每个数据库更改?

时间:2018-08-28 12:18:50

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

我需要将每个数据库更改记录到一个文件中。我需要显示数据的外观和数据的外观。
例如,如果我更改人员名称,则将以下行添加到我的日志文件中就可以了:“ 更新的人员表:字段“ 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。

2 个答案:

答案 0 :(得分:2)

您可以将JDBC日志记录与log4jdbc一起使用-请参阅与我相关的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

答案 1 :(得分:1)

您可以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

的方法

这些是首先想到的选项。