log4php とは
php版ログモジュール。
以下の設定が可能
- ログ出力先
- ログフォーマット
- ログレベル
- ローテーション
LoggerAppenderSyslog とは
linuxの場合は、システムログに出力する
windowsの場合は、イベントログに出力する
phpはシステムログに出力する関数 syslog があるので、LoggerAppenderSyslog を使わなくてもよいが、ログ設定を一つに纏めたいから使う。
準備
ファイル構成
- index.php
- log4php.xml
- composer.json
- composer.phar
<?php
require 'vendor/autoload.php';
Logger::configure('log4php.xml');
$logger = Logger::getLogger('syslog');
$msg = '12345678901234567890';
$logger->error($msg);
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="mySyslog" class="LoggerAppenderSyslog">
<param name="facility" value="USER" />
<param name="option" value="PID" />
</appender>
<logger name="syslog">
<appender_ref ref="mySyslog" />
</logger>
</configuration>
{
"require": {
"apache/log4php": "2.3.0"
}
}
composer.phar は 公式からwget
wget https://getcomposer.org/download/1.8.6/composer.phar
2019-06-11 時点
LoggerAppenderSyslog バグの再現
$ php composer.phar install
$ php index.php
$ tail -f /var/log/message
Jun 26 23:05:20 hostname journal: Apache log4php[30746]: ERROR - 12345678901234567890
Jun 26 23:05:20 hostname journal: Apache log4php[30746]: 901234567890
2行出力されてるやん!しかも、
文字切れてる
設定変えたら直る予想は空振り。facility を変えると文字切れする位置が変わる怪現象に遭遇するおまけつき。
index.php でsyslogしても1行しか表示されないので、log4phpが原因なのは確定。
mb_string は空振り。調べてもわからなかったので、覚悟を決めて探検することに。
vendor\apache\log4php を探検
イベントぽい LoggerLoggingEvent.php があったから、ログ出力とイベントで2回という予想は空振り。かくかくしかじかで、
vendor\apache\log4php\src\main\php\appenders\LoggerAppenderSyslog.php->append の、syslogで2行出力されることが分かったが、原因は不明
解決策
メッセージをnull文字で終端したら直った
$msg = '12345678901234567890';
↓
$msg = '12345678901234567890'."\0";