log4php-设置布局模式以显示文件名



我使用log4phpphp中记录消息。我有以下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 FATAL/media/studie/code/live/public_html/log.php 18我的消息。

问题

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

有什么提示可以实现吗?

只需添加一些代码就可以完成此任务。

毫不奇怪,图案布局是在layouts/LoggerLayoutPattern.php中配置的,并且具有定义转换图案中理解的所有图案的长阵列protected static $defaultConverterMap。如您所见,字母"F"与patterns/LoggerPatternConverterFile.php中的LoggerPatternConverterFile类链接。快速浏览即可发现:

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后仍然有效。

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

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

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

因此,如果你可以使用这种格式(而且你总是在中间显示文件名),这将是一个很好的解决方案。

最新更新