Protokoll #14433
| ID | 14433 |
|---|---|
| Zeitstempel | 2025-12-25 10:39:17.626603 |
| Client | root |
| IP | Warning: Undefined array key "request_ip" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 |
| Modell | claude-sonnet-4-20250514 |
| Status | completed |
| Tokens | 1,448 (Input: 0, Output: 0) |
| Dauer | 117 ms |
| Request-Zeit | Warning: Undefined array key "request_timestamp" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 18 |
| Response-Zeit | - |
Warning: Undefined array key "error_message" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 22
Request
{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/Persistence\/Connection.php"
}
}
Response
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/Logging\/AuditLogger.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Infrastructure\\Logging;\n\n\/\/ @responsibility: Audit-Logging mit Correlation-ID und strukturiertem Kontext\n\nuse Infrastructure\\Config\\DatabaseFactory;\nuse PDO;\n\nfinal class AuditLogger\n{\n private string $correlationId;\n private PDO $db;\n\n private const LOG_LEVELS = ['debug', 'info', 'warning', 'error'];\n\n public function __construct(?string $correlationId = null)\n {\n $this->correlationId = $correlationId\n ?? $_SERVER['HTTP_X_CORRELATION_ID']\n ?? $_SERVER['CORRELATION_ID']\n ?? $this->generateCorrelationId();\n\n $this->db = DatabaseFactory::dev();\n }\n\n \/**\n * Generate a unique correlation ID.\n *\/\n private function generateCorrelationId(): string\n {\n return bin2hex(random_bytes(8));\n }\n\n \/**\n * Get the current correlation ID.\n *\/\n public function getCorrelationId(): string\n {\n return $this->correlationId;\n }\n\n \/**\n * Log a generic event.\n *\n * @param string $event Event name (e.g., \"user.login\", \"chat.message.sent\")\n * @param array<string, mixed> $context Additional context data\n * @param string $level Log level: debug, info, warning, error\n *\/\n public function log(string $event, array $context = [], string $level = 'info'): void\n {\n if (!in_array($level, self::LOG_LEVELS, true)) {\n $level = 'info';\n }\n\n $stmt = $this->db->prepare('\n INSERT INTO audit_log\n (correlation_id, event, context, level, user_id, ip_address, created_at)\n VALUES (?, ?, ?, ?, ?, ?, NOW())\n ');\n\n $stmt->execute([\n $this->correlationId,\n $event,\n json_encode($context, JSON_UNESCAPED_UNICODE),\n $level,\n $this->getUserId(),\n $this->getIpAddress(),\n ]);\n }\n\n \/**\n * Log an entity action (CRUD operation).\n *\n * @param string $action Action performed: create, read, update, delete, etc.\n * @param string $entity Entity type: user, task, content, etc.\n * @param int|null $entityId Entity ID (null for create before ID is known)\n * @param array<string, mixed> $data Additional data about the action\n *\/\n public function logAction(\n string $action,\n string $entity,\n ?int $entityId = null,\n array $data = []\n ): void {\n $event = \"{$entity}.{$action}\";\n\n $stmt = $this->db->prepare('\n INSERT INTO audit_log\n (correlation_id, event, entity_type, entity_id, context, level, user_id, ip_address, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())\n ');\n\n $stmt->execute([\n $this->correlationId,\n $event,\n $entity,\n $entityId,\n json_encode($data, JSON_UNESCAPED_UNICODE),\n 'info',\n $this->getUserId(),\n $this->getIpAddress(),\n ]);\n }\n\n \/**\n * Log an error event.\n *\/\n public function logError(string $event, string $message, array $context = []): void\n {\n $context['error_message'] = $message;\n $this->log($event, $context, 'error');\n }\n\n \/**\n * Log a warning event.\n *\/\n public function logWarning(string $event, string $message, array $context = []): void\n {\n $context['warning_message'] = $message;\n $this->log($event, $context, 'warning');\n }\n\n \/**\n * Log debug information (only in development).\n *\/\n public function debug(string $event, array $context = []): void\n {\n \/\/ Only log debug in development\n $appEnv = $_ENV['APP_ENV'] ?? 'production';\n if ($appEnv === 'development') {\n $this->log($event, $context, 'debug');\n }\n }\n\n \/**\n * Get the current user ID from session.\n *\/\n private function getUserId(): ?int\n {\n return isset($_SESSION['user_id']) ? (int) $_SESSION['user_id'] : null;\n }\n\n \/**\n * Get the client IP address.\n *\/\n private function getIpAddress(): ?string\n {\n return $_SERVER['HTTP_X_FORWARDED_FOR']\n ?? $_SERVER['HTTP_X_REAL_IP']\n ?? $_SERVER['REMOTE_ADDR']\n ?? null;\n }\n\n \/**\n * Query logs by correlation ID.\n *\n * @return array<int, array<string, mixed>>\n *\/\n public function getByCorrelationId(string $correlationId): array\n {\n $stmt = $this->db->prepare('\n SELECT * FROM audit_log\n WHERE correlation_id = ?\n ORDER BY created_at ASC\n ');\n $stmt->execute([$correlationId]);\n\n return $stmt->fetchAll(PDO::FETCH_ASSOC);\n }\n\n \/**\n * Query recent logs for an entity.\n *\n * @return array<int, array<string, mixed>>\n *\/\n public function getByEntity(string $entityType, int $entityId, int $limit = 50): array\n {\n $stmt = $this->db->prepare('\n SELECT * FROM audit_log\n WHERE entity_type = ? AND entity_id = ?\n ORDER BY created_at DESC\n LIMIT ?\n ');\n $stmt->execute([$entityType, $entityId, $limit]);\n\n return $stmt->fetchAll(PDO::FETCH_ASSOC);\n }\n}\n",
"numLines": 192,
"startLine": 1,
"totalLines": 192
}
}
}