Почему эта конфигурация log4php приводит к выводу дубликатов в файлах журнала

У меня есть конфигурация log4php, которая содержит приложения для каждого уровня в определенном файле, например:

<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="info" class="LoggerAppenderRollingFile">
<layout class="LoggerLayoutPattern">
<param name="conversionPattern" value="%date %logger %-5level %msg%n"/>
</layout>
<param name="file" value="../app/logs/info.log"/>
<param name="append" value="true"/>
<param name="maxFileSize" value="100MB"/>
<param name="maxBackupIndex" value="1"/>
<filter class="LoggerFilterLevelRange">
<param name="levelMin" value="info"/>
<param name="levelMax" value="info"/>
</filter>
</appender>
<appender name="warn" class="LoggerAppenderRollingFile">
<layout class="LoggerLayoutPattern">
<param name="conversionPattern" value="%date %logger %-5level %msg%n"/>
</layout>
<param name="file" value="../app/logs/warn.log"/>
<param name="append" value="true"/>
<param name="maxFileSize" value="100MB"/>
<param name="maxBackupIndex" value="1"/>
<filter class="LoggerFilterLevelRange">
<param name="levelMin" value="warn"/>
<param name="levelMax" value="warn"/>
</filter>
</appender>
<appender name="error" threshold="error" class="LoggerAppenderRollingFile">
<layout class="LoggerLayoutPattern">
<param name="conversionPattern" value="%date %logger %-5level %msg%n"/>
</layout>
<param name="file" value="../app/logs/error.log"/>
<param name="append" value="true"/>
<param name="maxFileSize" value="100MB"/>
<param name="maxBackupIndex" value="1"/>
<filter class="LoggerFilterLevelRange">
<param name="levelMin" value="error"/>
<param name="levelMax" value="fatal"/>
</filter>
</appender>
<appender name="debug" class="LoggerAppenderRollingFile">
<layout class="LoggerLayoutPattern">
<param name="conversionPattern" value="%date %logger %-5level %msg%n"/>
</layout>
<param name="file" value="../app/logs/debug.log"/>
<param name="append" value="true"/>
<param name="maxFileSize" value="100MB"/>
<param name="maxBackupIndex" value="1"/>
<filter class="LoggerFilterLevelRange">
<param name="levelMin" value="debug"/>
<param name="levelMax" value="debug"/>
</filter>
</appender>
<root>
<level value="debug" />
<appender-ref ref="info"/>
<appender-ref ref="warn"/>
<appender-ref ref="error"/>
<appender-ref ref="debug"/>
</root>
</configuration>

И следующий код php:

Logger::configure('config.xml');
$logger = Logger::getRootLogger();
$logger->warn("test");
$logger->error("test");
$logger->info("test");
$logger->debug("test");

И когда я запускаю php-код, все файлы создаются и журнал записывается для каждого файла по уровням, как и ожидалось, НО каждая строка журнала дублируется следующим образом:

cat logs/info.log
2017-10-01T22:06:44+00:00 root INFO  test
2017-10-01T22:06:44+00:00 root INFO  test

Что я делаю неправильно?

ОБНОВИТЬ

Также пробовал Monolog logger, но имел ту же проблему, похоже, что-то не так с загрузкой классов. Я использую композитор, конфиг которого имеет следующие строки:

{
"require": {
"monolog/monolog": "1.23.0"},
"autoload": {
"psr-4": {
"App\\": "src"}
}
}

И у меня есть htaccess, где я перенаправляю трафик на индекс php, где я инициализирую класс App (которого нет в src). В этом классе я просто задействую следующий код:

$this->logger = new Logger('default');
$this->logger->pushHandler(new StreamHandler(LOGS_DIR . 'info.log', Logger::INFO));
$this->logger->pushHandler(new StreamHandler(LOGS_DIR . 'error.log', Logger::ERROR));
$this->logger->pushHandler(new StreamHandler(LOGS_DIR . 'debug.log', Logger::DEBUG));

$this->logger->error("error");
$this->logger->info("info");
$this->logger->debug("debug");

Может быть что-то не так с тем, как я использую композитор?

1

Решение

Так что в моем конкретном случае у меня был неправильный файл .htaccess, который загружает не только нужную мне страницу, но и страницы, такие как favico.php.

До:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9\/^\.]+)$ index.php [QSA,L]

После:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ index.php [QSA,L]

Просто изменили шаблоны для соответствия маршрутов, которые не будут содержать точек.

1

Другие решения

Других решений пока нет …