当前位置:首页 > 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;

日志记录类封装

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

php实现操作日志

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();
    }
}

中间件实现

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

php实现操作日志

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);
}

日志查询接口

提供日志查询功能:

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);
    }
}

安全注意事项

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

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

相关文章

java如何查看日志

java如何查看日志

查看 Java 日志的方法 使用日志框架输出日志 常见的 Java 日志框架包括 Log4j、Logback 和 java.util.logging。配置日志框架后,通过调用相应的 API 输出日志。…

java如何记录日志

java如何记录日志

Java 日志记录方法 Java 提供了多种日志记录框架和工具,以下是常见的几种方法: 使用 java.util.logging (JUL) Java 标准库自带的日志框架,无需额外依赖: imp…

uniapp 日志组件

uniapp 日志组件

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

uniapp 日志存储

uniapp 日志存储

uniapp 日志存储方法 在 uniapp 中存储日志可以通过多种方式实现,以下是一些常见的方法: 使用本地存储 通过 uni.setStorageSync 和 uni.getStorageSyn…

vue 实现选题操作

vue 实现选题操作

Vue 实现选题操作 在 Vue 中实现选题操作通常涉及列表渲染、事件处理和状态管理。以下是一个常见的实现方案,适用于单选或多选场景。 单选实现 创建一个可选的列表,点击选中某一项: <te…

php实现登录的操作

php实现登录的操作

创建登录表单 在HTML中设计一个简单的登录表单,包含用户名和密码输入框。表单的action属性指向处理登录的PHP文件,method设置为POST。 <form action="login.…