symfony日志上下文是传入的关联数组,用于携带结构化信息,无需“加下划线”;键名推荐小写加下划线命名(如user_id),需配置formatter启用includecontext并用processor清洗敏感或不可序列化数据。

Symfony日志上下文不是“加下划线”,而是指在记录日志时传入的关联数组(context),用于携带结构化、可检索的额外信息。这个数组本身不带格式符号,但它的键名和值会原样参与日志序列化与输出——所谓“加_”可能是误解了某些调试显示(如 IDE 或日志查看器对数组键名的渲染方式),或混淆了命名规范(如用 user_id 这类带下划线的键名)。
上下文的本质:天然就是数组
Monolog 的 $logger->info('message', $context) 第二个参数 $context 必须是 PHP 关联数组。你不需要转换、也不需要“加下划线”来启用它:
-
直接传数组即可:例如
$logger->warning('Login failed', ['username' => 'alice', 'ip' => '192.168.1.5', 'attempts' => 3]) -
键名推荐用小写+下划线:这是 Symfony 社区通用命名风格(如
user_id、request_id),便于日志解析工具识别,但不是强制语法要求 - 避免对象或资源:若 context 中含对象,Monolog 默认无法序列化,可能报错或输出空内容;需用处理器预处理
让上下文安全、可用的关键操作
要确保上下文真正落地为可读、可查的日志内容,需注意三点:
-
配置 Formatter 启用上下文输出:默认 StreamHandler 使用
LineFormatter,需显式开启includeContext: true(YAML 配置中) -
用 Processor 清洗敏感或不可序列化数据:比如移除
password字段,或把对象转成字符串:
src/Log/Processor/SafeContextProcessor.phppublic function __invoke(array $record): array {<br> if (isset($record['context']['password'])) {<br> unset($record['context']['password']);<br> }<br> return $record;<br>} -
在 monolog.yaml 中注册该 Processor:
monolog:<br> handlers:<br> main:<br> type: stream<br> processors: [safe_context]
典型使用场景示例
结合业务逻辑,上下文应聚焦关键维度:
-
用户行为追踪:
$logger->info('Order created', ['order_id' => $order->getId(), 'user_id' => $user->getId(), 'total' => $order->getTotal()]) -
API 请求审计:
$logger->debug('API call received', ['path' => $request->getPathInfo(), 'method' => $request->getMethod(), 'request_id' => $request->headers->get('X-Request-ID')]) -
异常补充信息:
catch (\Exception $e) { $logger->error('Payment failed', ['transaction_id' => $txId, 'error_class' => get_class($e), 'message' => $e->getMessage()]); }











