一、引用log4net动态库
在项目直接引用log4net.dll文件,或者通过Nuget安装(本文使用1.2.10版本)
二、在主项目增加log4net配置文件
在主项目下添加log4net.config文件,比如有Main主项目、Common工具项目等多个项目时,需要把log4net.config放在Main项目下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<!--日志路径-->
<param name= "File" value= "logs/info/"/>
<!--多线程时采用最小锁定-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--log保留天数-->
<!--<param name= "MaxSizeRollBackups" value= "10"/>-->
<!--日志文件名是否是固定不变的-->
<param name= "StaticLogFileName" value= "false"/>
<!--日志文件名格式为:2022-05-22.log-->
<param name= "DatePattern" value= "yyyy-MM-dd'.txt'"/>
<!--日志根据日期滚动-->
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%n%d [%t] %-5p %c [%L] - %m %n" />
</layout>
<!--过滤日志级别范围-->
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG" />
<levelMax value="WARN" />
</filter>
</appender>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<!--日志路径-->
<param name= "File" value= "logs/Error/"/>
<!--多线程时采用最小锁定-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--log保留天数-->
<!--<param name= "MaxSizeRollBackups" value= "10"/>-->
<!--日志文件名是否是固定不变的-->
<param name= "StaticLogFileName" value= "false"/>
<!--日志文件名格式为:2022-05-22.log-->
<param name= "DatePattern" value= "yyyy-MM-dd'.txt'"/>
<!--日志根据日期滚动-->
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%n%d [%t] %-5p %c [%L] - %m %n" />
</layout>
<!--过滤日志级别范围-->
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="all" />
<appender-ref ref="InfoAppender"/>
<appender-ref ref="ErrorAppender"/>
</root>
</log4net>
</configuration>
三、配置文件属性改为“更新复制”或“始终复制”
四、修改对应项目properties下的assmbly.cs文件,添加一些代码
修改 log4net.LogManager.GetLogger 获取实例所在的项目的assmbly.cs(我在Common工具项目添加了一个LogHelper.cs的类,日志使用时从Common.LogHelpr里面获取Logger实例;所以修改的是Common工具项目的assmbly.cs)
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
五、代码调用
//public log4net.ILog Logger = log4net.LogManager.GetLogger(typeof(ClassName));
//Logger.Info("这里是普通日志");
//Logger.Error("这里是错误日志");
//Common项目
public class LogHelper
{
public static ILog GetLogger<T>()
{
return log4net.LogManager.GetLogger(typeof(T));
}
}
//其他项目使用日志时
private ILog logger = LogHelper.GetLogger<TestClass>();
logger.Info("测试日志打印");
如需考虑线程安全,可用以下方法:
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Helper
{
public class LogHelper
{
private static object lockerInfo = new object();
private static object lockerError = new object();
public static void LogInfo<T>(string info)
{
Task.Run(() => {
lock (lockerInfo)
{
log4net.LogManager.GetLogger(typeof(T)).Info(info);
}
});
}
public static void LogError<T>(string info)
{
Task.Run(() => {
lock (lockerError)
{
log4net.LogManager.GetLogger(typeof(T)).Error(info);
}
});
}
}
}