php实现操作日志
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);
}
日志查询接口
提供日志查询功能:
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);
}
}
安全注意事项
敏感操作应记录更详细的信息,但避免直接记录密码等敏感数据。对于高安全要求的系统,可以考虑使用单向哈希处理部分日志内容。







