多年的经验,日志记录是软件开发的重要组成部分。没有日志记录机制的系统不是完善的系统。在开发阶段可以通过debug附件进程进行交互调试,可以检测到一些问题,但是在上线之后,日志的记录起到至关重要的作用。它可使我们在系统出现问题之后,排查错误提供依据。
.NET Core3.0内置多种日志记录程序,并且有第三方提供的日志记录程序框架如:log4net,NLog,Serilog,elmah.io等。后面会介绍前三种日志框架如何与.NETcore3.0结合起来进行使用。
内置日志记录提供程序
ASP.NETCore 提供以下提供程序:
- 控制台-可以在控制台查看日志输出
- 调试-vs工具 -》开始调试-》输出窗口进行查看日志输出
- EventSource-可使用PerfView 实用工具收集和查看日志
- EventLog-》仅在windows系统下可以使用事件查看器查看日志
- TraceSource
- AzureAppServicesFile
- AzureAppServicesBlob
- ApplicationInsights
创建使用日志
通用主机的应用程序和非主机应用程序使用的方式也是不同的。因为通用主机内部封装了 依赖注入、logging、配置、IHostedService的实现;并且默认配置了控制台,调试,EventSource以及EventLog(仅当在windows上运行时)提供程序。源码如下
.ConfigureLogging((hostingContext, logging) => { var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); // IMPORTANT: This needs to be added *before* configuration is loaded, this lets // the defaults be overridden by the configuration. if (isWindows) { // Default the EventLogLoggerProvider to warning or above logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning); } logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); logging.AddConsole(); logging.AddDebug(); logging.AddEventSourceLogger(); if (isWindows) { // Add the EventLogLoggerProvider on windows machines logging.AddEventLog(); } })
通用主机
添加提供程序
可自行选择提供程序来替换默认提供程序。在CreateHostBuilder时候 调用ClearProviders(),然后添加所需的提供程序。我们创建一个api项目为例
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.ClearProviders();//去掉默认添加的日志提供程序 logging.AddConsole(); logging.AddDebug(); logging.AddEventSourceLogger(); logging.AddEventLog(); //logging.AddTraceSource(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
创建日志
在 Web 应用或托管服务中,由依赖关系注入 (DI) 获取 ILogger。
private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; //可以显示指定类别名称ILoggerFactory logger //logger.CreateLogger("WebApi.Controllers.WeatherForecastController"); }
[HttpGet] public IEnumerable<WeatherForecast> Get() { //内置日志 _logger.LogTrace(1000, "log Trace msg"); // _logger.LogDebug(1001, "log Debug msg"); // _logger.LogInformation(1002, "log Information msg"); // _logger.LogWarning(1003, "log Warning msg"); // _logger.LogError(1004, "log Error msg"); // _logger.LogCritical(1005, "log Critical msg"); //
非主机控制台
添加提供程序
在创建 LoggerFactory 时调用提供程序的 Add{provider name} 扩展方法:
var loggerFactory = LoggerFactory.Create(builder => { builder .AddFilter("Microsoft", LogLevel.Warning) .AddFilter("System", LogLevel.Warning) .AddFilter("LoggingConsoleApp.Program", LogLevel.Debug) .AddConsole() .AddEventLog(); });
创建日志
在非主机控制台应用中,使用 LoggerFactory 来创建 ILogger。
ILogger logger = loggerFactory.CreateLogger<Program>(); logger.LogInformation("非主机模式输出log message");
运行输出
第三方日志框架
log4net,NLog和Serilog这3种日志记录框架几乎在.NET空间中占主导地位,不需要太多介绍。看看最近6周的下载排名就知道了。如图
log4net 在NET Core 3.0使用
引用Log4net到项目中,安装NuGet包
Install-Package log4net -Version 2.0.8
在项目中添加log4net.config文件,右键改文件属性-》复制到输出目录选择-》始终复制
<log4net> <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> <file value="loglog4net.log" /> <appendToFile value="true" /> <maximumFileSize value="50KB" /> <maxSizeRollBackups value="2" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %level %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="RollingFile" /> </root> </log4net>
在Startup文件中添加log4net配置的文件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseLog4net(); /// <summary> /// 使用log4net配置 /// </summary> /// <param name="app"></param> /// <returns></returns> public static IApplicationBuilder UseLog4net(this IApplicationBuilder app) { var logRepository = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy)); log4net.Config.XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config")); return app; } 上面两步的准备完成之后,在Controllers中使用 private readonly ILog log; public WeatherForecastController(ILogger<WeatherForecastController> logger) { this.log = LogManager.GetLogger(typeof(WeatherForecastController)); } [HttpGet] public IEnumerable<WeatherForecast> Get() { //第三方日志 log.Error("log4net erro msg"); //log4net
运行查看日志文件
NLog 在NET Core 3.0使用
引用NLog到项目中,安装NuGet包
Install-Package NLog.Web.AspNetCore -Version 4.9.0 Install-Package NLog -Version 4.6.7
添加配置文件nlog.config
<"1.0" encoding="utf-8" "http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="Info" internalLogFile="internal-nlog.txt"> <!-- enable asp.net core layout renderers --> <extensions> <add assembly="NLog.Web.AspNetCore"/> </extensions> <!-- the targets to write to --> <targets> <!-- write logs to file --> <target xsi:type="File" name="allfile" fileName="nlog-all-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" /> <!-- another file log, only own logs. Uses some ASP.NET core renderers --> <target xsi:type="File" name="ownFile-web" fileName="nlog-own-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /> </targets> <!-- rules to map from logger name to target --> <rules> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile" /> <!--Skip non-critical Microsoft logs and so log only own logs--> <logger name="Microsoft.*" maxlevel="Info" final="true" /> <!-- BlackHole without writeTo --> <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> </rules> </nlog>
在Program.cs文件配置 Main方法添加
NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
CreateHostBuilder方法添加
.UseNLog() //NLog: Setup NLog for Dependency injection
使用
[HttpGet] public IEnumerable<WeatherForecast> Get() { //内置日志 _logger.LogTrace(1000, "log Trace msg"); // _logger.LogDebug(1001, "log Debug msg"); // _logger.LogInformation(1002, "log Information msg"); // _logger.LogWarning(1003, "log Warning msg"); // _logger.LogError(1004, "log Error msg"); // _logger.LogCritical(1005, "log Critical msg"); //
Serilog 在NET Core 3.0使用
引用Serilog到项目中,安装NuGet包
Install-Package Serilog.AspNetCore -Version 3.1.0
在Program.cs文件进行Logger初始化
Main方法添加
Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .WriteTo.Console()// 配置日志输出到控制台 .WriteTo.File("logserilog.txt", rollingInterval: RollingInterval.Day) //配置日志输出文件,生成周期每天 .CreateLogger(); try { Log.Information("Starting up"); CreateHostBuilder(args).Build().Run(); } catch (Exception ex) { Log.Fatal(ex, "Application start-up failed"); } finally { Log.CloseAndFlush(); }
运行输出:
小结:本文主要讲解NET Core3.0内置的日志提供程序和与第三方日志框架(Log4net,Nlog,Serilog)的使用。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?