2

log4php用来记录消息php。我有以下xml配置

<configuration xmlns="http://logging.apache.org/log4php/">
    <appender name="myAppender" class="LoggerAppenderFile">
        <layout class="LoggerLayoutPattern">
            <param name="conversionPattern" value="%d{Y-m-d H:i:s} %c %-5p %F %L %m%n" />
        </layout>
        <param name="file" value="myLog.log" />
    </appender>

    <root>
        <level value="TRACE" />
        <appender_ref ref="myAppender" />
    </root>
</configuration>

相关部分是

<param name="conversionPattern" value="%d{Y-m-d H:i:s} %c %-5p %F %L %m%n" />

%F是获取文件名的说明符。这是将消息记录到日志文件中。这是一个示例记录的消息:

2012-09-23 22:15:04 myLog 致命 /media/study/code/live/public_html/log.php 18 我的消息。

问题

我只想显示文件名(log.php在这种情况下)而不是文件的完整路径(/media/study/code/live/public_html/log.php)。已搜索Apache 文档和 SO,但在此参考中找不到任何内容。

任何提示如何实现这一目标?

4

2 回答 2

4

只需添加一点代码帮助即可完成此任务。

毫不奇怪,模式布局被配置layouts/LoggerLayoutPattern.php并具有一个冗长的数组protected static $defaultConverterMap,该数组定义了转换模式中理解的所有模式。如您所见,字母“F”与 中的LoggerPatternConverterFile类相关联patterns/LoggerPatternConverterFile.php。快速浏览显示:

public function convert(LoggerLoggingEvent $event) {
    return $event->getLocationInformation()->getFileName();
}

这就是导致完整文件路径的原因。添加对 basename() 函数的调用将返回所需的结果,但请注意,这不会在 Log4PHP 更新后继续存在。不过,您可以添加它,然后就完成了。

如果您想要持久更改,则必须扩展上述两个类并将它们添加到您自己的自动加载或包括:

首先扩展 LoggerPatternConverterFile。这将为您带来相关文件的基本名称:

class LoggerPatternConverterFileBasename extends LoggerPatternConverterFile
{
    public function convert(LoggerLoggingEvent $event) {
      return basename(parent::convert($event));
    }
}

二扩展LoggerLayoutPattern类

class YourLoggerLayoutPattern extends LoggerLayoutPattern {
  public function __construct() {
    parent::__construct();
    $this->converterMap['f'] = 'LoggerPatternConverterFileBasename';
  }
}

这样,您刚刚定义了“小写字母 f”,您只会看到文件的基本名称。

在您的配置中,您只需使用更改后的转换字符串引用这个新的 YourLoggerLayoutPattern 类。

此更改应在 log4php 更新后继续存在。

于 2012-10-12T23:06:41.533 回答
2

正如斯文在他的回答中所解释的那样,这将需要一个简单的努力。但是我想出了一个解决方法,如下所示:

不要conversionPattern在 log4php 配置中放入任何文件格式,而是将文件名作为 php.ini 的初始部分传递。所以,代码

log4php 配置:

'conversionPattern' => '%d{H:i:s Y-m-d} %c %-5p - %m%n'

然后在 php 中将其称为:

$log->info(basename($_SERVER['PHP_SELF']).":".__LINE__": Your message/debug details here");

所以,如果你能接受这种格式(而且你总是卡在中间显示文件名),这将是一个很好的解决方法。

于 2012-10-23T17:22:23.633 回答