方法一(使用起来更简单)
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