2009-05-19 10 views
13

Je suis en train de configurer Log4Net uniquement par le code, mais quand je l'ai fait avec une configuration minimale, j'envahies par la journalisation des messages de NHibernate et l'interface fluide.log4net configuration pure code avec filtre C#

Alors, ce que je suis en train de faire est simple. Dites à Log4Net de ne montrer que les messages de mon cours individuel. Je jouai autour d'un peu, mais ne peut pas le comprendre ...

Quelqu'un peut-il aider, je pense que le code suivant illustre mon idée:

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, merci pour votre aide, mais il doit être un problème ici. Mais je me rapproche. J'ai essayé la configuration XML, qui a beaucoup plus de documentation. Et j'ai réussi à atteindre le résultat souhaité en utilisant la configuration XML suivante. Il doit y avoir une mauvaise configuration dans la version "code pur" ci-dessus.

La configuration XML suivant fournit la sortie « correcte », ce qui est la même que la configuration dans le code ci-dessus. Quelqu'un voit la différence?

<log4net> 
<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="ConsoleAppender" /> 
</root> 
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > 
    <filter type="log4net.Filter.LoggerMatchFilter"> 
    <loggerToMatch value="Examples.FirstProject.Entities.DatabaseDirectory"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="[%C.%M] %-5p %m%n" /> 
    </layout> 
</appender> 

+0

Initialement, votre configuration ressemble parfaitement bien. Avez-vous essayé de vous connecter sans NHibernate, seulement deux de vos propres enregistreurs et voir si l'un est accepté et l'autre refusé? De cette façon, vous pourriez au moins exclure NHibernate. –

Répondre

9

I figured it out .. Parfois, il suffit de faire écrire ouvre vos yeux ...

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

Voir ce qui manquait :-) Le filtre DenyAll !!

Quelques exemples de code:

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

vraiment UGLY, mais de travail (il Fout la mise en évidence, ne manquez pas les dernières lignes):

 public static void DefaultSetup() 
    { 
     // AllToConsoleSetup(); 
     XmlConfigurator.Configure(XmlSetup()); 
     // DbConfig(); 

    } 


    private static Stream XmlSetup() 
    { 
     const string x = @" <log4net> 
<root> 

    <level value=""ALL"" /> 
    <appender-ref ref=""AdoNetAppender""> 

    </appender-ref> 
</root> 


<appender name=""AdoNetAppender"" type=""log4net.Appender.AdoNetAppender""> 
    <bufferSize value=""1"" /> 
    <connectionType value=""System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" /> 
    <connectionString value=""data source=Christian-PC\SQLEXPRESS;initial catalog=log4net_2;integrated security=false;persist security info=True;User ID=log4net;Password=XXXX"" /> 
    <commandText value=""INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"" /> 
    <parameter> 
    <parameterName value=""@log_date"" /> 
    <dbType value=""DateTime"" /> 
    <layout type=""log4net.Layout.RawTimeStampLayout"" /> 
    </parameter> 
    <parameter> 
    <parameterName value=""@thread"" /> 
    <dbType value=""String"" /> 
    <size value=""655"" /> 
    <layout type=""log4net.Layout.PatternLayout""> 
     <conversionPattern value=""%thread"" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value=""@log_level"" /> 
    <dbType value=""String"" /> 
    <size value=""50"" /> 
    <layout type=""log4net.Layout.PatternLayout""> 
     <conversionPattern value=""%level"" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value=""@logger"" /> 
    <dbType value=""String"" /> 
    <size value=""655"" /> 
    <layout type=""log4net.Layout.PatternLayout""> 
     <conversionPattern value=""%logger"" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value=""@message"" /> 
    <dbType value=""String"" /> 
    <size value=""4000"" /> 
    <layout type=""log4net.Layout.PatternLayout""> 
     <conversionPattern value=""%message"" /> 
    </layout> 
    </parameter> 
    <parameter> 
    <parameterName value=""@exception"" /> 
    <dbType value=""String"" /> 
    <size value=""2000"" /> 
    <layout type=""log4net.Layout.ExceptionLayout"" /> 
    </parameter> 
    <filter type=""log4net.Filter.LoggerMatchFilter""> 
    <param name=""LoggerToMatch"" value=""Ruppert"" /> 
    </filter> 
    <filter type=""log4net.Filter.DenyAllFilter""> 
    </filter> 
</appender> 
</log4net>"; 
     return new MemoryStream(ASCIIEncoding.Default.GetBytes(x)); 
    } 
+0

Christian - pourriez-vous indiquer des ressources pour la configuration de log4net en utilisant uniquement du code (qu'un utilisateur débutant de log4net pourrait utiliser)? –

+0

Désolé, nous n'avons pas de vrai lien ici. Essayez de rechercher des parties de l'extrait, comme Layout.SimpleLayout ... Je vais ajouter un peu plus de code dans le message ci-dessus .. –

+0

Merci Christian, c'est vraiment utile pour me lancer.Très appréciée. –

5

Voici anohter façon de configurer log4net avec XML via le code en utilisant XmlDocument pour charger le fichier XML. La différence par rapport à l'exemple de Christian est que j'utilise la surcharge XmlConfigurator.Configure qui prend un XmlElement comme paramètre. J'ai également utilisé des graduations individuelles plutôt que de doubler les guillemets. Dans l'ensemble, je pense que c'est le plus petit peu plus propre.

string xml = 
    @"<log4net> 
    <appender name='file1' type='log4net.Appender.RollingFileAppender'> 
     <!-- Log file locaation --> 
     <param name='File' value='log4net.log'/> 
     <param name='AppendToFile' value='true'/> 
     <!-- Maximum size of a log file --> 
     <maximumFileSize value='2KB'/> 
     <!--Maximum number of log file --> 
     <maxSizeRollBackups value='8'/> 
     <!--Set rolling style of log file --> 
     <param name='RollingStyle' value='Composite'/> 
     <param name='StaticLogFileName' value='false'/> 
     <param name='DatePattern' value='.yyyy-MM-dd.lo\g'/> 
     <layout type='log4net.Layout.PatternLayout'> 
     <param name='ConversionPattern' value='%d [%t] %-5p %m%n'/> 
     </layout> 
    </appender> 

    <!-- Appender layout fix to view in console--> 
    <appender name='console' type='log4net.Appender.ConsoleAppender'> 
     <layout type='log4net.Layout.PatternLayout'> 
     <param name='Header' value='[Header]\r\n'/> 
     <param name='Footer' value='[Footer]\r\n'/> 
     <param name='ConversionPattern' value='%d [%t] %-5p %m%n'/> 
     </layout> 
    </appender> 

    <appender name='debug' type='log4net.Appender.DebugAppender'> 
     <layout type='log4net.Layout.PatternLayout'> 
     <param name='ConversionPattern' value='%d [%t] %logger %-5p %m%n'/> 
     </layout> 
    </appender> 
    <root> 
     <level value='INFO'/> 
     <!-- 
      Log level priority in descending order: 

      FATAL = 1 show log -> FATAL 
      ERROR = 2 show log -> FATAL ERROR 
      WARN = 3 show log -> FATAL ERROR WARN 
      INFO = 4 show log -> FATAL ERROR WARN INFO 
      DEBUG = 5 show log -> FATAL ERROR WARN INFO DEBUG 
      --> 
     <!-- To write log in file --> 
     <appender-ref ref='debug'/> 
     <appender-ref ref='file1'/> 
    </root> 

    </log4net>"; 

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

Les codes suivants permettent de configurer AdoNetAppender dans les codes. Si vous voulez ajouter un filtre, vous devez ajouter une instance de filtre sur l'instance d'appender dans la méthode GetAppender(). Pour utiliser l'enregistreur dans votre application, l'injection de dépendances est recommandée pour isoler l'implémentation et l'interface de l'enregistreur. En outre, utilisez le concept DI scope pour le rendre unique afin d'éviter la recréation d'objet. Note: classe CrmConfigHelper est utilisée pour obtenir l'accès à un fichier de configuration d'application section appSettings.

Les échantillons de codes sont indiqués ci-dessous

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

Qu'est-ce que CrmConfigHelper? – Phil

+0

@Phil: On dirait que c'est quelque chose qui va et récupère des informations à partir des fichiers de configuration du projet. Personnellement, j'aurais probablement cette information passée en paramètres afin que le SQLLogger ne soit pas obligé de savoir quoi que ce soit sur le projet. Vous pouvez ensuite diviser le tout en un projet autonome distinct et le référencer dans le projet pour lequel vous souhaitez activer la journalisation. – Ellesedil

+0

@Ellesedil L'auteur a mis à jour la réponse expliquant CrmConfigHelper. Toujours, merci. – Phil