PHP日志系统需按环境动态控制DEBUG日志:用严格相等判断LOG_LEVEL是否为'DEBUG'再写入文件;多级过滤推荐拆解为$shouldLog变量;格式化后用三元选择输出到STDERR或syslog,并用function_exists兜底。

在PHP日志系统中,需根据当前环境动态决定是否记录DEBUG级别日志,避免生产环境因冗余日志拖慢性能或泄露敏感信息。
用三元运算符控制日志是否写入文件
第一步:定义当前日志级别常量,如LOG_LEVEL = 'INFO';
第二步:判断LOG_LEVEL是否为'DEBUG',是则调用file_put_contents()追加日志,否则返回false不执行写入;
LOG_LEVEL === 'DEBUG' ? file_put_contents('debug.log', $msg . PHP_EOL, FILE_APPEND) : false;
立即学习“PHP免费学习笔记(深入)”;
这一步不能省略严格相等===,用==可能把'debug'(小写)误判为真,导致生产环境意外写入调试日志。
三元嵌套实现多级日志过滤输出
方法一:单行嵌套判断
$level === 'ERROR' ? error_log($msg) : ($level === 'WARN' ? error_log('[WARN] ' . $msg) : ($level === 'DEBUG' && ENV === 'dev' ? file_put_contents('debug.log', $msg . PHP_EOL, FILE_APPEND) : null));
方法二:拆解为可读变量(推荐维护)
$shouldLog = $level === 'ERROR' || ($level === 'WARN' && ENV !== 'prod') || ($level === 'DEBUG' && ENV === 'dev');
$shouldLog ? error_log("[$level] $msg") : null;
【ENV必须已定义且为字符串,未定义时三元表达式会触发Notice并默认转为false】
结合sprintf格式化与三元选择输出目标
先构造格式化消息:$formatted = sprintf('[%s][%s] %s', date('H:i:s'), strtoupper($level), $message);
再用三元决定输出到STDERR还是syslog:
in_array($level, ['ERROR', 'FATAL']) ? fwrite(STDERR, $formatted . PHP_EOL) : syslog(LOG_INFO, $formatted);
注意:syslog在Docker容器中可能未配置,直接调用会静默失败,建议先用function_exists('syslog')兜底。



















