Caracteres UTF-8 no log de acesso do Apache ✔

3

O problema

Estou usando apache_note() do PHP para registrar variáveis de solicitações da Web para um formato CustomLog. No entanto, por mais que eu tente, o Apache não quer registrar os caracteres UTF-8 do jeito que eu gostaria.

No PHP, eu tenho apache_note('some_value', '✔'); que corresponde à configuração do VHost que se parece com isso:

LogFormat "%{some_value}n" custom_format CustomLog ${APACHE_LOG_DIR}/access.log custom_format

No entanto, o Apache acaba registrando a versão literal assim:

\xe2\x9c\x94

O que eu tentei

  • Verificou os valores de ambos os LANG e LC_ALL e ambos estão definidos para en_US.UTF-8
  • Atualizado /etc/apache2/envvars para usar /etc/default/locale por padrão
  • Usando o mod_charset_lite, defini CharsetSourceEnc UTF8 e CharsetDefault UTF8 na configuração do Apache para o site (eu sei que isso é para conteúdo dentro / fora)
  • Verificou se o /etc/apache2/conf.d/charset definiu AddDefaultCharset UTF-8
  • Tentei enviar a saída de log através de um log canalizado para outro programa - seu \xe2\x9c\x94 no momento em que chega lá, então certamente parece que tem algo a ver com o próprio processo do Apache.
  • Leia o o Apache registra os documentos

Por fim, quero que o log de acesso mostre algo como:

mas eu estou puxando meu cabelo tentando chegar lá.

Outras informações

  • Apache versão 2.4.10
  • Debian 8.4

Atualizar

Por sugestão de Per Esa, eu modifiquei a diretiva LogFormat :

LogFormat "%{some_value}n ✔" custom_format

E recebo o seguinte:

\xe2\x9c\x94 ✔

O que é interessante, porque sugere a disposição do Apache para registrar o UTF-8. No entanto, ainda não estou convencido de que o problema tenha algo a ver com o PHP passar valores não UTF-8.

  apache_note('some_value', '✔');
  $value = apache_note('some_value');
  print_r($value);

no PHP ainda imprime

Vou tentar recompilar o Apache para ver se ele ajuda, mas eu preciso disso na produção, que pode ser arriscada.

    
por Bill Huertas 01.06.2017 / 16:06

2 respostas

1

O registro em log escapado é um recurso

Starting from 2.0.49, the Apache logging API escapes everything that goes to error_log, therefore if you're annoyed by this feature during the development phase (as your error messages will be all messed up) you can disable the escaping during the Apache build time:

% CFLAGS="-DAP_UNSAFE_ERROR_LOG_UNESCAPED" ./configure ...

Do not use that CFLAGS in production unless you know what you are doing.

    
por 01.06.2017 / 17:56
1

Você descobrirá que ele escapou em ap_escape_logitem. Dê uma olhada no código a seguir. Ele usa uma macro chamada TEST_CHAR para determinar quais necessidades escaparam, mas a saída é basicamente ASCII

link

    
por 02.06.2017 / 05:24