Apache访问日志中的UTF-8字符✔

问题

我正在使用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 

我试过了

  • 检查了LANGLC_ALL的值,它们都被设置为en_US.UTF-8
  • 更新/etc/apache2/envvars /etc/default/locale使用/etc/default/locale
  • 使用mod_charset_lite我已经在站点的Apacheconfiguration中设置了CharsetSourceEnc UTF8CharsetDefault UTF8 (我知道这是用于内容input/输出)
  • 检查/etc/apache2/conf.d/charset是否设置了AddDefaultCharset UTF-8
  • 尝试通过pipe道日志发送日志输出到另一个程序 – 它的到达时间,所以它看起来像是与Apache进程本身有关。
  • 通读Apache日志文档

最终,我想要访问日志显示如下所示:

但我正在拉我的头发试图到达那里。

其他信息

  • Apache版本2.4.10
  • Debian 8.4

更新

根据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