我想为一个特定的域类设置一个特定的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记录的内容才会显示在操作日志文件中。
答案 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);
}