Configuración de código puro log4net con filtro en c #

Estoy tratando de configurar Log4Net únicamente por código, pero cuando lo hice con una configuración mínima, me inundaron los mensajes de registro desde NHibernate y la interfaz fluida.

Entonces, lo que estoy tratando de hacer es simple. Dile a Log4Net que me muestre solo los mensajes de registro de mi clase única. Jugué un poco, pero no puedo entenderlo …

¿Alguien puede ayudar? Creo que el siguiente código ilustra mi idea:

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); 

Ok, gracias por su ayuda, pero debe haber algún problema aquí. Pero me acerco más. Probé la configuración XML, que tiene mucha más documentación. Y logré el resultado deseado utilizando la siguiente configuración XML. Debe haber alguna configuración incorrecta en la versión de “código puro” de arriba.

La siguiente configuración XML proporciona la salida “correcta”, que no es la misma que la configuración en el código anterior. ¿Alguien ve la diferencia?

               

Lo descubrí … A veces, solo escribirlo abre los ojos …

  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); 

Mira lo que faltaba 🙂 El filtro denyALL !!

Algunos ejemplos de código más:

  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; } 

Realmente UGLY pero trabajando (arruina el resaltado, no te pierdas las últimas líneas):

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

Aquí hay una forma diferente de configurar log4net con XML a través del código usando XmlDocument para cargar el xml. La diferencia con el ejemplo de Christian es que estoy usando la sobrecarga XmlConfigurator.Configure que toma un XmlElement como parámetro. También utilicé marcas de verificación simples en lugar de duplicar las comillas dobles. Con todo, creo que es un poco más limpio.

  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); 

Los siguientes códigos funcionan sobre cómo configurar AdoNetAppender en códigos. Si desea agregar un filtro, debe agregar una instancia de filtro en la instancia de appender en el método GetAppender (). Para utilizar el registrador en su aplicación, se recomienda usar la dependency injection para aislar la implementación y la interfaz del registrador. Además, use el concepto de scope DI para hacer que sea único para evitar la recreación de objetos. Nota: la clase CrmConfigHelper se utiliza para obtener acceso a la sección de ajustes de la aplicación del archivo de configuración de la aplicación.

Las muestras de códigos se muestran a continuación.

 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); } }