目录
一、安装 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();
}