log4net特定类应使用appender

时间:2014-02-03 19:44:47

标签: c# .net log4net

我想为一个特定的域类设置一个特定的appender。 当其他类记录某些内容时,不应使用此特定的附加程序记录。

例如,来自以下类的日志应使用'OperationalLogFile'。 其他一切都不会使用这个附加器。

public class OperationalLogFileAppender
{
  private readonly ILog _log = LogManager.GetLogger("OperationalLogFile");

  public void AppendServiceStartup()
  {
     var text = ..;
     _log.Info(text);
  }
}

我的log4net配置部分看起来像这样

log4net>
  <root>
     <level value="DEBUG" />
     <appender-ref ref="OtherAppender" />
     <appender-ref ref="OperationalLogFile" />
  </root>

  <appender name="OperationalLogFile" type="log4net.Appender.RollingFileAppender">
     <file value="OperationalLogFileName" />
     <appendToFile value="true"/>
     <countDirection value="-1"/>
     <rollingStyle value="Date" />
     <datePattern value="ddMMyyyy'.log'" />
     <maxSizeRollBackups value="0" />
     <maximumFileSize value="10000KB" />
     <staticLogFileName value="false" />
     <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
     </layout>
     <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="MyNameSpace.OperationalLogFileAppender" />
     </filter>
  </appender>

  <logger name="MyNameSpace.OperationalLogFileAppender">
     <level value="INFO"/>
     <appender-ref ref="OperationalLogFile"/>
  </logger>

但是我登录我的应用程序的所有内容都显示在操作记录文件中,但我希望只有OperationalLogFileAppender记录的内容才会显示在操作日志文件中。

2 个答案:

答案 0 :(得分:4)

您可以创建多个appender并使用Log4Net Filters修饰它们,以包含您想要的特定记录器或记录器。

您需要的特定过滤器是LoggerMatchFilter - 您可以通过string.StartsWith()提供与记录器名称匹配的字符串。匹配记录器作为appender的数据源包含或排除。这就是为什么log4net建议记录器的命名约定是让每个类实例化它自己的logger instancej,用类的完全限定类型名称命名它(Type.FullName):

class Widget
{
  static ILogger log = LogManager.GetLogger(typeof(Widget)) ;
  . . .
}

创建一个记录器,其名称是该类的完全限定名称。请注意,记录器不必是静态属性:记录器可以动态实例化而不是静态实例化:只创建一个具有给定名称的记录器实例。

这个概念是整个应用程序只能记录高级别事件。如果出现问题,在应用程序运行时,您可以调整log4net配置,以便在较低级别的日志记录中一直拨到类级别。

有关http://logging.apache.org/log4net/release/manual/configuration.html

的log4net配置的更多信息

以下是关于过滤器的一些小教程:http://www.beefycode.com/post/log4net-tutorial-pt-7-filters.aspx

答案 1 :(得分:1)

您可以通过使用自定义级别

来执行此操作
private static readonly log4net.Core.Level _customLevel=new
log4net.Core.Level(50000,"Custom");

public void Init()
{
    log4net.Util.LogLog.InternalDebugging=true;
    log4net.LogManager.GetRepository().LevelMap.Add(_customLevel);
}

public void WriteToLog(string message)
{
    log.Logger.log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType,_customLevel,message,null);
}