C#--wpf和winform使用log4net日志记录--配置和使用

方法一(使用起来更简单)

1,LogHelper帮助类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using log4net;
using log4net.Config;

using System.IO;

//需要添加引用log4net.dll

namespace _008_WCF
{
    public class LogHelper
    {
        #region 配置方法,加载配置文件 
        public static void SetConfig()
        {
            XmlConfigurator.Configure();
        }

        //【程序窗体加载的时候调用这个方法】
        public static void SetConfig(FileInfo configFile)
        {
            XmlConfigurator.Configure(configFile);
        }

        #endregion

        #region 写入日志的方法

       public static readonly log4net.ILog log_fatal = log4net.LogManager.GetLogger("fatal");
       public static readonly log4net.ILog log_error = log4net.LogManager.GetLogger("error");
       public static readonly log4net.ILog log_warn = log4net.LogManager.GetLogger("warn");
       public static readonly log4net.ILog log_info = log4net.LogManager.GetLogger("info");
       public static readonly log4net.ILog log_debug = log4net.LogManager.GetLogger("debug");

        public static void Fatal(string fatal, Exception e)
        {
            log_info.Fatal(fatal, e);
        }
        public static void Error(string error_info, Exception t)
        {
            log_error.Error(error_info, t);
        }
        public static void Warn(string warn_info)
        {
            log_error.Warn(warn_info);
        }
        public static void Info(string info)
        {
            log_info.Info(info);
        }
        public static void Debug(string debug_info)
        {
            log_info.Debug(debug_info);
        }

        #endregion


        #region 写入日志的方法【二】
      
        //public static void WriteLog(string info)
        //{
        //    bool isInfoEnabled = LogHelper.loginfo.IsInfoEnabled;
        //    if (isInfoEnabled)
        //    {
        //        LogHelper.loginfo.Info(info);
        //    }
        //}

        //public static void WriteLog(string Error, Exception se)
        //{
        //    bool isErrorEnabled = LogHelper.logerror.IsErrorEnabled;
        //    if (isErrorEnabled)
        //    {
        //        LogHelper.logerror.Error(Error, se);
        //    }
        //}

        //public static readonly ILog loginfo = LogManager.GetLogger("loginfo");

        //public static readonly ILog logerror = LogManager.GetLogger("logerror");

        #endregion


    }
}

  

2,程序窗体加载的时候配置日志

        private void Form1_Load(object sender, EventArgs e)
        {
            string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.Config");
            if (!File.Exists(fileName)) MessageBox.Show($"日志配置文件不存在,请检查文件路径\n,{fileName}","日志配置失败");
            LogHelper.SetConfig(new FileInfo(fileName));
        }

  

3,日志配置文件复制程序启动目录中 (log4net.Config)

添加-类-应用程序配置文件-log4net.Config,复制下面xml配置文件保存 ,复制到启动目录中

避坑:

【3.1】网页复制的时候选中所有行复制,不要点最上和最下的复制图标复制

【3.2】新建txt文件,复制到txt后另存log4net.Config,就是不行,不知道为什么???

【3.3】新建txt文件,新建的时候命名log4net.Config,保存,再打开把配置文件复制进去,这种情况可以的。

为了减少问题,还是推荐新建应用程序配置文件的方法操作。

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <!--服务器错误日志Log4.net内容配置-->
  <log4net>
    <!--错误日志配置-->
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\\LogError\\"/>
      <param name="AppendToFile" value="true" />
      <!-- 切割最多文件数 -1表示不限制产生日志文件数-->
      <param name="MaxSizeRollBackups" value="-1"/>
      <!-- 每个文件的大小限制  -->
      <param name="MaximumFileSize" value="10MB"/>
      <!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 -->
      <param name="RollingStyle" value="Composite" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="&#xD;&#xA;----------------------application startup--------------------------&#xD;&#xA;" />
        <param name="Footer" value="&#xD;&#xA; ----------------------application shutdown--------------------------&#xD;&#xA;" />
        <!--param name="ConversionPattern" value="%n异常时间:%d [%t] %n异常级别:%-5p %n异 常 类:%c [%x] %n%m%n"/-->
        <conversionPattern value="%d - 线程ID:[%thread] - %-5level - %m%n" />
      </layout>
    </appender>

    <!--信息日志配置-->
    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\\LogInfo\\"/>
      <param name="AppendToFile" value="true" />
      <!-- 切割最多文件数 -1表示不限制产生日志文件数-->
      <param name="MaxSizeRollBackups" value="-1"/>
      <!-- 每个文件的大小限制  -->
      <param name="MaximumFileSize" value="10MB"/>
      <!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 -->
      <param name="RollingStyle" value="Composite" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="&#xD;&#xA;----------------------application startup --------------------------&#xD;&#xA;" />
        <param name="Footer" value="&#xD;&#xA;----------------------application shutdown--------------------------&#xD;&#xA;" />
        <!--param name="ConversionPattern" value="%n日志时间:%d [%t] %n日志级别:%-5p %n日 志 类:%c [%x] %n%m%n"/-->
        <conversionPattern value="%d - 线程ID:[%thread] - %-5level - %m%n" />
      </layout>
    </appender>
    <!--log4net.LogManager.GetLogger("logerror")用这个来选择这种类型-->
    <logger name="logerror">
      <level value="ERROR"/>
      <appender-ref ref="ErrorAppender"/>
    </logger>
    <logger name="loginfo">
      <level value="INFO"/>
      <appender-ref ref="InfoAppender"/>
    </logger>
    <!--配置日志的级别,低于此级别的就不写到日志里面去
      OFF、FATAL、ERROR, WARN, INFO, DEBUG, ALL
      -->
    <root>
      <level value="INFO"/>
      <appender-ref ref="InfoAppender"/>
    </root>
  </log4net>
</configuration>

 

4,使用

            LogHelper.Info("123");
            LogHelper.Warn("123");

                catch (Exception ex)
                {
                    LogHelper.Error("关闭WCF服务异常,原因:", ex);
                    action(false, "关闭WCF服务异常,原因:" + ex.Message);
                }

  

----------------------application startup --------------------------
2022-05-22 13:54:37,961 - 线程ID:[1] - INFO  - 123
2022-05-22 13:54:37,975 - 线程ID:[1] - WARN  - 123

----------------------application shutdown--------------------------

  

方法二:

1,添加引用 log4net

2, 在项目Properties->AssemblyInfo.cs文件中 添加[assembly: log4net.Config.XmlConfigurator()]  (这一步可忽略不配置也可以

//log4net配置(第一种方式)
//在项目Properties->AssemblyInfo.cs文件中 添加[assembly: log4net.Config.XmlConfigurator()]
[assembly: log4net.Config.XmlConfigurator()]

//log4net配置(第二种方式)
//[assembly: log4net.Config.DOMConfigurator(ConfigFileExtension = "config", Watch = true)]
//[assembly: log4net.Config.DOMConfigurator(ConfigFile = "filename", ConfigFileExtension = "ext", Watch = true / false)]
//参数可以省略

//ConfigFile:指出了我们的配置文件的路径及文件名,包括扩展名。可省略
//configfileextension:如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。
//watch(boolean属性) : log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么filesystemwatcher将会被用来监视文件的改变,重命名,删除等事件。

3,找到App.config。如果没有这个配置文件,就右键添加 应用程序配置文件

 

 4,在App.config中<configuration> </configuration>添加,

  <!--在配置选项中加入log4net的引用-->
<!--特别注意:configSections必须放在configuration的下面的位置--> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <!--root:定义日志输出的方式和等级--> <root> <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录--> <!--如果没有定义LEVEL的值,则缺省为DEBUG--> <level value="ALL" /><!--定义输出的信息等级为所有其中包括Fatal.Error.Warn.Info.Debug--> <!--文件形式记录日志--> <appender-ref ref="LogFileAppender" /> </root> <!--定义logger对象的名字为logApp,以方便在代码中使用,<logger>配置项可以不配置--> <logger name="Logging"> <level value="DEBUG" /> </logger> <!--个配置文件可以有很多appender,一个appender节就相当于一个日志输出介质或方法。--> <!-- 定义输出到文件中 --> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--定义文件存放位置--> <file value="Log/" /> <!--是否追加到文件,默认为true,通常无需设置--> <appendToFile value="true" /> <!--变换的形式为日期,这种情况下每天只有一个日志--> <!--此时MaxSizeRollBackups和maximumFileSize的节点设置没有意义--> <rollingStyle value="Date" /> <!--变换的形式为日志大小--> <!--这种情况下MaxSizeRollBackups和maximumFileSize的节点设置才有意义--> <!--<rollingStyle value="Size"/>--> <!--这是按日期产生文件夹,并在文件名前也加上日期--> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <datePattern value="yyyy-MM-dd&quot;.log&quot;"/> <!--日志最大可备份数,每天记录的日志文件个数,与maximumFileSize配合使用--> <maxSizeToRollBackups value="-1" /> <!--每个日志文件的最大大小--> <!--可用的单位:KB|MB|GB--> <!--不要使用小数,否则会一直写入当前日志--> <maximumFileSize value="10MB" /> <staticLogFileName value="false" /> <layout type="log4net.Layout.PatternLayout,log4net"> <!--每条日志末尾的文字说明--> <!--输出格式--> <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> <conversionPattern value="%d - 线程ID:[%thread] - %-5level - %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="ERROR" /> </filter> </appender> </log4net>

格式说明:

 

5,初始化

【5.1】WinForm程序忽略

            //【WPF必须在主窗体启动的时候加上这个配置,WinForm也需要加】
            log4net.Config.XmlConfigurator.Configure();

【5.2】

        //【WPF和WINFORM都可以这样用】
        //public static readonly log4net.ILog log = log4net.LogManager.GetLogger("Logging"); //Logging 名字要在 App.config 中能找到

        //【WPF可以这样用】
        public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

第5步结束 

【也可以使用自定义类】

//TypeLog Log = new TypeLog();//用这种方式,要引入自定义TypeLog类

 

    public class TypeLog
    {
        log4net.ILog log_fatal = log4net.LogManager.GetLogger("fatal");
        log4net.ILog log_error = log4net.LogManager.GetLogger("error");
        log4net.ILog log_warn = log4net.LogManager.GetLogger("warn");
        log4net.ILog log_info = log4net.LogManager.GetLogger("info");
        log4net.ILog log_debug = log4net.LogManager.GetLogger("debug");

        public void Fatal(string fatal, Exception e)
        {
            log_info.Fatal(fatal, e);
        }
        public void Error(string error_info, Exception t)
        {
            log_error.Error(error_info, t);
        }
        public void Warn(string warn_info)
        {
            log_error.Warn(warn_info);
        }
        public void Info(string info)
        {
            log_info.Info(info);
        }
        public void Debug(string debug_info)
        {
            log_info.Debug(debug_info);
        }
    }

6,使用

log.Warn($"人工确认第{number}个螺丝拧紧OK");

//Log.Info($"人工确认第{number}个螺丝拧紧OK")

7,日志记录

2020-03-14 15:03:59,927 - 线程ID:[1] - WARN - 人工确认第1个螺丝拧紧OK
2020-03-14 15:04:01,899 - 线程ID:[1] - WARN - 人工确认第2个螺丝拧紧NG
2020-03-14 15:04:04,587 - 线程ID:[1] - WARN - 人工确认第2个螺丝拧紧OK
2020-03-14 15:04:06,639 - 线程ID:[1] - WARN - 人工确认第3个螺丝拧紧OK
2020-03-14 15:04:08,291 - 线程ID:[1] - WARN - 人工确认第4个螺丝拧紧NG
2020-03-14 15:04:09,856 - 线程ID:[1] - WARN - 人工确认第4个螺丝拧紧NG
2020-03-14 15:04:11,105 - 线程ID:[1] - WARN - 人工确认第4个螺丝拧紧OK

 

  

 

posted @ 2020-03-14 20:27  包子789654  阅读(2350)  评论(0编辑  收藏  举报