Php log4ppp-将布局模式设置为显示文件名

Php log4ppp-将布局模式设置为显示文件名,php,logging,filenames,log4php,pattern-layout,Php,Logging,Filenames,Log4php,Pattern Layout,我正在使用log4ppp在php中记录消息。我有以下xml配置 <configuration xmlns="http://logging.apache.org/log4php/"> <appender name="myAppender" class="LoggerAppenderFile"> <layout class="LoggerLayoutPattern"> <param name="conversi

我正在使用
log4ppp
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>

但是在这个参考资料中找不到任何东西


如何实现这一点有什么提示吗?

只需添加一些代码,就可以完成这项任务

模式布局是在
layouts/LoggerLayoutPattern.php
中配置的,并且有一个长数组
受保护的静态$defaultConverterMap
,它定义了转换模式中理解的所有模式。如您所见,字母“F”与
patterns/LoggerPatternConverterFile.php
中的
LoggerPatternConverterFile
类链接。快速浏览会发现:

public function convert(LoggerLoggingEvent $event) {
    return $event->getLocationInformation()->getFileName();
}
这就是导致完整文件路径的原因。添加对basename()函数的调用将返回所需的结果,但请注意,这不会在更新log4ppp后继续存在。不过,您可以添加它,这样就完成了

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

首先扩展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类


此更改应在Log4HP更新后继续进行。

正如Sven在其回答中所解释的,这需要简单的努力。但我找到了一个解决办法,如下所示:

不要在log4ppp配置中的
conversionPattern
中放置任何文件格式,而是从php中传递文件名作为初始部分。那么,代码呢

Log4HP配置: 然后在php中,将其称为:

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

这样,如果你可以使用这种格式(而且你也会一直坚持在中间显示文件名),这将是一个很好的工作。

嘿,谢谢你的解决方案,付出了巨大的努力。我找到了一个简单的解决方法。我很快就要发帖了。但你的解决方案也有效:)@mtk我喜欢斯文的答案,但我也渴望看到你的答案。你会很快发布吗?@wmar已经发布了。请查收。抱歉耽搁了,我忘了这件事。我觉得这里有点作弊,但有创造性的解决办法。糟糕的是,如果需要在多个地方创建日志消息,您必须一次又一次地添加整个日志消息的创建。我有自己的日志函数(其中有log4ppp的日志),它被调用而不是这个log语句。但是是的,这也需要至少传递文件名作为参数。
'conversionPattern' => '%d{H:i:s Y-m-d} %c %-5p - %m%n'
$log->info(basename($_SERVER['PHP_SELF']).":".__LINE__": Your message/debug details here");