1.需要引进NoGet程序包【log4net,还有扩展程序集:Microsoft.Extensions.Logging.Log4Net.AspNetCore】
2.把引入的程序集使用进来:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args) .Build() .Run(); } /// <summary> /// 调入当前方法,CreateHostBuilder->然后进入 Startup 这个类 /// </summary> public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) //把前面我们引入的程序集使用进来 .ConfigureLogging((context, LoggingBuilder) => { LoggingBuilder.AddFilter("System", LogLevel.Warning); // 忽略系统的其他日志 LoggingBuilder.AddFilter("Microsoft", LogLevel.Warning); LoggingBuilder.AddLog4Net(); }) ; }
需要引入命名空间:
using Microsoft.Extensions.Logging;
3. 新增日志配置文件,跟Startup.cs 同级,并设置属性-为【始终复制】
<?xml version="1.0" encoding="utf-8"?> <log4net> <!-- Define some output appenders --> <appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"> <!--日志文件路径--> <file value="../../../loglog.txt" /> <!--追加日志内容--> <appendToFile value="true" /> <!--防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--可以为:Once|Size|Date|Composite--> <!--Composite为Size和Date的组合--> <rollingStyle value="Composite" /> <!--当备份文件时,为文件名加的后缀--> <datePattern value="yyyyMMdd.TXT" /> <!--日志最大个数,都是最新的--> <!--rollingStyle节点为Size时,只能有value个日志--> <!--rollingStyle节点为Composite时,每天有value个日志--> <maxSizeRollBackups value="20" /> <!--可用的单位:KB|MB|GB--> <maximumFileSize value="3MB" /> <!--置为true,当前最新日志文件名永远为file节中的名字--> <staticLogFileName value="true" /> <!--输出级别在INFO和ERROR之间的日志--> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ALL" /> <param name="LevelMax" value="FATAL" /> </filter> <!--必须结合起来用,第一个只过滤出WARN,第二个拒绝其它其它日志输出--> <!-- <filter type="log4net.Filter.LevelMatchFilter"> <param name="LevelToMatch" value="WARN" /> </filter> <filter type="log4net.Filter.DenyAllFilter" />--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/> </layout> </appender> <!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL --> <root> <priority value="ALL"/> <level value="ALL"/> <appender-ref ref="rollingAppender" /> </root> </log4net>
4.【Startup类】Configure里面注入ILoggerFactory,创建ILogger对象【需要引入上面提到的命名空间】
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,ILoggerFactory factory) { ILogger<Startup> _ilogger = factory.CreateLogger<Startup>(); //写日志 _ilogger.LogError("This is StartUp Error!"); }
上面是在Startup类中写日志,当然我们也可以在控制器中写日志
public class SecondController : Controller { //2.指定当前类型的变量 private ILoggerFactory _iFactory = null; private ILogger<SecondController> _ilogger = null; //构造函数注入 public SecondController(ILoggerFactory factory, ILogger<SecondController> logger) { //注入当前的实例 _iFactory = factory; _ilogger = logger; } /// <summary> /// log4net在控制器中的使用 /// </summary> /// <returns></returns> public IActionResult Index() { #region Log4net日志记录 { //1、Trace //用于记录最详细的日志消息,通常用于开发阶段调试问题。 //因为这些消息可能包含敏感的应用程序数据,因此不建议用于生产环境,默认应禁用。 //2、Debug //这种消息在开发阶段短期内比较有用。 //它们包含一些可能会对调试有所助益、但没有长期价值的信息。 //默认情况下这是最详细的日志。 //3、Information //这种消息被用于跟踪应用程序的一般流程。 //这种日志有一定的长期价值。 //4、Warning //当应用程序出现错误或其他不会导致程序停止的流程异常或意外事件时,应使用警告级别,,以供日后调查。 //建议在一个通用的地方处理警告级别的异常。 //5、Error //当应用程序由于某些故障停止工作时,则需要记录错误日志。 //这些消息应该指明当前活动或操作(比如当前的HTTP请求),而不是应用程序范围的故障。 //6、Critical //当应用程序或系统崩溃、遇到灾难性故障,需要立即被关注时,应当记录关键级别的日志。例如,数据丢失、磁盘空间不够等 //方式一: //创建当前logger var iFactoryLogger = _iFactory.CreateLogger<SecondController>(); //写日志 iFactoryLogger.LogInformation("This's SecondController_iFactoryLogger.LogInformation-Information");//方式二:使用_ilogger写日志 _ilogger.LogError("This's SecondController__ilogger.LogError_Error"); } #endregion return View(); } }