我使用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 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");
因此,如果你可以使用这种格式(而且你总是在中间显示文件名),这将是一个很好的解决方案。