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

前言 公司生产环境发生了一个事故,导致公司造成了损失。先说结果是因为业务人员修改参数时设置错了参数,导致事故发生。一开始业务人员认为是我们代码程序出了错误,好在有操作日志记录,于是前去查看发现,操作日志记录不全,没有记录到那个修改的参数。然后在排查代码发现没有问题之后,只能通过查找 MySQL 的 binlog 执行日志与 Nginx 的请求日志作为佐证,才将扣在身上的锅甩了出去。因此我意识到操作日志的重要性。 为什么要记录操作日志? 上文也已经说了,操作日志几乎存在于所有的系统中,尤其是后台管理系统,需要详细的记录下管理员所做出的操作,以便于更好的排查问题与溯源分析。 系统日志与操作日志的区别 系统日志 系统日志主要为了开发更好的排查问题,一般记录在日志文件中。系统日志一般是开发人员会进行查看,所以可读性不需要很高,甚至会包含一些代码信息。 操作日志 操作日志主要是为了记录使用人员的添加、修改、删除操作。一般是给用户看的,所以需要很高的可读性,能让人一眼就看明白操作了什么东西,而不需要再去结合代码进行分析。 常见的日志记录方式 自定义函数 在很多系统中都是定义了一个类似的admin_log()函数,然后在需要记录日志的地方调用这个函数传入记录的信息即可。 优点: 比较灵活,可以随意拼接自己想要记录的日志信息 在想要记录日志的地方只需调用函数就可以了 缺点: 日志的记录穿插在代码中,与代码耦合度很高,增加了代码复杂度 大块的日志信息在代码中看起来很丑 随着代码的修改可能还会需要对日志信息进行修改维护 有可能会忘记日志的记录,导致出了问题背锅 注解+ AOP 在 Java 中使用注解+ AOP 是一种很常见的日志记录方式,网上有很多这样的例子,但是在 PHP 中好像没有见过这种方式。 思考 我们现在的系统中就是使用第一种自定义函数的方式来记录操作日志的,有着很多的缺点,所以就想要寻求一种优雅的记录操作日志的方式。 在美团技术团队的《如何优雅的记录操作日志?》一文中很详细的描写了如何利用注解+AOP 实现操作日志的记录。而 PHP 也是有着注解和 AOP 的,看了这篇文章之后就一直思考该如何实现。想了很久,看了很多遍这篇文章还是感觉不是很完美,虽然把日志的记录从代码迁移到注解中与代码分离,但还是有很强的耦合,每次业务代码的修改还是需要对日志进行更新的。 想法 操作日志一般是需要记录下用户的增删改操作,对数据库增删改的操作我们一般使用 ORM 完成,所以我们可以使用 ORM 的模型事件created、updated、deleted来记录用户的增删改操作。 在其中我们可以很方便的获取到用户的操作内容,然后怎么实现可读性呢? 我的想法是通过获取表注释来明确这次操作的含义,然后通过字段注释知道操作字段的具体含义内容。如此我们就可以记录到可读性的日志内容了嘛? 实现 假如有张用户表,SQL 如下: create table tb_user ( id int auto_increment primary key, name varchar(20) null comment '姓名', sex tinyint default 0 null comment '性别' ) comment '用户'; 在其中添加一条数据:...

2022-01-04 · 1 分钟

在PhpStorm中使用PHPUnit进行单元测试

PHPUnit 是什么 PHPUnit 是一个面向 PHP 程序员的测试框架,这是一个 xUnit 的体系结构的单元测试框架。 PHPUnit 的官网地址为:https://phpunit.de/,中文镜像网站:http://www.phpunit.cn/。 安装 PHPUnit PHPUnit 有两种安装方式,一种是下载 PHAR 发行包进行全局安装,一种是使用 composer 来为某一个项目安装。 推荐使用 composer 安装,本文也是使用这种安装方式。 首先以上一篇文章创建的空的 composer 包为基础,执行以下命令即可。 root@d63b4f236f0c:/home# composer require --dev phpunit/phpunit 编写 PHPUnit 测试 首先在项目下面新建一个tests文件夹,用来存放单元测试文件。 然后编辑 composer.json 文件为 tests 文件夹增加一个命名空间"Chance\\Log\\Test\\": "tests/"并执行composer dump-autoload更新 composer 的命名空间与文件夹映射关系。 在 tests 目录创建 StackTest.php 文件,使用官网的一个例子来测试。 StackTest.php <?php namespace Chance\Log\Test; use PHPUnit\Framework\TestCase; class StackTest extends TestCase { public function testPushAndPop() { $stack = []; // 断言方法 assertEquals 判断两值是否相等 $this->assertEquals(0, count($stack)); array_push($stack, 'foo'); $this->assertEquals('foo', $stack[count($stack)-1]); $this->assertEquals(1, count($stack)); $this->assertEquals('foo', array_pop($stack)); $this->assertEquals(0, count($stack)); } } 命令行执行单元测试 运行....

2021-12-19 · 1 分钟

自动部署

每次写一篇新的文章或者有一点改动,都要手动放到服务器上,特别麻烦,所以今天来搭建一个自动部署环境。每次修改之后只要 push 到 github 上就可以了。 我对 Docker 还是很喜欢的,所以这次环境也用 Docker 进行搭建。 安装 Docker 安装 Docker # 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 设置存储库 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 安装 Docker sudo yum install docker-ce docker-ce-cli containerd.io # 启动docker sudo systemctl start docker # 运行此命令以下载 Docker Compose 的当前稳定版本 sudo curl -L "https://github....

2021-12-18 · 3 分钟

修改Git历史提交用户名与邮箱

今天意外发现 GitHub 上的 commit 记录有两个用户名,一个是公司的配置,一个是家里的配置。所以需要将已经提交的 commit 记录的Author和email修改回来。 修改本机全局用户名与邮箱 先将本机的用户名与邮箱修改正确,防止以后再次提交错误。 git config --global user.name "输入你的用户名" git config --global user.email "输入你的邮箱" 查看历史提交信息 首先git clone一份代码,执行git log查看历史提交信息,记住要修改的Author和email。 批量修改历史信息 将下列代码复制到文本中修改为自己的信息,然后将代码复制到命令行回车运行。 注意:以下命令会修改历史,变更 commit id ,其他人会不同步,慎用。 git filter-branch -f --env-filter ' OLD_EMAIL="原来的邮箱" CORRECT_NAME="现在的名字" CORRECT_EMAIL="现在的邮箱" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --branches --tags 运行之后会出现一个警告,不用管等待执行结束就好了。 # 警告信息 WARNING: git-filter-branch has a glut of gotchas generating mangled history rewrites....

2021-12-15 · 1 分钟

创建一个composer包

# 1. 执行composer init root@7608e16a4e0a:/home# composer init Welcome to the Composer config generator This command will guide you through creating your composer.json config. # 2. 填写包名 Package name (<vendor>/<name>) [root/home]: chance/log # 3. 输入描述 Description []: Elegant logging of operations # 4. 输入作者 Author [, n to skip]: chance <[email protected]> # 5. 最低稳定版本 可选值:stable, RC, beta, alpha, dev 一般填dev Minimum Stability []: dev # 6. 输入包类型 Package Type (e.g. library, project, metapackage, composer-plugin) []: library # 7....

2021-12-13 · 1 分钟

hugo添加utterances🔮评论系统

utterances🔮 基于 GitHub issues 构建的轻量级评论小部件。官网地址为https://utteranc.es/。 准备一个公开的 github 项目 需要有一个公开的项目,因为当时将博客项目设置为私有了。所以先更改一下项目权限,当然也可以新建一个项目。 安装 utterances🔮 为博客项目安装utterances 添加到博客 新建layouts\partials\comments.html文件,写入下面代码并将repo更换为自己的项目名称。 <script src="https://utteranc.es/client.js" repo="[ENTER REPO HERE]" issue-term="pathname" theme="github-light" crossorigin="anonymous" async ></script> 然后在config配置文件中打开评论功能comments = true。 效果展示 问题 当切换到 dark 主题的时候评论还是白的,体验不太好。 经过查看源码,参考这个issues实现了根据博客主题动态切换 utteranc 主题。 layouts\partials\comments.html文件修改为: <script id="utteranc" src="https://utteranc.es/client.js" repo="Chance-fyi/blog" issue-term="pathname" theme="github-light" crossorigin="anonymous" async ></script> <script> document.getElementById("theme-toggle").addEventListener("click", () => { const theme = document.body.className.includes("dark") ? "github-light" : "photon-dark"; const message = { type: "set-theme", theme: theme, }; const utteranc = document....

2021-11-28 · 1 分钟

Typora使用Picgo图片上传七牛云的配置

{ "picBed": { "uploader": "qiniu", "qiniu": { "accessKey": "****************************************", "secretKey": "****************************************", "bucket": "chance-img", // 存储空间名 "url": "http://image.chance.fyi", // 自定义域名 "area": "z2", // 存储区域编号 z0华东 z1华北 z2华南 na0北美 as0东南亚 "options": "", // 网址后缀,比如?imgslim "path": "" // 自定义存储路径,比如img/ 经测试只是在文件名上添加了前缀 并不是文件夹路径 } }, "picgoPlugins": {} }

2021-11-25 · 1 分钟

使用docker-compose构建PHP8.0 + Swoole + Redis + MongoDB环境

最近公司考虑使用 PHP8 + swoole 进行项目的重构,所以要搭建一个环境进行开发学习。swoole 只能运行在 Linux 系统下,考虑到统一团队的开发环境,避免别的小伙伴在环境问题上浪费太多时间,所以选择使用 docker 来构建一个开发环境。 首先创建我们的工作目录Docker,然后在DockerHub上查找 PHP8.0 最新版本的镜像目前为PHP8.0.12,在Docker目录下创建php目录,因为以后可能会使用别的版本的 PHP,所以在php目录下在创建一个php8.0.12的目录,并在目录中创建Dockerfile文件。 目录结构为 Docker ├─ php │ ├─ php8.0.12 │ │ └─ Dockerfile │ ├─ ... 构建自己的 PHP 镜像 Dockerfile # 因为要使用swoole直接使用cli版本 FROM php:8.0.12-cli # 更新依赖 RUN apt-get update \ && apt-get install -y \ unixodbc-dev \ zlib1g-dev \ libzip-dev # 创建`/usr/src/php/ext`目录 RUN docker-php-source extract # 下载redis扩展 # printf "" | 是为了跳过扩展安装过程中弹出让我们选择的yes no RUN printf "" | pecl install redis-5....

2021-11-24 · 3 分钟

PHP镜像中自带的几个特殊的命令

docker-php-source docker-php-ext-install docker-php-ext-enable docker-php-ext-configure docker-php-source 此命令,实际上就是在 PHP 容器中创建一个/usr/src/php 的目录,里面放了一些自带的文件而已。我们就把它当作一个从互联网中下载下来的 PHP 扩展源码的存放目录即可。事实上,所有 PHP 扩展源码扩展存放的路径都在 /usr/src/php/ext 里面。 格式: docker-php-source extract # 创建并初始化 `/usr/src/php`目录 docker-php-source delete # 删除 `/usr/src/php`目录 docker-php-ext-enable 这个命令,就是用来启动 PHP 扩展 的。 格式: docker-php-ext-enable redis # 开启Redis扩展 前提是已经下载安装过 docker-php-ext-install 这个命令,是用来安装并启动PHP 扩展的。 格式: docker-php-ext-install 源码包目录名 注意点: 源码包需要放在 /usr/src/php/ext 下 默认情况下,PHP 容器没有 /usr/src/php这个目录,需要使用 docker-php-source extract来生成。 docker-php-ext-install 安装的扩展在安装完成后,会自动调用docker-php-ext-enable来启动安装的扩展。 卸载扩展,直接删除/usr/local/etc/php/conf.d 对应的配置文件即可。 docker-php-ext-configure docker-php-ext-configure 一般都是需要跟 docker-php-ext-install搭配使用的。它的作用就是,当你安装扩展的时候,需要自定义配置时,就可以使用它来帮你做到。 用法: docker-php-ext-configure ext-name [configure flags]

2021-11-24 · 1 分钟

使用Hugo搭建个人博客

安装 Go Go 的安装包下载地址为https://golang.org/dl/Windows 版下载之后一路Next就好了,注意将 Go 安装目录下的bin目录加入到环境变量中。可使用go version命令查看是否安装成功。 安装 Hugo 二进制安装(推荐:简单、快速) 到 Hugo Releases 下载对应的操作系统版本的 Hugo 二进制文件(hugo 或者 hugo.exe) Windows 版将下载的 hugo.exe 放到 Go 安装目录下的bin目录就可以了,使用hugo version命令查看安装是否成功。 创建 blog 创建一个 Github 项目 使用 Github 进行博客的源码管理,创建一个空的 Blog 项目。 生成站点 # 本地创建Blog目录并进入 # 使用Hugo快速生成站点 PS D:\Blog> hugo new site . # 初始化git 并将站点源码推送到Github PS D:\Blog> git init PS D:\Blog> git add . PS D:\Blog> git commit -m "init blog" PS D:\Blog> git remote add origin https://github....

2021-11-20 · 1 分钟