当前位置:首页 > PHP

php实现操作日志

2026-02-16 11:08:01PHP

PHP 实现操作日志的方法

数据库表设计

创建一个专门存储操作日志的数据库表,字段通常包括日志ID、操作类型、操作内容、操作用户、操作时间等。示例SQL:

CREATE TABLE `operation_logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '操作用户ID',
  `action` varchar(50) NOT NULL COMMENT '操作类型',
  `content` text COMMENT '操作内容',
  `ip_address` varchar(50) DEFAULT NULL COMMENT 'IP地址',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

日志记录类封装

创建一个独立的日志记录类,封装日志写入逻辑:

class OperationLogger {
    private $db;

    public function __construct($dbConnection) {
        $this->db = $dbConnection;
    }

    public function log($userId, $action, $content = '') {
        $ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
        $stmt = $this->db->prepare("INSERT INTO operation_logs (user_id, action, content, ip_address) VALUES (?, ?, ?, ?)");
        $stmt->execute([$userId, $action, $content, $ip]);
        return $this->db->lastInsertId();
    }
}

中间件实现

在框架中使用中间件自动记录请求日志:

class LogOperationMiddleware {
    protected $logger;

    public function __construct(OperationLogger $logger) {
        $this->logger = $logger;
    }

    public function handle($request, $next) {
        $response = $next($request);

        if (auth()->check()) {
            $this->logger->log(
                auth()->id(),
                $request->method(),
                $request->fullUrl()
            );
        }

        return $response;
    }
}

文件日志备份

同时将关键操作记录到文件作为备份:

function logToFile($message) {
    $logFile = __DIR__.'/logs/operation_'.date('Y-m-d').'.log';
    $logMessage = '['.date('Y-m-d H:i:s').'] '.$message.PHP_EOL;
    file_put_contents($logFile, $logMessage, FILE_APPEND);
}

日志查询接口

提供日志查询功能:

php实现操作日志

class LogController {
    public function index(Request $request) {
        $query = OperationLog::query();

        if ($request->has('user_id')) {
            $query->where('user_id', $request->input('user_id'));
        }

        if ($request->has('action')) {
            $query->where('action', 'like', '%'.$request->input('action').'%');
        }

        return $query->orderBy('created_at', 'desc')->paginate(20);
    }
}

安全注意事项

敏感操作应记录更详细的信息,但避免直接记录密码等敏感数据。对于高安全要求的系统,可以考虑使用单向哈希处理部分日志内容。

标签: 操作日志
分享给朋友:

相关文章

vue实现滚动日志效果

vue实现滚动日志效果

实现滚动日志效果的基本思路 滚动日志效果通常指动态添加日志内容并自动滚动到底部,常见于实时日志监控或聊天界面。Vue中可通过以下方法实现: 使用v-for渲染日志列表 在Vue模板中使用v-for循…

vue项目操作如何实现

vue项目操作如何实现

Vue 项目基本操作实现 创建 Vue 项目 使用 Vue CLI 快速创建项目: npm install -g @vue/cli vue create project-name cd projec…

react如何操作节点数据

react如何操作节点数据

操作节点数据的常见方法 在React中操作DOM节点数据通常通过ref实现,以下是几种典型场景的解决方案: 使用useRef创建引用 通过useRef钩子创建引用并绑定到DOM元素,后续可直接操作节…

php实现日志

php实现日志

PHP 实现日志功能的方法 使用内置函数 error_log() PHP 提供了 error_log() 函数,可以直接将日志写入文件或系统日志中。error_log("Error message"…

js实现操作

js实现操作

JavaScript 实现操作的方法 JavaScript 提供了多种方式来实现操作,包括 DOM 操作、事件处理、异步编程等。以下是几种常见操作的实现方法。 DOM 操作 通过 JavaScrip…

uniapp 日志组件

uniapp 日志组件

uniapp 日志组件实现方案 在 uniapp 中可以通过自定义组件或第三方插件实现日志功能,以下是几种常见方案: 自定义日志组件 创建一个可复用的日志显示组件,包含以下功能: 日志信息展示区域…