Asp.Net 6中使用Log4Net
1. 先新建一个ASP.NET Core空项目
2. 通过Nuget包管理器安装下面两个包
log4net
Microsoft.Extensions.Logging.Log4Net.AspNetCore
3. 在项目根目录下新建log4net的配置文件log4net.config,并将其设置为始终复制。
<?xml version="1.0" encoding="utf-8" ?>
<log4net><!--根配置--><root><!--日志级别:可选值: ERROR > WARN > INFO > DEBUG --><level value="ERROR"/><level value="WARN"/><level value="INFO"/><level value="DEBUG"/><appender-ref ref="ErrorLog" /><appender-ref ref="WarnLog" /><appender-ref ref="InfoLog" /><appender-ref ref="DebugLog" /></root><!-- 错误 Error.log--><appender name="ErrorLog" type="log4net.Appender.RollingFileAppender"><!--目录路径,可以是相对路径或绝对路径--><param name="File" value="C:\logs\"/><!--文件名,按日期生成文件夹--><param name="DatePattern" value="/yyyy-MM-dd/"Error.log""/><!--追加到文件--><appendToFile value="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStyle value="Composite"/><!--写到一个文件--><staticLogFileName value="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSize value="200MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackups value="-1"/><!--日志格式--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="[%d{HH:mm:ss}]%m%n"/></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="ERROR" /><param name="LevelMax" value="ERROR" /></filter></appender><!-- 警告 Warn.log--><appender name="WarnLog" type="log4net.Appender.RollingFileAppender"><!--目录路径,可以是相对路径或绝对路径--><param name="File" value="C:\logs\"/><!--文件名,按日期生成文件夹--><param name="DatePattern" value="/yyyy-MM-dd/"Warn.log""/><!--追加到文件--><appendToFile value="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStyle value="Composite"/><!--写到一个文件--><staticLogFileName value="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSize value="200MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackups value="-1"/><!--日志格式--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="[%d{HH:mm:ss}]%m%n"/></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="WARN" /><param name="LevelMax" value="WARN" /></filter></appender><!-- 信息 Info.log--><appender name="InfoLog" type="log4net.Appender.RollingFileAppender"><!--目录路径,可以是相对路径或绝对路径--><param name="File" value="C:\logs\"/><!--文件名,按日期生成文件夹--><param name="DatePattern" value="/yyyy-MM-dd/"Info.log""/><!--追加到文件--><appendToFile value="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStyle value="Composite"/><!--写到一个文件--><staticLogFileName value="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSize value="200MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackups value="-1"/><!--日志格式--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="[%d{HH:mm:ss}]%m%n"/></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="INFO" /><param name="LevelMax" value="INFO" /></filter></appender><!-- 调试 Debug.log--><appender name="DebugLog" type="log4net.Appender.RollingFileAppender"><!--目录路径,可以是相对路径或绝对路径--><param name="File" value="C:\logs\"/><!--文件名,按日期生成文件夹--><param name="DatePattern" value="/yyyy-MM-dd/"Debug.log""/><!--追加到文件--><appendToFile value="true"/><!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--><rollingStyle value="Composite"/><!--写到一个文件--><staticLogFileName value="false"/><!--单个文件大小。单位:KB|MB|GB--><maximumFileSize value="200MB"/><!--最多保留的文件数,设为"-1"则不限--><maxSizeRollBackups value="-1"/><!--日志格式--><layout type="log4net.Layout.PatternLayout"><conversionPattern value="[%d{HH:mm:ss}]%m%n"/></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="DEBUG" /><param name="LevelMax" value="DEBUG" /></filter></appender></log4net>
log4net配置参数此处不多赘述,只针对日志的输出格式参数conversionPattern配置做简要说明。
%M 输出日志方法名
%m 输出日志消息内容
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个换行符
%l或%L 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
%c 输出日志信息所属的类的全名
%d 输出完整的日志时间点的日期时间,支持自定义格式。比如:%d{HH:mm:ss},输出类似:22:10:28
%f 输出日志信息所属的类的类名
4. 在Program中使用log4net输出自定义日志内容
using log4net;var builder = WebApplication.CreateBuilder(args);
//注入Log4Net
builder.Services.AddLogging(cfg =>
{cfg.AddLog4Net();//默认的配置文件路径是在根目录,且文件名为log4net.config//如果文件路径或名称有变化,需要重新设置其路径或名称//比如在项目根目录下创建一个名为cfg的文件夹,将log4net.config文件移入其中,并改名为log.config//则需要使用下面的代码来进行配置//cfg.AddLog4Net(new Log4NetProviderOptions()//{// Log4NetConfigFileName = "cfg/log.config",// Watch = true//});
});
var app = builder.Build();
//访问根页面时
app.MapGet("/", (ILogger<Program> logger) =>
{logger.LogInformation("logger:测试一下Log4Net=》Info");return "Hello World!";
});
//访问test页面时
app.MapGet("/test", () =>
{var log = LogManager.GetLogger(typeof(Program));log.Info("log:这是一条普通日志信息");
});
app.Run();
5. 将项目运行起来,即可发现日志文件已生成
6. 扩展使用:使用简单工厂模式IOC注入到自定义类中使用
新建一个ITestLog4Net接口文件,并为其定义一个Log方法
public interface ITestLog4Net
{public void Log();
}
并且新建一个TestLog4Net的自定义类,继承于ITestLog4Net,并实现该Log方法。
public class TestLog4Net : ITestLog4Net
{private readonly ILogger<TestLog4Net> _logger;public TestLog4Net(ILogger<TestLog4Net> logger){_logger = logger;_logger.LogInformation("ctor测试一下Log4Net=》Info");}public void Log(){_logger.LogInformation("测试一下Log4Net=》Info");}
}
在Program中注入我们的自定义类TestLog4Net
builder.Services.AddTransient<ITestLog4Net, TestLog4Net>();
使用方法
var testLog4Net = app.Services.GetService<ITestLog4Net>()!;
testLog4Net.Log();
或者
var services = new ServiceCollection()!;
var provider = services.BuildServiceProvider()!;
var testLog4Net = provider.GetService<ITestLog4Net>()!;
testLog4Net.Log();