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".txt""/> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="
----------------------application startup--------------------------
" /> <param name="Footer" value="
 ----------------------application shutdown--------------------------
" /> <!--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".txt""/> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="
----------------------application startup --------------------------
" /> <param name="Footer" value="
----------------------application shutdown--------------------------
" /> <!--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".log""/> <!--日志最大可备份数,每天记录的日志文件个数,与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