Why this log4php config leads to outputting duplicates in log files

257 views Asked by At

I have log4php config which contain appenders for each level in it's particular file like this:

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

And the following php code:

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

And when I run php code every files are created and log is written for each file by level as expected, BUT every log line is duplicated like so:

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

What am I doing wrong?

UPDATE

Also tried Monolog logger but had same issue, looks like something wrong with class loading. I'm using composer which config has next lines:

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

And I have htaccess where I redirect traffic to index php, where I initialize App class (which is not in src). In that class I just invloke next code:

$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");

May be something wrong with how I use composer?

1

There are 1 answers

0
GALIAF95 On

So in my particular case I had wrong .htaccess file which will load not only page I need but also load pages like favico.php.

Before:

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

After:

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

Just changed patterns for matching routes which will not contain dots.