2009-05-19 15 views
13

Log4Netをコードで構成しようとしていますが、最小限の構成では、NHibernateと流暢なインターフェイスからログメッセージが流入してしまいました。log4netの純粋なコード構成でフィルタをC#

私がやっていることは簡単です。 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); 

[OK]を、おかげで、しかし、私は少しの周りにおもちゃに、しかし...

それを把握することはできません誰でも助けることができる、私は次のコードは、私の考えを示していると思いますここに問題があるはずです。しかし、私は近づく。 XML構成を試しましたが、これにはさらに多くのドキュメントがあります。そして、私は以下のXML設定を使用して目的の結果を達成することができました。上記の「純粋なコード」バージョンにはいくつかの設定ミスがある必要があります。

次のXML構成では、「正しい」出力が提供されますが、これは上記のコードの構成とは異なります。誰に違いが見えますか?

<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

の下に表示されています。 NHibernateを使わずにロギングを試しましたか?自分のロガーのうち2つだけを受け取り、受け入れられて1つが拒否されているかどうかを確認しましたか?あなたは少なくともNHibernateを除外することができますようにその方法。 –

答えて

9

私は...ちょうどあなたの目を開き、それを書き留めて、時には..

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

denyALLフィルター:-)欠けていたものを参照してください。それを考え出しました!

いくつかのより多くのコード例:(そのねじアップハイライトは、最後の行を逃してはいけない)

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 = @" <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

キリスト教 - あなただけのコードを使用してlog4netを設定するための任意のリソースを指すことができますか?(log4net初心者が使用できる) –

+0

申し訳ありませんが、ここには実際のリンクはありません。 Layout.SimpleLayoutのようなスニペットの部分を検索してみてください...上のポストにコードをいくつか追加します。 –

+0

クリスチャンに感謝します。とても有難い。 –

5

がでlog4netのを設定するためのanohter方法ですxmlを読み込むためにXmlDocumentを使ってコードを使ってXMLを作成します。 Christianの例との違いは、XmlElementをパラメータとするXmlConfigurator.Configure過負荷を使用していることです。二重引用符を倍にするのではなく、一重の目盛りも使用しました。全体的に、私はそれが最も小さいビットクリーナーだと思う。

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

次のコードは、コードにAdoNetAppenderを設定する方法に関係しています。フィルタを追加する場合は、GetAppender()メソッドのアペンダインスタンスにフィルタインスタンスを追加する必要があります。アプリケーションでロガーを使用するには、ロガーのインプリメンテーションとインターフェースを分離するために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); 
    } 
} 
+1

CrmConfigHelperとは何ですか? – Phil

+0

@ Phil:プロジェクトの設定ファイルから情報を取得するものです。個人的には、私はおそらくその情報をパラメータとして渡して、SQLLoggerがプロジェクトについて何も知る必要がないようにします。これを独立した別のプロジェクトに分割し、ロギングを有効にするプロジェクトがあればそれを参照するだけです。 – Ellesedil

+0

@Ellesedil著者はCrmConfigHelperの解説を更新しました。それでも、ありがとう。 – Phil

関連する問題