如何在没有log4net路径的情况下记录Class文件

时间:2009-08-07 06:56:44

标签: configuration logging log4net

我希望能够在我的日志文件中记录类文件和行号,因此我使用以下配置...

<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')而不是文件的完整路径???

迈克尔

2 个答案:

答案 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,对于这个标记只输出文件的名称。