如何记录可读性的操作日志?

Chance

我看到有几个跟日志相关的插件,但都是属于系统日志,操作日志相关的确是没有,在网上查找操作日志的资料,讲这个的文章也是很少。

《如何记录可读性的操作日志?》这篇文章是我对于记录操作日志的一些思考。

不知道大家都是如何记录操作日志的?

然后我也发布了一个生成操作日志的插件 https://www.workerman.net/plugin/96,欢迎大家下载使用。

3137 12 8
12个评论

damao

我去,你这好牛逼啊,喜欢

  • 暂无评论
稚出

牛哇牛哇

  • 暂无评论
周小云

\Illuminate\Database\Connection::resolverFor('mysql', function ($connection, $database, $prefix, $config) {
return new \Chance\Log\orm\illuminate\MySqlConnection($connection, $database, $prefix, $config);
});
这代码写在哪里

  • Chance 2022-10-26

    你可以自定义一个Bootstrap:

    <?php
    
    namespace app\bootstrap;
    
    use Chance\Log\orm\illuminate\MySqlConnection;
    use Illuminate\Database\Connection;
    use Webman\Bootstrap;
    
    class Log implements Bootstrap
    {
        public static function start($worker)
        {
            Connection::resolverFor('mysql', function ($connection, $database, $prefix, $config) {
                return new MySqlConnection($connection, $database, $prefix, $config);
            });
        }
    }

    然后在 config/bootstrap.php 配置文件中增加:app\bootstrap\Log::class

  • 周小云 2022-10-26

    感谢

周小云

我用你这个的时候 做get***TextAttribute 修改监听到了 但是 原始值跟修改的值在log里面会一样
修改 商品 (id:1591):品牌由:宇时代 改为:宇时代;

public function getGoodsBrandIdTextAttribute($key): string
{
    var_dump($key);
    return $this->goodsBrand->name;
}

截图
这个是我打印出来的$key的值
goodsBrand 是我商品跟商品品牌的关系

  • Chance 2022-10-31

    获取原始值你要对传入的key进行处理

  • 周小云 2022-11-01

    我想对原始值进行处理 但是 打出来是个null 修改后的值是有的

  • 周小云 2022-11-01

    我今天看了你的源码 看你用了getOriginal 但是好像 getOriginal() is not working in laravel 8 不知道是不是这个原因

  • Chance 2022-11-01

    Laravel8也是有这个方法的 那个39不是吗?

  • 周小云 2022-11-01

    那我在看下 不知道为啥会有两个null

  • 软饭工程师 2023-08-22

    请问想要获取原始值,要对传入的key怎么处理呢,我使用webman 也出现了2个NULL

  • 软饭工程师 2023-08-22

    已经获取到原始值了,传入的 key 为原始id,当key 存在时,通过查询获取原始值内容,并将其返回,就能在日志记录中获取显示原始值和修改值了

周小云

加个建议 没有在$columnComment的字段不记录就好了

  • Chance 2022-11-14

    感谢建议 可以在模型中通过 $ignoreLogFields 设置不记录日志的字段

Chance

更新

  1. fix Laravel ORM 给 update time 增加表前缀的问题
  2. fix 重复触发修改器的问题
  3. feature 事务回滚则删除生成的已回滚的操作日志
  • 程序小杰 2023-08-03

    注册 MySQL 数据库连接的解析器,这一步我不会操作,大佬

软饭工程师

性能损耗很明显,只引入了这个日志插件。不生成日志,30%损耗,哪怕在model 中不生成该表的日志,也一样
截图
截图

  • Chance 2023-08-21

    如果不需要记录日志可以通过这个方法关闭 \Chance\Log\facades\OperationLog::disable();

  • Chance 2023-08-21

    只建议在管理后台使用,如果前台项目和后台项目在一起的话可以在前台项目的中间件通过上面的命令关闭

  • 软饭工程师 2023-08-21

    好的,已经解决了,我在全局中间件\app\middleware\CorsControl::class中禁用日志,在需要生成日志的地方启用,性能并不会受影响,谢谢

软饭工程师

你好,请问使用的laravel orm,外键id修改,怎么记录关联的修改内容的,只记录外键id 可读性不够好

  • Chance 2023-08-21

    可以定义一个 外键_text 的访问器

  • 软饭工程师 2023-08-21

    请问定义了获取器,怎么去获取变更的内容呢,需要自己手动比对吗

  • Chance 2023-08-22

    看文档,接收一个 key ,会将旧 key 传入

软饭工程师

截图
截图
楼中评论无法放入图片,请问这是为什么呢,我定义了一个获取器,日志记录依旧无法获取到对应字段获取器的内容,是需要手动调用获取器吗

  • Chance 2023-08-22

    应该是没有找到对应模型,可以设置一下表模型对应关系 \Chance\Log\facades\OperationLog::setTableModelMapping

  • 软饭工程师 2023-08-22

    好的,解决了,谢谢

shanyi

你好大佬问下,我启用这个日志 如果我不去删除这个记录日志是一直记录吗?

  • Chance 2023-11-24

    这个包只是生成日志,怎么记录保存是你自己决定的

hhrsheng

请问,如果我想保存操作记录的话,每次操作完数据库都要执行\Chance\Log\facades\OperationLog::getLog();
来输出日志再存起来吗

  • Chance 2024-01-24

    是的 可以在后置中间件统一存储

软饭工程师

截图
你好,我已经定义了获取器,OperationLog::getLog(); 如何让返回的内容地区ID变为地区名称呢,我想要的结果是当user 表地区id修改时,变更日志为:修改 用户表 (id:14):地区由:茅箭区改为:余杭区,更新时间由:1714289289 改为:1714289289

  • Chance 2024-05-07

    应该是没找到对应的 model ,你可以创建一个表模型映射关系

  • 软饭工程师 2024-05-07

    手动映射模型关系

    \Chance\Log\facades\OperationLog::setTableModelMapping([
        "database1" => [
            "table1" => "app\\model\\Table1",
            "table2" => "app\\model\\Table2",
        ],
        "database2" => [],
    ]);

    这个代码应该放在哪里呢,生成日志的业务代码里面吗,我试过了,不生效

  • Chance 2024-05-08

    放在业务代码之前就可以了

年代过于久远,无法发表评论

Chance

490
积分
0
获赞数
0
粉丝数
2022-07-13 加入
×
🔝