Configuration 如何在log4net中记录没有路径的类文件

Configuration 如何在log4net中记录没有路径的类文件,configuration,logging,log4net,Configuration,Logging,Log4net,我希望能够在我的日志文件中记录类文件和行号,因此我使用以下配置 <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--etc--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-

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

<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>
有没有办法只显示类文件('Controller.cs')而不是文件的完整路径


Michael

开箱即用,PatternLayout仅支持%文件标记。您可以做的是子类PatternLayout并添加您自己的模式,例如%filename,并且对于此令牌,只输出文件名。

尽管您询问的是文件名,但我相信您可以使用%type获得完全限定的类型名(a.b.className)。如果只需要类名,请使用%type{1}

请注意,任何生成调用方信息(%file和%type)的方法都会产生与其相关联的性能代价

另一方面,您可以通过使用类型名命名记录器来绕过性能影响

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>


谢谢Peter,我真的不想在Log4Net中搞混子类化,但我想我会尝试一下。在那里,我可能会尝试自定义RollingLogFileAppender的stoopid文件命名选项。试试吧。将您自己的模式添加到Patternlayout实际上很容易…让我们都知道它是如何进行的。我没有尝试过,但是我想知道%file{1}的工作方式与%type{1}的工作方式相同吗?感谢Bryan。我正在使用类型名称作为记录器名称,这可以正常工作。我发现类和行号信息与我的'Release'配置文件不起作用(我没有发布pdb文件)所以我跳过这些完全是为了我的产品发布。
<!-- 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>