使用c#中的filter的log4net纯代码配置

我试图完全按代码配置Log4Net,但是当我使用最小配置时,我被NHibernate和流畅的界面记录消息所淹没。

所以,我想做的很简单。 告诉Log4Net只显示我的单个类的日志消息。 我玩弄了一下,但无法搞清楚……

任何人都可以提供帮助,我认为以下代码说明了我的想法:

var filter = new log4net.Filter.LoggerMatchFilter(); filter.LoggerToMatch = typeof(DatabaseDirectory).ToString(); filter.AcceptOnMatch = false; var x = new log4net.Appender.ConsoleAppender(); x.Layout = new log4net.Layout.SimpleLayout(); x.AddFilter(filter); log4net.Config.BasicConfigurator.Configure(x); 

好的,谢谢你的帮助,但这里肯定有一些问题。 但我越来越近了。 我尝试了XML配置,它有更多的文档。 我设法使用以下XML配置实现了所需的结果。 上面的“纯代码”版本中必定存在一些错误配置。

以下XML配置提供“正确”输出,这与上面代码中的配置不同。 有谁看到了差异?

               

我想通了..有时候,只要把它写下来就会打开你的眼睛……

  var filter = new log4net.Filter.LoggerMatchFilter(); filter.LoggerToMatch = typeof(DatabaseDirectory).ToString(); filter.AcceptOnMatch = true; var filterDeny = new log4net.Filter.DenyAllFilter(); var x = new log4net.Appender.ConsoleAppender(); x.Layout = new log4net.Layout.SimpleLayout(); x.AddFilter(filter); x.AddFilter(filterDeny); log4net.Config.BasicConfigurator.Configure(x); 

看看缺少什么:-) denyALLfilter!!

一些代码示例:

  public static void AllToConsoleSetup() { var x = new log4net.Appender.ConsoleAppender { Layout = new log4net.Layout.SimpleLayout() }; log4net.Config.BasicConfigurator.Configure(x); SetupDone = true; } public static void ShowOnlyLogOf(Type t) { var filter = new log4net.Filter.LoggerMatchFilter {LoggerToMatch = t.ToString(), AcceptOnMatch = true}; var filterDeny = new log4net.Filter.DenyAllFilter(); var x = new log4net.Appender.ConsoleAppender {Layout = new log4net.Layout.SimpleLayout()}; x.AddFilter(filter); x.AddFilter(filterDeny); log4net.Config.BasicConfigurator.Configure(x); SetupDone = true; } 

非常UGLY但工作(它搞砸了突出显示,不要错过最后一行):

  public static void DefaultSetup() { // AllToConsoleSetup(); XmlConfigurator.Configure(XmlSetup()); // DbConfig(); } private static Stream XmlSetup() { const string x = @"                                                             "; return new MemoryStream(ASCIIEncoding.Default.GetBytes(x)); } 

下面是使用XmlDocument加载xml,通过代码使用XML配置log4net的方法。 与Christian的例子的不同之处在于我使用XmlConfigurator.Configure重载,它将XmlElement作为参数。 我也使用单刻度标记而不是加倍双引号。 总而言之,我认为这是最小巧的一点。

  string xml = @"                                     "; // // Use XmlDocument to load the xml string then pass the DocumentElement to // XmlConfigurator.Configure. // XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); log4net.Config.XmlConfigurator.Configure(doc.DocumentElement); 

以下代码适用于如何在代码中配置AdoNetAppender。 如果要添加filter,则需要在GetAppender()方法中的appender实例上添加filter实例。 为了在应用程序中使用logger,建议使用dependency injection来隔离记录器实现和接口。 另外,使用DI范围概念使其成为单例以避免对象重新创建。 注意:CrmConfigHelper类用于访问应用程序配置文件appSettings部分。

代码示例如下所示

 public sealed class SqlLogger:ILogger { private ILog _logger; public SqlLogger() { log4net.Config.BasicConfigurator.Configure(GetAppender()); this._logger = log4net.LogManager.GetLogger(CrmConfigHelper.GetString(Constants.LOG4NET_LOGGER_NAME)); } private log4net.Appender.AdoNetAppender GetAppender() { log4net.Appender.AdoNetAppender appender = new log4net.Appender.AdoNetAppender(); appender.ConnectionType = CrmConfigHelper.GetString(Constants.LOG4NET_CONNECTION_TYPE); appender.ConnectionString = CrmConfigHelper.GetString(Constants.LOG4NET_DB_CONNECTION); appender.BufferSize = CrmConfigHelper.getInteger(Constants.LOG4NET_BUFFER_SIZE); appender.CommandText = "INSERT INTO [EventLog] ([Date],[HostName],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @hostname, @log_level, @logger, @message,@exception)"; appender.CommandType = System.Data.CommandType.Text; appender.AddParameter(new log4net.Appender.AdoNetAppenderParameter() { ParameterName = "@log_date", DbType = System.Data.DbType.DateTime, Size = 100, Layout = new RawLayoutConverter().ConvertFrom(new PatternLayout("%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}")) as IRawLayout }); appender.AddParameter(new log4net.Appender.AdoNetAppenderParameter() { ParameterName = "@hostname", DbType = System.Data.DbType.String, Size = 50, Layout = new RawLayoutConverter().ConvertFrom(new PatternLayout("%property{log4net:HostName}")) as IRawLayout }); appender.AddParameter(new log4net.Appender.AdoNetAppenderParameter() { ParameterName = "@log_level", DbType = System.Data.DbType.String, Size = 50, Layout = new RawLayoutConverter().ConvertFrom(new PatternLayout("%level")) as IRawLayout }); appender.AddParameter(new log4net.Appender.AdoNetAppenderParameter() { ParameterName = "@logger", DbType = System.Data.DbType.String, Size = 50, Layout = new RawLayoutConverter().ConvertFrom(new PatternLayout("%logger")) as IRawLayout }); appender.AddParameter(new log4net.Appender.AdoNetAppenderParameter() { ParameterName = "@message", DbType = System.Data.DbType.String, Size = 4000, Layout = new RawLayoutConverter().ConvertFrom(new PatternLayout("%message")) as IRawLayout }); appender.AddParameter(new log4net.Appender.AdoNetAppenderParameter() { ParameterName = "@exception", DbType = System.Data.DbType.String, Size = 2000, Layout = new RawLayoutConverter().ConvertFrom(new ExceptionLayout()) as IRawLayout }); appender.ActivateOptions(); return appender; } public void Error(Message context) { _logger.Error(context.ToJsonString()); } public void Error(Message context, Exception exception) { _logger.Error(context.ToJsonString(), exception); } public void Warn(Message context) { _logger.Warn(context.ToJsonString()); } public void Warn(Message context, Exception exception) { _logger.Warn(context.ToJsonString(), exception); } public void Info(Message context) { _logger.Info(context.ToJsonString()); } public void Info(Message context, Exception exception) { _logger.Info(context.ToJsonString(), exception); } } public interface ILogger { void Error(Message context); void Error(Message context, Exception exception); void Warn(Message context); void Warn(Message context, Exception exception); void Info(Message context); void Info(Message context, Exception exception); } public sealed class Message { public string RunDate { get; set; } public string RunBy { get; set; } public string Message { get; set; } public string ToJsonString() { return new JavaScriptSerializer().Serialize(this); } }