记录器更新历史记录是否存在更好的方式?

时间:2015-11-19 12:00:29

标签: java logging aspectj audit-logging

在我们的后端系统中,有许多情况需要更新对象,例如:更新商品,更新商品价格,更新用户,更新状态,更新订单(取消,更新价格)等。现在有些对象我们有一个特殊的日志表,例如order_update_log,用于记录器更新操作。一些只有记录器,例如,

1.8.7

感觉处理这些琐碎的事情非常讨厌,确实存在一些更好的方式/工具来处理这样的记录器吗?

2 个答案:

答案 0 :(得分:1)

如果您使用ORM来保存数据,您可以使用Hibernate的Listners /事件来响应数据更新(并将它们记录到数据库或审核日志等) 对于休眠,这里详细说明了这些信息:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html但显然你需要调查你的持久性工具提供给你的内容。

答案 1 :(得分:1)

有很好的东西叫Aspects。 您可以为您的项目编写方面,该项目仅了解跟踪货物对象的更改。假设您有Goods类:

public class Goods {
    private Integer id;
    private String name;
    private BigDecimal cost;

    // Getters, Setters
    ...
}

映射到具有相应字段的数据库表商品:

CREATE TABLE `goods` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `name` varchar NOT NULL,
    `cost` DECIMAL NOT NULL,
    PRIMARY KEY (`id`)
);

假设您有GoodsService

public class GoodsService {

    public Goods read(Integer id) {
        Goods goods = /* Read goods from database */
        return goods;
    }

    public void write(Goods goods) {
        /* Write goods to database */
    }
}
使用GoodsController

GoodsService

public class GoodsController {

    private GoodsService goodsService;

    public void updateGoods(Integer id, String name, BigDecimal cost) {
        Goods goods = goodsService.read(id);
        goods.setName(name);
        goods.setCost(cost);
        goodsService.write(goods);
    }

}

因此,我们为您的项目添加一些方面的魔力来跟踪商品的变化。现在创建另一个表,其中包含用于存储更新user对象的datetimegoods的其他字段:

CREATE TABLE `goods_log` (
    `revision` INT NOT NULL AUTO_INCREMENT,
    `id` INT NOT NULL,
    `name` varchar NOT NULL,
    `cost` DECIMAL NOT NULL,
    `user` varchar NOT NULL,
    `timestamp` DATETIME NOT NULL,
    PRIMARY KEY (`revision`,`id`)
);

写方面课:

@Aspect
public class GoodsLogger {
    @Before(value = "execution(* org.antonu.service.GoodsService.write(..)) && args(goods)")
    public void logWrite(Goods goods) {
        // Get current user and timestamp,
        // Write it to goods_log table, as well as goods data
    }
}

就是这样!您的业​​务逻辑代码没有改变,读起来很清楚。但是每次调用GoodsService的write方法,你都会在goods_log中记录新的商品状态。

要使此代码正常工作,应使用AJC编译器进行编译,还应包含aspectjrt库。它可以通过maven轻松完成:

<properties>
    <aspectj.version>1.8.7</aspectj.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>${aspectj.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjrt</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

现代IDE Intellij Idea应该使用上面的maven配置自动使用AJC编译器。如果没有,则必须通过File - Settings - 'Build, Execution, Deployment' - Compiler - Java Compiler - Use compiler: Ajc. AJC编译器路径配置编译器:<path_to>/aspectjtools-1.8.7.jar