Asp.NetCore中集成各种日志框架
前言
Asp.NetCore自带日志记录功能,但提供的功能相对于第三方日志框架的来说不够“强悍”,但自身以面向接口的方式实现,很方便集成各种日志框架,这里先集成两个比较常用的日志框架,Log4Net和Serilog;
正文
Asp.NetCore自带日志的使用;
1. 先创建一个WebApi项目;
将launchSettings配置文件修改一下(其实就是把IIS相关配置删掉就行),即以项目的方式启动,不用IIS的方式,这样方便查看日志;
2. 项目中已经集成了日志功能,打开WeatherForecastController.cs文件,构造函数就已经注入好了日志实例(.NetCore已经集成了IOC),直接用即可;
3. 在WeatherForecastController的Get方法中用一把实例一把logger;
提供了现有方法,如下
使用
4. 运行结果
用起来是不是很简单,但是明明写了五个日志,为什么就只有三个显示了? 那是因为级别做限制了,直接修改appsettings文件即可,如果是开发环境,修改appsettings.Development.json;
运行结果,写的5个日志都显示出来了:
5.当我们不想看到那么多级别的日志,只关心Warn级别日志的时候,我们向上面一样可以改配置文件,也可以在代码中修改,这里在Program.cs代码中过滤一下:
注:ConfigureLogging中可以进行日志相关的很多配置,大家可以下去自己尝试;
运行效果:
从上面来看,系统自带日志其实对于开发过程中调试是比较方便的,直接在控制台显示了,而且还可以指定对应级别,甚至可以自定义。但是提供的功能有限,如显示格式及存储方式目前没有提供,而成熟的第三方日志框架已经实现了(如Log4Net,Serilog),所以开始集成一把试试。
2. 集成Log4Net;(之前我们都会以工具类的形式集成Log4Net,在这就不说那种方式了,在.NetCore中,直接接管自带的日志)
三大步之A:引入Log4Net日志扩展包:Microsoft.Extensions.Logging.Log4Net.AspNetCore
三大步之B:编写配置文件log4net.xml,并设置属性为始终复制;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <?xml version= "1.0" encoding= "utf-8" ?> <log4net> <appender name= "Info" type= "log4net.Appender.RollingFileAppender" > <file value= "Log\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <maxSizeRollBackups value= "-1" /> <maximumFileSize value= "10MB" /> <staticLogFileName value= "false" /> <encoding value= "utf-8" /> <DatePattern value= "yyyy-MM-dd" .txt "" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date %-5level - %message%newline" /> </layout> </appender> <appender name= "Error" type= "log4net.Appender.RollingFileAppender" > <file value= "Log\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <maxSizeRollBackups value= "-1" /> <maximumFileSize value= "10MB" /> <staticLogFileName value= "false" /> <encoding value= "utf-8" /> <DatePattern value= "yyyy-MM-dd" .txt "" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date %-5level - %message%newline" /> </layout> </appender> <appender name= "ConsoleAppender" type= "log4net.Appender.ConsoleAppender" > <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date %-5level - %message%newline" /> </layout> </appender> <logger name= "Info" > <level value= "ALL" /> <appender- ref ref = "Info" /> </logger> <logger name= "InterfaceCall" > <level value= "ALL" /> <appender- ref ref = "InterfaceCall" /> </logger> <logger name= "Error" > <level value= "ALL" /> <appender- ref ref = "Error" /> </logger> <root> <level value= "ALL" /> <appender- ref ref = "Info" /> <appender- ref ref = "ConsoleAppender" /> </root> </log4net> |
三大步之C:修改Program.cs文集中的方法,见红色部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace IntegrateLog { public class Program { public static void Main( string [] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder( string [] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); webBuilder.ConfigureLogging((hostingContext, builder) => { //builder.AddFilter(loglevel => loglevel >= LogLevel.Warning); //清楚自带的Providers builder.ClearProviders(); builder.AddConsole(); builder.AddDebug(); builder.AddLog4Net( "log4net.xml" ); }); }); } } |
看运行结果:
控制台正常打印
日志文件正常生成及写入:
如上,Log4Net就集成到项目中,原来项目中使用的日志逻辑不需要进行改变,一样的写法。接下来关注Log4Net即可;
总结
本来想把Serilog也具体集成一下,想着步骤基本一样,若需要Serilog集成的,可以参考以上Log4Net的思路。这样集成了第三方日志框架,日志记录就更加方便了,格式和存储位置都可以任意配置,是不是很给力。
关注公众号,每周至少更新两篇.NetCore相关文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架