目录
一、安装 log4net 插件
(一)作用
(二)操作
(三)注意
二、配置
(一)配置AssemblyInfo.cs
(二)配置log4net.config
1. 创建log4net.config文件(和program.cs同层级)
2. 设置文件属性
3. 其中,文件内容:
三、使用
(一)封装一个类,方便管理
(二)调用
(三)等级Level
四、其他:简单日志
(一)定义日志
(二)调用
一、安装 log4net 插件
(一)作用
log4net是方便记录日志的驱动插件。
(二)操作
点击工具栏的“工具” > NuGet套件管理员 > 套件管理器主控台。
打开控制台后,输入安装命令:
Install-Package log4net
安装成功后会提示:
(三)注意
不同解决方案在使用log4net,都需要各自安装一次。
查看或勾选安装:点击工具栏的“工具” > NuGet套件管理员 > 管理方案的NuGet套件 > 搜寻插件名 > 查看某项目是否安装。
二、配置
(一)配置AssemblyInfo.cs
<!--添加log4net.dll的参数-->
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "web.config", Watch = true)]
如图所示:
(二)配置log4net.config
1. 创建log4net.config文件(和program.cs同层级)。
2. 设置文件属性
右击log4net.config文件 > 属性 > 将“复制到输出目录”设置为“一律复制” 。
3. 其中,文件内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /></configSections><log4net><!--错误日志类--><logger name="logerror"><!--日志类名字--><level value="ERROR" /><!--日志级别--><appender-ref ref="ErrorAppender" /></logger><logger name="loginfo"><level value="INFO" /><appender-ref ref="InfoAppender" /></logger><!--错误日志附加介质--><appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"><!--name是名称,type是指定介质类型--><!--路径在exe程序的相对目录下--><param name="File" value="Logs//LogError//" /><!--是否追加到文件(true:不会覆盖之前的信息)--><param name="AppendToFile" value="true" /><!--是否只写到一个文件中--><param name="StaticLogFileName" value="false" /><!--按日期产生文件名--><param name="DatePattern" value='"Errorlog_"yyyyMMdd".txt"'/><!-- 按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite]) --><param name="RollingStyle" value=" Composite " /><!-- 当个日志文件的大小。只在文件大小和混合方式方式下使用, 超出大小后在所有文件名后自动增加正整数重新命名 --><param name="maximumFileSize" value="10MB" /><!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--><param name="MaxSizeRollBackups" value="8" /><!--记录的格式--><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%n【Time】:%d [%t] %n【Level】:%-5p %n【ClassType】:%c [%x] %n【Message】:%m%n %n" /></layout></appender><!--普通信息日志附加介质--><appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"><param name="File" value="Logs//LogInfo//" /><param name="AppendToFile" value="true" /><param name="StaticLogFileName" value="false" /><param name="DatePattern" value='"Infolog_"yyyyMMdd".txt"' /><param name="RollingStyle" value="Composite" /><param name="maximumFileSize" value="10MB" /><param name="MaxSizeRollBackups" value="8" /><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%n【Time】:%d [%t] %n【Level】:%-5p %n【ClassType】:%c [%x] %n【Message】:%m%n %n" /></layout></appender></log4net><startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /></startup>
</configuration>
其中,红色圈的内容一定要放在configuration里靠前的位置。
三、使用
(一)封装一个类,方便管理
// Logging.cs 文件
using log4net; // 导入
namespace LogSpace
{class LogCls{public static readonly ILog Logerror = LogManager.GetLogger("logerror"); // 初始化public static readonly ILog Loginfo = LogManager.GetLogger("loginfo");public static void ErrorLog(string msg){if (Logerror.IsErrorEnabled) // 调用{Logerror.Error(msg);}}public static void InfoLog(string msg){if (Loginfo.IsInfoEnabled){Loginfo.Info(msg);}}}
}
(二)调用
using LogSpace;
namespace StartExeSpace
{class StartExe{static void Main(){LogCls.ErrorLog("this is an error content"); // 该方法用了static,其所属类不用实例化LogCls.InfoLog("this is an info content");Console.ReadKey();}}
}
(三)等级Level
由高到低:None > Fatal > ERROR > WARN > DEBUG > INFO > All
理解:若等级是ERROR,则就算调用了log4net的info方法,也不会写入到日志文件中。
四、其他:简单日志
以下是不需要插件,生成简单日志的例子
(一)定义日志
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace LogSpace
{class LogCls{public void WriteLog(string msg){//创建日志文件夹string logPath = Directory.GetCurrentDirectory() + "\\logs";if (!Directory.Exists(logPath)){Directory.CreateDirectory(logPath);}//创建日志文件string fname = $"{logPath}\\log_{DateTime.Now.ToString("yyyyMMdd")}.txt";FileInfo finfo = new FileInfo(fname);if (!finfo.Exists){FileStream fs;fs = File.Create(fname);fs.Close();finfo = new FileInfo(fname);}//文件超过10MB则重命名if (finfo.Length < 1024 * 1024 * 10){File.Move($"{logPath}\\log_{DateTime.Now.ToString("yyyyMMdd")}.txt", $"{logPath}\\log_{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.txt");}//记录日志using (FileStream fs = finfo.OpenWrite()){//根据上面创建的文件流,创建写数据流StreamWriter w = new StreamWriter(fs);//设置写数据流的起始位置,为文件流的末尾w.BaseStream.Seek(0, SeekOrigin.End);//写入日志内容w.WriteLine($"Starting Logging【{DateTime.Now}】");w.WriteLine($"{msg}\n");w.WriteLine("------------------------------------\n");//清空缓冲区w.Flush();//关闭写数据流w.Close();}}}
}
(二)调用
static void Main()
{LogCls logcls = new LogCls();logcls.WriteLog("this is a content");Console.ReadKey();
}