laravel 后台添加管理员日志记录

FastAdmin 与其他后台框架的对比分析 FastAdmin是一个基于ThinkPHP框架的后台管理系统,提供了快速开发的解决方案。它具有轻量级、高性能和易于使用的特点,适合中小型项目。Django Admin是Django框架内置的管理后台,提供了强大的数据管理功能。 阅读详情
今天抽离之前使用的 laravel 版本的 fastadmin 后台,权限系统,当时没有写 '管理员日志' 这个模块,今天实现了下,过程中,也发现几个问题,分享给大家。

可以先看下 fastadmin 源码,它使用了 tp 的 behavior 功能,在应用结束后,调用了 admin log 钩子

好久没看 tp 了,不过还稍微了解点 laravel,看代码机制,应该就是 hook 钩子之类的,还专门搜索了下 tp 的 behavioir 和 laravel 的 event 区别,可惜没找到...,不过两者应该差不多的

tp 有 behavioir 这种机制,而且在 tp 内,内置了一些系统级别的 hook,但是 laravel 好像并没有啊,这个我也简单搜了下,好像没有想要的,记得模型的一些操作好像有内置的 event,created、updated 等,laravel 系统好像没。

那我们在哪个位置需要记录日志呢,fastadmin 是在 app_end - 应用结束,记录的日志,laravel 哪里能判定应用结束,而且得是公共的地方

从 public/index.php,看过 laravel 源码的,应该知道 laravel 的最简单的执行机制是:
	
	/*
		$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

		$response = $kernel->handle(
		    $request = Illuminate\Http\Request::capture()
		);

		$response->send();

		$kernel->terminate($request, $response);
	 */

	实例化内核(kernel),将请求(request)传递给内核,供内核处理,得到响应(response),然后发送响应

看 public/index.php 的几行代码,就是这个意思,而且,在得到相应后,调用了 terminate(),这个是所有的 middleware 的 terminate 方法调用的时机。

我们记录日志,可以在入口文件的 $reponse 后,表示已经处理了请求,得到了相应,表示其实已经结束了,然后记录日志。

但是,觉得不应该修改 laravel 的核心代码,不利于升级,而且 laravel 提供了更好的解决方法,就是上面说的 terminate():
	https://learnku.com/docs/laravel/6.x/middleware/5136#terminable-middleware

	Terminable 中间件

	它的执行时机就是:
		在准备好 HTTP 响应之后,中间件可能需要做一些工作。例如,Laravel 内置的「session」 中间件会在完全准备好响应后将会话数据写入存储。如果你在中间件上定义了一个 terminate 方法,并且你使用的是 FastCGI ,那么它将会在响应准备发送到浏览器之后自动调用。

所以,我们就确定了日志的位置。

所以,定义了一个 AdminLogMiddleware,记录下过程中的几个问题:
	1>只定义 terminate() 方法,不定义 handle() 方法,报错:
		Function name must be a string

	2>terminate() 方法,调试过程中,输出不了任何内容,这个其实就跟在 public/index.php 中,在 
		$response->send();

	  执行后面,也输出不了任何内容,而 $kernel->terminate($request, $response); 也是在这后面,所以输出不了内容

	3>输出不了内容,如何调试,在 public/index.php 中调试(这个也是我在写这边笔记时,重新看了下 public/index.php 想到的。。。)
		我的调试,就是在 AdminLogMiddleware 中间件的 handle() 方法中调试的。

		/*
			这里再强调个知识点,文档中的:
				前置 & 后置中间件

			前置中间件:
				public function handle($request, Closure $next)
				{
					// 执行内容
					return $next($request);
				}

			后置中间件:
				public function handle($request, Closure $next)
				{
					$response = $next($request);

					// 执行内容

					return $response;
				}
		 */

		发现后置中间件,也是能获取到响应的,但这里的响应,是不是经历了当前中间件处理后,然后得到的响应?还是所有请求结束后的响应内容?(应该是所有请求结束后的响应内容,因为中间件,并非执行请求,只是处理请求前的,一道道过滤机制,或其他逻辑处理吧)

		还是文档、源码、整个机制不清楚。。。有时间我也得再好好啃,先把自己理解的记录下来

	4>后置中间件 和 terminate() 方法,都可以收到 $response,但2者的区别到底是什么,我还不是很清楚,但是目前看有一点是清楚的:
		后置中间件,我们得到 $response,可以输出,而 terminate() 不行

	5>我们可以更优化下日志处理,将其作为一个 event 事件,解耦,逻辑还清晰。因为可能以后还可能定义其他操作
		如果那样的话,我们也不能定义为 AdminLogMiddleware,但我们目前只想让部分路由使用,中间件好像更好点。

		不过,我们也可以定义一个全局的日志中间件,在中间件里,通过路由匹配,来指定哪些路由想要记录日志

		关于这点发现好像自己都被绕进去了,是不是这么架构合理...(架构知识很欠缺...)

临时写的笔记,有点乱,另外自身实力有限,勿怪,最后,记录下代码:
	数据库迁移:
        Schema::create('admin_logs', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('admin_id')->unsigned()->comment('管理员ID');
            $table->string('url', 255)->comment('请求地址');
            $table->text('params')->comment('请求参数');
            $table->string('ip', 255)->comment('IP地址');
            $table->string('user_agent', 255)->comment('用户代理');
            $table->string('content', 255)->comment('日志描述');

            $table->timestamps();

            $table->index('admin_id');
            $table->index('ip');
        });

        DB::statement("ALTER TABLE `app_versions` comment '后台管理日志表'");

   	中间件 terminate() 方法: 
    public function terminate($request, $response)
    {
        $admin = Auth::guard('admin')->user();

        // 数据处理
        $admin_id = $admin ? $admin->id : 0;
        $method = $request->method();
        $uri = $request->path();

        // 1.过滤 uris(不记录日志的 uri)
        $guarded_uris = [
            'admin/ajax/lang',
        ];
        if(in_array($uri, $guarded_uris)){
            return true;
        }

        // 2.过滤 uris + method(某些 uri 的 get 和 post 一致,也需要过滤)
        $guards_get_method_uris = [
            'admin/account/login',
        ];
        if(in_array($uri, $guards_get_method_uris)){
            return true;
        }

        // 2.过滤 params(日志中不记录密码等私密信息)
        $guarded_params = [
            'password',
        ];
        $params = $request->all();
        $params = array_filter($params, function ($key) use ($guarded_params) {
            return !in_array($key, $guarded_params);
        }, ARRAY_FILTER_USE_KEY);
        $params = json_encode($params, JSON_UNESCAPED_UNICODE);

        $ip = $request->getClientIp();
        $user_agent = Agent::getUserAgent();

        /*
        	这里结合的是我系统里的,记录内容会根据权限菜单名来匹配
         */
        // 4.得到日志内容(我们通过 uri 匹配相应的 '权限菜单 identifier',来获取)
        // 1>后台权限路由
        $admin_permission = AdminPermission::where('identifier', substr($uri, 6))->first();
        if($admin_permission){
            $id_chain = $admin_permission->id_chain;
            $names = AdminPermission::whereIn('id', explode('-', $id_chain))->pluck('name');
            $content = $names->join('-');

        // 2>后台其他路由
        }else{
            switch($uri){
                case 'admin/account/login':
                    $content = '登录';
                    break;

                case 'admin/account/logout':
                    $content = '退出登录';
                    break;

                default:
                    $content = '其他操作';
                    break;
            }
        }

        $admin_log_data = [
            'admin_id' => $admin_id,
            'method' => $method,
            'uri' => $uri,
            'params' => $params,
            'ip' => $ip,
            'user_agent' => $user_agent,
            'content' => $content,
        ];
        AdminLog::create($admin_log_data);
    }

    最终的记录结果:
		(`id`, `admin_id`, `uri`, `params`, `ip`, `user_agent`, `content`, `created_at`, `updated_at`)

		(26,1,'admin/auth/permission/index','{\"sort\":\"sortid\",\"order\":\"desc\",\"offset\":\"0\",\"limit\":\"10\",\"_\":\"1569680908796\"}','127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36','权限管理-菜单管理-列表','2019-09-28 14:40:43','2019-09-28 14:40:43');

 

Claude Code插件安装与VSCode深度集成实战指南 Claude Code是一款专为IDE设计的AI编程助手插件,其核心价值在于将自然语言意图转化为可运行代码,从而优化开发者认知带宽分配。它依赖Node.js运行时、git版本上下文和VSCode编辑器API三者协同工作,技术原理涉及本地进程通信、权限策略绕过、上下文感知补全等关键机制。该工具显著提升工程效率,适用于CLI开发、EXIF元数据处理、异步逻辑生成等典型JavaScript/TypeScript应用场景。本文聚焦Claude Code插件在VSCode中的真实落地链路,覆盖Windows/macO 阅读详情

相关推荐

FunASR语音识别服务在Win11上的Docker部署避坑指南:模型配置与热词优化

本文详细介绍了在Windows 11系统上通过Docker部署FunASR语音识别服务的完整流程,包括环境准备、模型配置、热词优化及常见问题解决方案。特别针对Win11环境下的特殊配置和性能调优提供了实用指南,帮助开发者高效搭建高性能语音识别服务。

e3f4g5的博客 222

meson+ninja环境搭建

使用centos 7.8搭建meson+ninja编译环境,主要依赖三个rpm包: python3.6 ninja-build meson python3安装 这里直接使用yum进行安装: yum -y install python3 ninja rpm包安装 下载ninja-build rpm包:https://cbs.centos.org/koji/buildinfo?buildID=24453,使用如下命令安装: rpm -ivh ninja-build-1.7.2-3.el7.x86_64.r

程序猿Ricky的日常干货 1万+

望获实时Linux与国产芯片协同:打造LinuxCNC数控机床的全栈国产化方案

本文探讨了如何通过望获实时Linux与飞腾、龙芯等国产芯片的深度协同,为LinuxCNC数控机床打造全栈国产化方案。望获实时Linux通过中断隔离等核心技术,提供亚微秒级确定性响应,解决了传统Linux系统实时性不足的痛点,使LinuxCNC得以稳定驱动高精度机床。该方案实现了从硬件、操作系统到应用软件的全栈自主可控,为工业控制领域提供了高性能、可定制的国产化选择。

weixin_29291069的博客 647

类似于 FastAdmin的快速后台开发框架都有哪些

这些产品都具有不同的特点和优势,你可以根据自己的技术栈、项目需求以及个人偏好来选择适合的后台开发框架或系统。同时,也可以参考其他开发者的评价和使用经验,以便做出更明智的决策。这些产品各有特色,涵盖了不同的技术栈和需求场景。同时,建议在使用之前仔细查阅官方文档和社区资源,以便更好地了解产品的使用方法和最佳实践。这些产品都具有各自的特点和优势,开发者可以根据自己的需求和项目特点选择适合自己的框架或平台。请注意,每个框架或平台都有其特定的学习曲线和配置要求,因此在使用之前建议仔细阅读官方文档并参考相关教程。

AI 前沿技术实战博客:LLM / Agent / AI 制药 / 生信四大栏目日更,硬核干货 + 可复现代码,看完就能上手 5386

Audio2Face进阶玩法:结合LiveLink在UE5中实现MetaHuman全身动画+语音驱动(保姆级配置指南)

本文提供了一份详尽的保姆级教程,指导如何将NVIDIA Audio2Face与Unreal Engine 5的LiveLink功能结合,实现驱动MetaHuman数字人面部表情的同时,无缝融合身体动画。文章详细讲解了从环境准备、插件部署、基础面部驱动测试,到动画蓝图高级配置与多数据流融合的全流程,并分享了性能优化与问题排查的实战经验,旨在帮助创作者打造表情与肢体动作协调统一的生动数字人。

q9w8e7r6t5的博客 196

[华为]华为无线控制器AC6508简单配置实例

用户需求:3个地址段,分别是领导、员工、访客,访问控制策略是只允许访客上网,不允许访客访问内网。 vlan173为设备的管理地址和AP获取的地址,领导、员工、访客的vlan分别是vlan131/vlan132/vlan133 首先是许可的下载,使用华为的账号登陆http://app.huawei.com/isdp ,然后按照说明输入许可,下载许可,将许可导入到设备。 web界面访问后,直接按照配置向导配置就可以了。 1.基本配置里主要配置license、设备名称、设备时间 2.端口配置:连接上

日子_很简单 2万+

系统操作日志设计(一)

前言<br /> <br />我们在做企业管理系统时,有多多少少都有对数据的完整性有所要求,比如要求系统不能物理删除记录,要求添加每一条数据时都要有系统记录、或者更新某条数据都需要跟踪到变化的内容、或者删除数据时需要记录谁删除了,何时删除了,以便误删后可以通过系统的XXX功能来恢复误删的数据。<br />我将这种功能称为操作日志<br />为什么要做操作日志?<br />其实上文也描述了一些,其主要目的就是跟踪到每一个用户在系统的操作行为,如对数据进行查询、新增、编辑或删除甚至是登录等行为。更进一步的理解可

jackljf的专栏 3012

HDR 成像技术学习(三)—— LOFIC

LOFIC(Lateral Overflow Integration Capacitor,横向溢出集合电容)介绍,从像素结构到工作时序。

沧海一升的博客 9729

后台操作日志

标签位 'app_end' => [ 'app\\admin\\behavior\\AdminLog', ], 对应行为类 namespace app\admin\behavior; class AdminLog { public function run(&$params) { //只记录POST请求的日志 if (request()->isPost() && config('fastadmin.

qq_31315703的博客 946

SAP BOM反查(可追溯值至顶级)

功能介绍:BOM层数在7层以内的(含7层)的物料,执行后都可以查询到顶级的BOM,逻辑很简单,后期如BOM层数增加,可自行增加查询逻辑。 *&---------------------------------------------------------------------* *& Report ZBOM_CHECK *&---------------------...

SAP阿狸 6059

基于OpenCV实现暗通道先验去雾算法及改进,效果惊人

深度技术文,前方高能

公号:一条coding 2万+

实例讲解如何使用Laravel日志记录

本文将探讨Laravel日志记录的基础知识,以及为什么应该在下一个项目中使用Laravel日志记录。我们将详细讨论结构化日志记录和集中式日志记录。此外,我们将学习如何通过构建一个Todo应用程序来实现Laravel日志记录。

WPHunter的编程技术资料库! 1780

Android 人像分割实战:OpenCV+YOLOv8+NCNN 三库联动(附 GPU 加速 / 内存优化全方案)

本文详细介绍了在Android项目中集成OpenCV+YOLOv8+NCNN实现实时人像分割的技术方案。主要内容包括:项目环境搭建(配置NDK、添加Native模块)、核心库文件集成(OpenCV、NCNN、YOLOv8模型)、JNI接口设计与实现(Kotlin层调用C++算法)。通过Camera API获取图像数据,使用YOLOv8进行人体检测,结合NCNN高性能推理框架实现人像分割处理,最终将原始画面与分割结果(背景透明)同时显示在Android界面上。该项目采用多技术栈协同工作,OpenCV负责图像处

FJN110的博客 232

Laravel 中如何实现后台管理员的详细增删改查操作日志?使用场景是什么?底层原理是什么?

在 Laravel 中实现后台管理员的详细增删改查操作日志是一个常见的需求,可以帮助你跟踪和审计管理员的操作。以下是如何实现这一功能的方法、使用场景以及底层原理。

长风破浪会有时的博客 933

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Laravel 多认证后台系统使用教程

Laravel 多认证后台系统使用教程 1. 项目介绍 laravel-multi-auth-admin 是一个基于 Laravel 框架开发的多认证后台系统。该项目支持前后台登录认证以及权限管理,模板使用了 color admin。由于仓库的 Laravel 版本较旧,该项目已被弃用,但仍可作为学习和参考使用。 2. 项目快速启动 2.1 克隆项目 首先,克隆项目到本地: git clone h...

gitblog_01200的博客 460

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spatie Laravel Activitylog 基础使用指南:活动日志记录详解

在Web应用开发中,记录用户操作和系统事件是一项基本但至关重要的功能。Spatie Laravel Activitylog包为Laravel应用提供了强大而灵活的活动日志记录功能。本文将深入解析该包的基础使用方法,帮助开发者快速掌握其核心功能。 ## 基础日志记录 最基本的日志记录方式非常简单: ```php activity()->log('看,妈妈,我记录了一些东西'); ``` 这行...

gitblog_00475的博客 377

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Laravel 如何实现日志记录的功能?使用场景是什么?底层原理是什么?

在 Laravel 中,日志记录是一个非常重要的功能,它可以帮助开发者跟踪应用程序的运行状态、调试问题以及监控错误。Laravel 使用 Monolog 库来处理日志记录,Monolog 是一个强大的 PHP 日志库,支持多种日志处理方式。配置日志驱动:使用日志门面: 自定义日志级别: 上下文信息: 异常日志: 监听日志事件: 自定义日志处理器: 使用场景 调试:在开发过程中记录关键变量的状态或函数的调用情况,帮助快速定位问题。 错误追踪:记录应用中的错误和

长风破浪会有时的博客 598

laravel 利用中间件进行操作日志记录

利用中间件进行操作日志记录过程: 1、创建中间件 php artisan make:middleware AdminOperationLog 2、生成了文件./app/Http/Middleware/AdminOperationLog.php 代码如下: &lt;?php namespace App\Http\Middleware; use Closure; use Illu...

wml 1万+

定制laravel-http-logger:打造符合业务需求的请求日志记录规则

laravel-http-logger是一款专为Laravel应用设计的HTTP请求日志记录工具,能够帮助开发者轻松实现请求数据的追踪与分析。本文将详细介绍如何通过配置调整和自定义扩展,让这款工具完美适配你的业务场景,实现精准、高效的日志管理。 ## 快速了解核心配置文件 配置文件是定制laravel-http-logger的基础,位于项目根目录下的`config/http-logger.ph

gitblog_00380的博客 532

Laravel Impersonate 使用指南

Laravel Impersonate 使用指南 项目介绍 Laravel Impersonate 是一个专为 Laravel 框架设计的模拟登录包。通过它,开发者可以轻松地模拟成其他用户进行系统操作,无论是手动还是利用其提供的界面。该包默认包含了授权管理,允许你根据自身规则调整哪些用户可以执行模拟操作以及谁可以被模拟。适用于需要后台管理员模拟前端用户行为以进行测试或支持的场景。最新版本提供了新...

gitblog_00724的博客 804

Laravel Nova权限管理终极指南:实现细粒度后台访问控制

Laravel Nova作为Laravel生态中的明星级管理后台工具,其强大的权限管理功能让开发者能够轻松实现细粒度的访问控制。无论是小型项目还是企业级应用,Nova都能提供灵活而安全的权限管理解决方案,确保您的后台数据得到充分保护。 ## 为什么选择Laravel Nova权限管理? Laravel Nova权限管理提供了一套完整的授权体系,让您能够精确控制不同用户角色对后台资源的访问权限。

gitblog_00639的博客 409

Laravel-Admin多租户架构实战指南:如何构建企业级SaaS管理后台

在当今数字化转型浪潮中,企业级SaaS应用需要为不同客户提供安全隔离的管理后台环境。Laravel-Admin多租户架构为这一需求提供了优雅的解决方案,让开发者能够在十分钟内构建出功能完整、数据隔离的SaaS管理平台。本文将深入解析如何基于Laravel-Admin框架实现多租户架构设计,涵盖**数据库隔离策略**、**权限系统适配**、**数据过滤机制**和**性能优化技巧**等核心内容。 #

gitblog_00850的博客 396

dashboard php,iDashboard: 基于Laravel5.3的简单后台权限管理系统,基本的后台权限完成,后续会根据计划来升级后台功能~...

iDashboard - Laravel5.3基本的权限管理系统当前分支为Laravel版本~,Vue2.0版本戳这里 ,Vue2.0只完成了部分,用户管理,权限管理以及角色管理,其他的都还没有做。本人时间有限,重复的增删改查不想写了,代码共参考,近期会出Laravel5.3和Vue2.0的视频教程。请关注博客!http://iwanli.me基于Laravel5.3的后台管理系统,实现最基本的后...

weixin_39517520的博客 477

Laravel后台管理插件CatchAdmin核心功能与实战指南

RBAC权限管理和模块化设计是现代后台管理系统的核心技术。基于角色的访问控制(RBAC)通过角色分配实现细粒度权限控制,而模块化架构则提升了代码复用性和可维护性。在Laravel生态中,CatchAdmin整合了Vue 3和Element Plus等前沿技术,提供开箱即用的RBAC实现和代码生成器,大幅降低企业级后台开发成本。该方案特别适合需要快速迭代的中大型项目,其前后端分离架构还能轻松对接移动端应用。通过内置的数据库优化和Redis缓存策略,系统在保证功能完整性的同时兼顾了性能要求。

diaohong5075的博客 284

Laravel Admin Panel进阶技巧:Activity Log日志监控与系统审计指南

Laravel Admin Panel是一款功能强大的后台管理系统,提供了丰富的功能来帮助开发者快速构建管理界面。其中Activity Log日志监控功能是系统审计和安全管理的重要组成部分,能够记录用户操作、追踪系统变更,为系统安全和问题排查提供有力支持。 ## 一、Activity Log日志功能简介 Activity Log日志功能基于Spatie\Activitylog扩展包实现,能够自

gitblog_01193的博客 353

如何使用 Laravel Visitor 轻松追踪网站访客信息:完整指南

在当今数字化时代,了解访客行为对于网站优化和用户体验提升至关重要。**Laravel Visitor** 作为一款强大的 Laravel 访客信息提取工具,能够帮助开发者轻松获取访客的浏览器、IP、设备等关键数据,并实现用户在线状态追踪。本文将详细介绍如何利用这款工具优化你的网站访客管理系统。 ## 什么是 Laravel Visitor? Laravel Visitor 是一个专为 Lara...

gitblog_00528的博客 514
上一篇: php 没注意、但有用的函数
下一篇: laravel passport 登录后,直接通过 Auth::guard('api')->user() 返回 null
beyond__devil
博客等级 码龄14年 147粉丝 314原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值