问题
我正在使用PHP的apache_note()将Web请求中的variableslogging到CustomLog格式。 但是,尽可能地尝试一下,Apache不想按照我想要的方式来loggingUTF-8字符。
在PHP中,我有apache_note('some_value', '✔'); 这对应于VHostconfiguration,如下所示:
LogFormat "%{some_value}n" custom_format CustomLog ${APACHE_LOG_DIR}/access.log custom_format
但是,Apache最终会logging像这样的文字版本:
\xe2\x9c\x94
我试过了
LANG和LC_ALL的值,它们都被设置为en_US.UTF-8 /etc/apache2/envvars /etc/default/locale使用/etc/default/locale CharsetSourceEnc UTF8和CharsetDefault UTF8 (我知道这是用于内容input/输出) AddDefaultCharset UTF-8 最终,我想要访问日志显示如下所示:
✔
但我正在拉我的头发试图到达那里。
其他信息
更新
根据Esa的build议,我修改了LogFormat指令:
LogFormat "%{some_value}n ✔" custom_format
我得到以下几点:
\xe2\x9c\x94 ✔
这很有趣,因为它表明Apache愿意loginUTF-8。 不过,我仍然不相信这个问题与PHP传递非UTF-8值有关。
apache_note('some_value', '✔'); $value = apache_note('some_value'); print_r($value);
在PHP中仍然打印出来
✔
我会尝试在旁边重新编译Apache,看看它有帮助,但我确实需要在生产中这可能是有害的。
转义logging是一个function
从2.0.49开始,Apache日志API将所有转到error_log的内容都转义出来,因此如果在开发阶段你被这个特性所困扰(因为你的错误信息会被搞砸),你可以在Apache构build过程中禁用转义时间:
% CFLAGS="-DAP_UNSAFE_ERROR_LOG_UNESCAPED" ./configure ...除非你知道你在做什么,否则不要在生产中使用CFLAGS。
你会发现它在ap_escape_logitem中被转义。 看看下面的代码。 它使用名为TEST_CHAR的macros来确定需要转义的内容,但输出基本上是ASCII
https://github.com/apache/httpd/blob/5ed78e19a21609f7097f9049b2fe6db8e471f810/server/util.c