我希望能够在我的日志文件中记录类文件和行号,因此我使用以下配置...
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--etc-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level (%file:%line) %logger => %message%newline" />
</layout>
</appender>
然而,%file属性使得我的日志文件条目太长而无法轻松阅读....
2009-08-07 16:41:55,271 [7] INFO (O:\mystream\aevpallsrv\DotNet\com.mycompany.au\myapp\Myappp\Controller.cs:75) MyApp.Controller => Controller.EnqueueWorkerThreads() - START
有没有办法只显示类文件('Controller.cs')而不是文件的完整路径???
迈克尔
答案 0 :(得分:5)
虽然您询问文件名,但我相信您可以使用 %type 来获取完全限定的类型名称(a.b.className)。如果您只想要班级名称,请使用 %type {1}
请注意,生成调用者信息(%文件和%类型)的任何方法都会产生与之相关的性能成本。
另外,您可以通过使用类型名称命名Logger来绕过性能损失。
namespace MyNamespace
{
public class Foo
{
private static ILog log = LogManager.GetLogger(typeof(Foo));
}
}
您的转化模式如下:
"%date [%thread] %-5level %logger %message"
您的记录器位于“ MyNameSpace.Foo ”的位置。同样,如果您只需要类名,请使用“%logger {1} ,它将解析为” Foo “。
此方法的最大优势之一是您可以利用log4net的分层存储库系统来调整每种类型的日志记录级别:
<!-- all classes in MyNamespace are warn -->
<logger name="MyNamespace">
<level value="WARN" />
</logger>
<!-- only Foo is in debug -->
<logger name="MyNamespace.Foo">
<level value="DEBUG" />
</logger>
答案 1 :(得分:2)
开箱即用,PatternLayout仅支持%文件令牌。你可以做的是继承PatternLayout并添加你自己的模式,比如%filename,对于这个标记只输出文件的名称。