zoukankan      html  css  js  c++  java
  • Log4net

    参考文档:http://www.cnblogs.com/LiZhiW/p/4317198.html

    一、关联配置文件

    1,三种配置方式的方式

    ①    默认web.config/app.config

    //监视默认的配置文件,App.exe.config 
    
    [assembly: log4net.Config.XmlConfigurator(Watch = true)]

    ②    独立配置文件(<项目名称>.exe. log4net)(例如ConsoleApplication1.exe.log4net)

    //配置文件:App.exe.log4net
    
    [assembly:log4net.Config.XmlConfigurator(ConfigFileExtension= "log4net")]

    ③    独立配置文件log4net.config

    //配置文件:log4net.config
    
    [assembly:log4net.Config.XmlConfigurator(ConfigFile= "log4net.config")]

    也可以在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里一定是绝对路径,如下所示:
            log4net.Config.XmlConfigurator.Configure(new FileInfo(@"F:/log4net.config"));

    2,log4net.Config.XmlConifguratorAttribute

    ConfigFile:配置文件的名字,文件路径相对于应用程序目录

    ConfigFileExtension:配置文件的扩展名,文件路径相对于应用程序的目录,不能和ConfigFile属性一起使用

    Watch:如果将Watch属性设置为true,就会监视配置文件,当配置文件发生变化的时候,就会重新加载

    二、案例

    1,输出到文本

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
      <log4net>
        <appender name="AdoNetAppender_file" type="log4net.Appender.RollingFileAppender">
          <!--日志文件路径,按文件大小方式输出时在这里指定文件名,并且前面的日志按天在文件名后自动添加当天日期形成文件-->
          <param name= "File" value= "D:App_LogDebug"/>
          <!--是否是向文件中追加日志-->
          <param name= "AppendToFile" value= "true"/>
          <!--记录日志写入文件时,不锁定文本文件-->
          <!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
          <!--Unicode编码-->
          <!--<Encoding value="UTF-8" />-->
          <!--最多产生的日志文件数,value="-1"为不限文件数-->
          <!--<param name="MaxSizeRollBackups" value="100" />-->
          <!--log保留天数-->
          <param name= "MaxSizeRollBackups" value= "30"/>
          <!--日志文件名是否是固定不变的(是否只写到一个文件中)-->
          <param name= "StaticLogFileName" value= "false"/>
          <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
          <param name="RollingStyle" value="Date" />
          <!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]日志文件名格式为:2008-08-31.log -->
          <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
          <!--<param name= "DatePattern" value= "yyyy-MM/yyyy-MM-dd&quot;.log&quot;"/>-->
          <!--每个文件的大小。只在[混合方式与文件大小方式]下使用,超出大小的在文件名后自动增加1重新命名-->
          <param name="maximumFileSize" value="500KB" />
          <!--记录的格式。-->
          <layout type="log4net.Layout.PatternLayout">
            <!--
            %d, %date     :表示当然的时间
          %p, %level    :表示日志的级别
          %c, %logger   :表示日志产生的主题或名称,通常是所在的类名,便于定位问题
          %m, %message  :表示日志的具体内容
          %n, %newline  :换行
            %exception    :表示异常信息
            -->
            <param name="ConversionPattern" value="%d [%t] %-5p %c - %m %logger %exception %n" />
          </layout>
        </appender>
        <logger name="Test" additivity="true">
          <level value="ALL"/>
          <appender-ref ref="AdoNetAppender_file" />
        </logger>
      </log4net>
    </configuration>
    log4net.config
    using System;
    using log4net;
    
    namespace LogDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                ILog log = log4net.LogManager.GetLogger("Test");
                log.Error("错误", new Exception("发生了一个异常"));//错误
                log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误
                log.Info("信息"); //记录一般信息
                log.Debug("调试信息");//记录调试信息
                log.Warn("警告");//记录警告信息
    
                Console.WriteLine("日志记录完毕。");
                Console.Read();
            }
        }
    }
    Program.cs

    案例下载:http://pan.baidu.com/s/1nuU4f93

    <param name= "File" value= "log"/>文件配置格式 

    2,输出到数据库

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
      <log4net>
        <appender name="AdoNetAppender_mysql" type="log4net.Appender.AdoNetAppender">
          <bufferSize value="0" /><!--0:只要有一条就立刻写到数据库。4:第5条时写入数据库-->
          <!--日志数据库连接串mysql-->
          <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
          <connectionString value="server=localhost;user id=root;pwd=123456;port=3306;pooling=True;database=xinleda" providerName="MySql.Data.MySqlClient;" />
          <!--日志数据库脚本(注意:mysql不需要[]符号)-->
          <commandText value="INSERT INTO LogDetails(LogDate,Thread,Level,Logger,Message) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
          <!--参数-->
          <parameter>
            <parameterName value="@logDate" />
            <dbType value="Datetime" />
            <layout type="log4net.Layout.RawTimeStampLayout" />
          </parameter>
          <parameter>
            <parameterName value="@thread" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%thread" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@logLevel" />
            <dbType value="String" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%level" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@logger" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%logger" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@message" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%message" />
            </layout>
          </parameter>
        </appender>
        <logger name="Test" additivity="true">
          <level value="ALL"/>
          <appender-ref ref="AdoNetAppender_mysql" />
        </logger>
      </log4net>
    </configuration>
    log4net.config
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using log4net;
    using log4net.Config;
    using System.IO;
    
    namespace LogDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                ILog log = log4net.LogManager.GetLogger("Test");
                log.Error("错误", new Exception("发生了一个异常"));//错误
                log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误
                log.Info("信息"); //记录一般信息
                log.Debug("调试信息");//记录调试信息
                log.Warn("警告");//记录警告信息
                Console.WriteLine("日志记录完毕。");
                Console.Read();
            }
        }
    }
    Program.cs
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    
    // 有关程序集的一般信息由以下
    // 控制。更改这些特性值可修改
    // 与程序集关联的信息。
    [assembly: AssemblyTitle("LogDemo")]
    [assembly: AssemblyDescription("")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("")]
    [assembly: AssemblyProduct("LogDemo")]
    [assembly: AssemblyCopyright("Copyright ©  2017")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")]
    
    //将 ComVisible 设置为 false 将使此程序集中的类型
    //对 COM 组件不可见。  如果需要从 COM 访问此程序集中的类型,
    //请将此类型的 ComVisible 特性设置为 true。
    [assembly: ComVisible(false)]
    
    // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
    [assembly: Guid("3cef5427-d026-46c8-a73a-083215681098")]
    
    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
    
    // 程序集的版本信息由下列四个值组成:
    //
    //      主版本
    //      次版本
    //      生成号
    //      修订号
    //
    //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
    // 方法是按如下所示使用“*”: :
    // [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyFileVersion("1.0.0.0")]
    AssemblyInfo.cs

    注意:如果是链接到mysql需要引用组件MySql.Data

    案例下载:http://pan.baidu.com/s/1c1QIF0s

    3,自定义字段输出到数据库

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
      <log4net>
        <appender name="AdoNetAppender_mysql" type="log4net.Appender.AdoNetAppender">
          <bufferSize value="0" /><!--0:只要有一条就立刻写到数据库。4:第5条时写入数据库-->
          <!--日志数据库连接串mysql-->
          <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
          <connectionString value="server=localhost;user id=root;pwd=123456;port=3306;pooling=True;database=xinleda" providerName="MySql.Data.MySqlClient;" />
          <!--日志数据库脚本(注意:mysql不需要[]符号)-->
          <commandText value="INSERT INTO LogDetails(LogDate,Thread,Level,Logger,Message,Content,Age) VALUES (@logDate, @thread, @logLevel, @logger,@message,@Content,@Age)" />
          <!--参数-->
          <parameter>
            <parameterName value="@logDate" />
            <dbType value="Datetime" />
            <layout type="log4net.Layout.RawTimeStampLayout" />
          </parameter>
          <parameter>
            <parameterName value="@thread" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%thread" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@logLevel" />
            <dbType value="String" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%level" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@logger" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%logger" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@message" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%message" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@Content" />
            <dbType value="String" />
            <size value="240" />
            <layout type="LogDemo.MessageLayout">
              <conversionPattern value="%Content" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@Age" />
            <layout type="LogDemo.MessageLayout">
              <conversionPattern value="%Age" />
            </layout>
          </parameter>
        </appender>
        <logger name="Test" additivity="true">
          <level value="ALL"/>
          <appender-ref ref="AdoNetAppender_mysql" />
        </logger>
      </log4net>
    </configuration>
    log4net.config
    using log4net.Layout.Pattern;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using log4net.Core;
    using System.IO;
    using log4net.Layout;
    
    namespace LogDemo
    {
        //自定义字段
        public class LogMassage
        {
            public string Content { get; set; }
            public int Age { get; set; }
            public DateTime Dt { get; set; }
        }
    
        public sealed class ContentPatternConverter : PatternLayoutConverter
        {
            protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
            {
                var log =loggingEvent.MessageObject as LogMassage;
                if (log != null)
                {
                    writer.Write(log.Content);
                }
            }
        }
        public sealed class AgePatternConverter : PatternLayoutConverter
        {
            protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
            {
                var log = loggingEvent.MessageObject as LogMassage;
                if (log != null)
                {
                    writer.Write(log.Age);
                }
            }
        }
    
        public class MessageLayout : PatternLayout
        {
            public MessageLayout()
            {
                this.AddConverter("Content", typeof(ContentPatternConverter));
                this.AddConverter("Age", typeof(AgePatternConverter));
            }
        }
    
    }
    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using log4net;
    using log4net.Config;
    using System.IO;
    
    namespace LogDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                ILog log = log4net.LogManager.GetLogger("Test");
                log.Error("错误", new Exception("发生了一个异常"));//错误
                log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误
                log.Info("信息"); //记录一般信息
                log.Debug("调试信息");//记录调试信息
                log.Warn("警告");//记录警告信息
    
                //记录自定义字段
                var m = new LogMassage();
                m.Content = "asdasd";
                m.Age = 123;
                m.Dt = DateTime.Now;
                log.Info(m);
    
                Console.WriteLine("日志记录完毕。");
                Console.Read();
            }
        }
    }
    Program.cs

    案例下载:http://pan.baidu.com/s/1hrNSB8C

    三、配置详情

     1,logger节点配置详解

        <!--name:必须的,logger的名称,在代码中得到ILog对象时用到-->
        <!--additivity:可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender-->
        <logger name="Test" additivity="true">
          <level value="ALL"/><!--日志级别等级。高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL-->
          <appender-ref ref="AdoNetAppender_mysql" /><!--0个或多个,要引用的appender的名字-->
        </logger>

     2,filter节点配置详解

    filter只能作为<appender>的子元素,type属性表示Filter的类型

    DenyAllFilter       阻止所有的日志事件被记录

    LevelMatchFilter    只有指定等级的日志事件才被记录

    LevelRangeFilter    日志等级在指定范围内的事件才被记录

    ①记录日志等级为“FATAL”和“ERROR”的日志信息

    <filter type="log4net.Filter.LevelMatchFilter">
      <levelToMatch value="FATAL"/>
    </filter>
    <filter type="log4net.Filter.LevelMatchFilter">
      <levelToMatch value="ERROR"/>
    </filter>
    <filter type="log4net.Filter.DenyAllFilter"/>

    ②记录日志等级范围从“ERROR”到“INFO”的日志信息:

          <filter type="log4net.Filter.LevelRangeFilter">
             <levelMax value="ERROR"/>
             <levelMin value="INFO"/>
          </filter>

     3,Layout节点配置详解

    layout节点只能作为<appender>的子元素。type属性表示Layout的类型

    ①layout节点的type属性取值

    ExceptionLayout

    只呈现日志事件中异常的文本信息

    PatternLayout

    可以通过类型字符串来配置的布局

    RawPropertyLayout

    从日志事件中提取属性值

    RawTimeStampLayout

    从日志事件中提取日期

    RawUtcTimeStampLayout

    从日志事件中提取UTC日期

    SimpleLayout

    很简单的布局

    XmlLayout

    把日志事件格式化为XML元素的布局

    ②PatterLayout的格式化字符串

    %m、%message

    输出的日志消息

    %d、%datetime

    输出当前语句运行的时刻,格式%date{yyyy-MM-dd   HH:mm:ss,fff}

    %r、%timestamp

    输出程序从运行到执行到当前语句时消耗的毫秒数

    %p、%level

    日志的当前优先级别

    %c、%logger

    当前日志对象的名称

    %L、%line

    输出语句所在的行号

    %F、%file

    输出语句所在的文件名,警告:只在调试的时候有效,调用本地信息会影响性能

    %a、%appdomain

    引发日志事件的应用程序域的名称。

    %C、%class、%type

    引发日志请求的类的全名,警告:会影响性能

    %exception

    异常信息

    %u、%identity

    当前活动用户的名字,我测试的时候%identity返回都是空的。警告:会影响性能

    %l、%location

    引发日志事件的名空间、类名、方法、行号。警告:会影响性能,依赖pdb文件

    %M、%method

    发生日志请求的方法名,警告:会影响性能

    %n、%newline

    换行符

    %x、%ndc

    NDC(nested diagnostic context)

    %X、%mdc、%P、%properties

    等介于 %property

    %property

    输出{log4net:Identity=, log4net:UserName=,   log4net:HostName=}

    %t、%thread

    引发日志事件的线程,如果没有线程名就使用线程号。

    %w、%username

    当前用户的WindowsIdentity,类似:HostName/Username。警告:会影响性能

    %utcdate

    发生日志事件的UTC时间。例如:%utcdate{HH:mm:ss,fff}

    %%

    输出一个百分号

     
    ③案例
     
          <parameter>
            <parameterName value="@logDate" />
            <dbType value="Datetime" />
            <layout type="log4net.Layout.RawTimeStampLayout" />
          </parameter>
          <parameter>
            <parameterName value="@thread" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%thread" />
            </layout>
          </parameter>
     
     
    学习永不止境,技术成就梦想。
  • 相关阅读:
    软件工程之旅开始啦
    c# async,await, 委托函数
    mysql 访问不是本地数据库,给用户刷新了权限没有作用
    c# WndProc事件 消息类型
    sql not in 优化问题
    c# dataGridView 表头格式设置不管用
    sql 更新多条记录
    mysql 插多行数据
    win7 64bit+vs2010 操作注册表
    bat脚本命令
  • 原文地址:https://www.cnblogs.com/zd1994/p/7048206.html
Copyright © 2011-2022 走看看