LoginSignup
1
1

More than 3 years have passed since last update.

log4php:LoggerAppenderSyslog のバグに対応する

Posted at

log4php とは

apache公式

php版ログモジュール。
以下の設定が可能

  • ログ出力先
  • ログフォーマット
  • ログレベル
  • ローテーション

LoggerAppenderSyslog とは

LoggerAppenderSyslog 公式

linuxの場合は、システムログに出力する
windowsの場合は、イベントログに出力する

phpはシステムログに出力する関数 syslog があるので、LoggerAppenderSyslog を使わなくてもよいが、ログ設定を一つに纏めたいから使う。

準備

ファイル構成

  • index.php
  • log4php.xml
  • composer.json
  • composer.phar
index.php
<?php
require 'vendor/autoload.php';
Logger::configure('log4php.xml');

$logger = Logger::getLogger('syslog');

$msg = '12345678901234567890';
$logger->error($msg);
log4php.xml
<?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>
composer.json
{
    "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";

やれやれだぜ

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1