在C#中过滤的log4net纯代码配置 [英] log4net pure code configuration with filter in c#

查看:513
本文介绍了在C#中过滤的log4net纯代码配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想仅仅通过代码来配置log4net的,但是当我用最少的配置那样,我被记录从NHibernate和流利的接口消息淹没了。



所以,我所要做的很简单。告诉log4net的告诉我只记录我的单类的消息。我把玩周围一点点,但不能看着办吧......



谁能帮助,我想下面的代码说明了我的想法:

  VAR过滤器=新log4net.Filter.LoggerMatchFilter(); 
filter.LoggerToMatch = typeof运算(DatabaseDirectory)的ToString();
filter.AcceptOnMatch = FALSE;

变种x =新log4net.Appender.ConsoleAppender();
x.Layout =新log4net.Layout.SimpleLayout();
x.AddFilter(过滤器);

log4net.Config.BasicConfigurator.Configure(X);



好,感谢你的帮助,但必须有一些在这里的问题。但我更接近。我尝试了XML配置,它有更多的文档。与我管理使用以下XML配置以实现所需的结果。必须有在上面的纯代码版本的一些错误配置。



下面的XML配置提供了正确的输出,这是不是比在代码中的配置相同以上。任何人看到差异



<预类=郎咸平的XML prettyprint-覆盖> <&log4net的GT;
<根和GT;
<电平值=DEBUG/>
<附加目的地-REF REF =是ConsoleAppender/>
< /根>
<追加程序名称=是ConsoleAppenderTYPE =log4net.Appender.ConsoleAppender>
<滤波器类型=log4net.Filter.LoggerMatchFilter>
< loggerToMatch值=Examples.FirstProject.Entities.DatabaseDirectory/>
< /滤光器>
<滤波器类型=log4net.Filter.DenyAllFilter/>
<布局类型=log4net.Layout.PatternLayout>
< conversionPattern值=[%C.%M]%-5p%M%N/>
< /布局>
< /附加器>




解决方案

我想通了。有时候,只是把它写下来打开你的眼睛...

  VAR过滤器=新log4net.Filter.LoggerMatchFilter(); 
filter.LoggerToMatch = typeof运算(DatabaseDirectory)的ToString();
filter.AcceptOnMatch = TRUE;

变种filterDeny =新log4net.Filter.DenyAllFilter();


变种x =新log4net.Appender.ConsoleAppender();
x.Layout =新log4net.Layout.SimpleLayout();
x.AddFilter(过滤器);
x.AddFilter(filterDeny);

log4net.Config.BasicConfigurator.Configure(X);

请参阅什么是缺少:-)的denyALL过滤器!



更多的代码示例:

 公共静态无效AllToConsoleSetup()
{
变种x =新log4net.Appender.ConsoleAppender {布局=新log4net.Layout.SimpleLayout()};
log4net.Config.BasicConfigurator.Configure(X);
SetupDone = TRUE;
}


公共静态无效ShowOnlyLogOf(T型)
{
VAR过滤器=新log4net.Filter.LoggerMatchFilter {LoggerToMatch = t.ToString( ),AcceptOnMatch = TRUE};
变种filterDeny =新log4net.Filter.DenyAllFilter();
变种x =新log4net.Appender.ConsoleAppender {布局=新log4net.Layout.SimpleLayout()};
x.AddFilter(过滤器);
x.AddFilter(filterDeny);

log4net.Config.BasicConfigurator.Configure(X);
SetupDone = TRUE;
}



真难看,但工作(它搞砸了高亮,不要错过最后的线):

 公共静态无效DefaultSetup()
{
// AllToConsoleSetup();
XmlConfigurator.Configure(XmlSetup());
// DBCONFIG();

}


私有静态流XmlSetup()
{
常量字符串x = @< log4net的>
<根>

<电平值=ALL/>
<附加目的地-REF REF =AdoNetAppender>

< /附加目的地-REF>
< /根>


<追加程序的名称=AdoNetAppender,TYPE =log4net.Appender.AdoNetAppender >
< BUFFERSIZE值=1/>
< connectionType值=System.Data.SqlClient.SqlConnection,System.Data这,版本= 1.0.3300.0,文化=中性公钥= b77a5c561934e089/>
<连接字符串值=数据源=基督教PC\SQLEXPRESS;初始目录= log4net_2;集成安全性= FALSE;坚持安全信息= TRUE;用户ID = log4net的;密码= XXXX/>
< CommandText中值=INSERT INTO日志([日期],[主题],[等级],[记录器],[信息],[例外])VALUES (@log_date,@thread,@log_level,@Logger,@message,抛出)/>
<参数>
<参数名称值=@ LOG_DATE/>
< D​​BTYPE值=日期时间/>
<布局类型=log4net.Layout.RawTimeStampLayout/>
< /参数>
<&参数GT;
<参数名称值=@丝/>
< D​​BTYPE值=串/>
<大小值=655/>
<布局类型=log4net.Layout.PatternLayout>
< conversionPattern值=%线程/>
< /布局>
< /参数>
<&参数GT;
<参数名称值=@ LOG_LEVEL/>
< D​​BTYPE值=串/>
<大小值=50/>
<布局类型=log4net.Layout.PatternLayout>
< conversionPattern值=%的水平,/>
< /布局>
< /参数>
<&参数GT;
<参数名称值=@记录仪,/>
< D​​BTYPE值=串/>
<大小值=655/>
<布局类型=log4net.Layout.PatternLayout>
< conversionPattern值=%记录仪,/>
< /布局>
< /参数>
<&参数GT;
<参数名称值=@消息/>
< D​​BTYPE值=串/>
<大小值=4000/>
<布局类型=log4net.Layout.PatternLayout>
< conversionPattern值=%消息/>
< /布局>
< /参数>
<&参数GT;
<参数名称值=@异常/>
< D​​BTYPE值=串/>
<大小值=2000/>
<布局类型=log4net.Layout.ExceptionLayout/>
< /参数>
<滤波器类型=log4net.Filter.LoggerMatchFilter>
< PARAM NAME =LoggerToMatch值=鲁珀特/>
< /滤光器>
<滤波器类型=log4net.Filter.DenyAllFilter>
< /滤光器>
< /附加器>
< / log4net的>中,
返回新的MemoryStream(ASCIIEncoding.Default.GetBytes(X));
}


I am trying to configure Log4Net purely by code, but when I did with a minimal configuration, I was flooded by logging messages from NHibernate and the fluent interface.

So, what I am trying to do is simple. Tell Log4Net to show me only log messages of my single class. I toyed around a little bit, but can't figure it out...

Can anyone help, I think the following code illustrates my 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, thanks for your help, but there must be some issue here. But I get closer. I tried the XML configuration, which has much more documentation. And I managed to achieve the desired result using the following XML configuration. There must be some misconfiguration in the "pure code" version above.

The following XML configuration provides the "correct" output, which is not the same than the config in code above. Anybody sees the difference?

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

解决方案

I figured it out.. Sometimes, just writing it down opens your eyes...

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

See what was missing :-) The denyALL filter!!

Some more code examples:

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

Really UGLY but working (it screws up the highlighting, do not miss the last lines):

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

这篇关于在C#中过滤的log4net纯代码配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆