如何定制.NET6.0的日志记录

在本章中,也就是整个系列的第一部分将介绍如何定制日志记录(系列内容查阅《玩转ASP.NET 6.0框架-序言》)。默认日志记录仅写入控制台或调试窗口,这在大多数情况下都很好,但有时需要写入到文件或数据库,或者,您可能希望扩展日志记录的其他信息。在这些情况下,您需要知道如何更改默认日志记录。

在本章,我们将介绍以下主题:

  • 配置日志记录

  • 创建自定义日志记录

  • 使用第三方日志框架

以上主题涉及ASP.NET Core框架的Host层。
85bcfa0927dd0efb633dcfbe300d77e1.png

技术要求

为了演示,我们创建一个ASP.NET Core MVC应用程序。请打开控制台、shellBash终端,然后切换到工作目录,然后使用以下命令创建新的应用程序:

dotnet new mvc -n LoggingSample -o LoggingSample

Visual Studio中双击打开该项目,或者在控制台中键入以下命令用Visual Studio Code打开该项目:

cd LoggingSample code .

配置日志记录

ASP.NET Core的早期版本中(即2.0版之前的版本),日志记录是在Startup.cs配置的。之后Startup.cs文件慢慢简化,许多配置被移动到Program.csWebHostBuilder,日志记录也是在这个时候被移动到WebHostBuilder

ASP.NET Core 3.1及更高版本的程序,Program.cs文件变得更加通用,IHostBuilder将最先创建,它是引导应用启动的关键(我们将在后面详解IHostBuilder),通过IHostBuilder,我们可以创建IWebHostBuilder用以配置ASP.NET Core

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>();}); 
}

ASP.NET Core 6.0中,Microsoft引入了简化配置的迷你API(minimal API)方法。这种方法不使用Startup文件,而是将所有配置添加到Program.cs文件,如下代码段:

var builder = WebApplication.CreateBuilder(args); //添加服务到容器.
builder.Services.AddControllersWithViews(); 
var app = builder.Build(); 
…

ASP.NET Core,您可以覆盖和自定义几乎所有内容,包括日志记录。IWebHostBuilder有很多扩展方法,允许我们覆盖不同功能的默认行为。要覆盖日志记录的默认设置,我们需要使用ConfigureLogging方法。

以下代码片段显示的日志记录与上面的ConfigureWebHostDefaults()方法中配置的日志记录几乎完全相同:

Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{         webBuilder.ConfigureLogging((hostingContext, logging) => {logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));                 logging.AddConsole();                 logging.AddDebug();             }).UseStartup<Startup>();

使用minimal API方法,我们不再需要ConfigureLogging方法,我们可以直接使用WebApplicationBuilderLogging属性:

builder.Logging.AddConfiguration(builder.Configuration.GetSection("Logging")); 
builder.Logging.AddConsole(); 
builder.Logging.AddDebug();

现在我们已经了解了如何配置日志记录,接下来我们看看如何自定义日志记录。

创建自定义日志记录

为了演示,我们这里创建一个小而简单的日志记录器,它能够在控制台中使用特定的日志级别对日志条目进行着色。此日志记录称为ColoredConsoleLogger,它会使用LoggerProvider创建。要指定颜色和日志级别,我们还需要添加一个配置类Configuration

在接下来的代码片段中,将分别创建这三个关键类(ConfigurationLoggerProviderLogger):

1.ColoredConsoleLoggerConfiguration

我们创建一个名为CustomLogger.cs的文件中,它与Program.cs位于同一文件夹中,我们在CustomLogger.cs中创建ColoredConsoleLoggerConfiguration,该配置类包含三个可设置的属性:LogLevelEventIdColor

public class ColoredConsoleLoggerConfiguration 
{     public LogLevel LogLevel { get; set; } = LogLevel.Warning;     public int EventId { get; set; } = 0;    public ConsoleColor Color { get; set; } = ConsoleColor.Yellow; 
}

2.ColoredConsoleLoggerProvider

接下来,我们需要一个提供程序来检索配置并创建实际的日志记录实例

public class ColoredConsoleLoggerProvider : ILoggerProvider 
{     private readonly ColoredConsoleLoggerConfiguration _config;     private readonly ConcurrentDictionary<string, ColoredConsoleLogger> _loggers = new ConcurrentDictionary<string,ColoredConsoleLogger>();     public ColoredConsoleLoggerProvider (ColoredConsoleLoggerConfiguration config) { _config = config; }     public ILogger CreateLogger(string categoryName) { return _loggers.GetOrAdd(categoryName,name => new ColoredConsoleLogger(name, _config));     }public void Dispose() {_loggers.Clear(); } 
}

不要忘记引入System.Collections.Concurrent

3.ColoredConsoleLogger

第三类是我们真正使用的日志记录器:

public class ColoredConsoleLogger : ILogger
{private static readonly object _lock = new Object();private readonly string _name;private readonly ColoredConsoleLoggerConfiguration _config;public ColoredConsoleLogger(string name,ColoredConsoleLoggerConfiguration config){_name = name;_config = config;}public IDisposable BeginScope<TState>(TState state){return null;}public bool IsEnabled(LogLevel logLevel){return logLevel == _config.LogLevel;}public void Log<TState>(LogLevel logLevel,EventId eventId,TState state,Exception exception,Func<TState, Exception, string> formatter){if (!IsEnabled(logLevel)){return;}lock (_lock){if (_config.EventId == 0 || _config.EventId == eventId.Id){var color = Console.ForegroundColor;Console.ForegroundColor = _config.Color;Console.Write($"{logLevel} - ");Console.Write($"{eventId.Id} - {_name} - ");Console.Write($"{formatter(state, exception)}\n");Console.ForegroundColor = color;}}}
}

我们现在需要lock(锁定) 控制台的输出——这是因为控制台本身并不是真正的线程安全的,可能出现错误的着色。

完成后,我们可以将新的记录插入到Program.cs的配置中。

using LoggingSample;builder.Logging.ClearProviders();
var config = new ColoredConsoleLoggerConfiguration
{LogLevel = LogLevel.Information,Color = ConsoleColor.Red
};
builder.Logging.AddProvider(new ColoredConsoleLoggerProvider(config));

首先需要向引入LoggerSample命名空间。

using LoggingSample;

如果不想使用现有的日志框架,可以清除之前添加的所有日志框架提供程序

builder.Logging.ClearProviders();

然后,我们调用AddProvider来添加ColoredConsoleLoggerProvider实例。

这里配置了不同的日志级别,您可以使用这种方法发送有关错误的电子邮件,或者将调试消息记录到别的日志接收器等等。

下图显示了日志框架的彩色输出:

a7aca45319f5de27743ab85cb3b2874f.png

在许多时候,编写自定义日志框架是没有意义的,因为已经有许多优秀的第三方日志记录框架可用,例如ELMAHlog4netNLog

下面,我们将介绍如何在ASP.NET Core中使用NLog

使用第三方日志框架NLog

NLog是最早的一款可用于ASP.NET Core的日志框架,NLog提供了一个日志记录提供程序插件,可以方便地插入ASP.NET Core。(你可以通过NuGet找到NLog)

1.配置Nlog

我们需要添加一个NLog.Config配置文件,用于定义两个不同的日志记录:

  1. 所有标准消息记录在一个日志文件中;

  2. 而自定义消息记录在另一个文件中

<targets><!-- 标准消息 --><target xsi:type="File" name="allfile" fileName="C:\git\dotnetconf\001-logging\nlog-all-${shortdate}.log"layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}" /><!-- 自定义消息 --><target xsi:type="File" name="ownFile-web" fileName="C:\git\dotnetconf\001-logging\nlog-own-${shortdate}.log"layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|  ${message} ${exception}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /><target xsi:type="Null" name="blackhole" /></targets><!-- rules to map from logger name to target --><rules><!--All logs, including from Microsoft--><logger name="*" minlevel="Trace" writeTo="allfile" /><!--Skip Microsoft logs and so log only own logs--><logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /><logger name="*" minlevel="Trace" writeTo="ownFile-web" /></rules>

2.引入NuGet包

然后我们需要NuGet添加NLogASP.NET Core包:

dotnet add package NLog.Web.AspNetCore

3.将NLogIWebHostBuilder结合使用

清除ConfigureLogging方法中的其他提供程序,使用UseNLog()方法将NLogIWebHostBuilder结合使用:

Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => {         webBuilder.ConfigureLogging((hostingContext,logging) => {      //清除其他提供程序       logging.ClearProviders();                 logging.SetMinimumLevel(LogLevel.Trace);             }).UseNLog().UseStartup<Startup>();     
});

使用minimal API看起来简单得多:

using NLog.Web; var builder = WebApplication.CreateBuilder(args); //清除其他提供程序  
builder.Logging.ClearProviders(); 
builder.Logging.SetMinimumLevel(LogLevel.Trace); 
builder.WebHost.UseNLog();

在这里,您可以根据需要添加任意多个日志记录提供程序。

回顾 & 思考

现在,让我们回顾一下本文所涵盖的内容:

  • 配置日志记录

  • 创建自定义日志记录

  • 使用第三方日志框架

思考:我们应该如何自定义应用的配置?欢迎关注下篇内容《如何自定义.NET 6.0的应用配置》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Erdas监督分类方法提取城镇用地信息完整实验操作步骤

打开erdas,分波段加载landsat TM 影像信息,并转成img图像格式文件。 1.打开erdas,点击viewer打开新窗口,点击打开图标,选择要加载的一个波段的tif图像,点击OK。 2.点击主窗口File——Save——Top Layer As…,在跳出的Save窗

通过Xshell上传下载文件

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff09;安装模块 yum install lrzsz 2&#xff09;使用命令 rz #上传文件到Linux sz hello.txt #从Linux下载文件hello.txt 转载于:https://my.oschina.net/u/2351685/blog/519941

Centos 安装配置 vsftpd

为什么80%的码农都做不了架构师&#xff1f;>>> 一、安装vsftpd 执行 yum -y install vsftpd (rpm -qa|grep vsftpd 可查看是否已安装vsftpd, 默认配置文件在/etc/vsftpd/vsftpd/conf) 二、创建虚拟用户 选择在根目录或者用户目录下创建ftp文件夹&#xff1a;mkdir…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(6)不会这个知识点代码越写越难

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

你还在用GIF?那就out了

前言今天介绍一篇使用json格式在wpf中播放动画效果&#xff1b;正文话说在上古&#xff08;1987&#xff09;时代&#xff0c;Gif因其体积小成像相对清晰和非常强的兼容性&#xff0c;而大受欢迎;Gif也因为当时的技术限制导致很多缺陷 这包括对电脑的内存和性能占用非常大;同时…

【摄影测量原理】第一章:摄影测量学基础

目 录 第一节 摄影测量学的定义、任务 第二节 摄影测量与遥感的分类 第三节 摄影测量与遥感的发展历程 第四节 遥感主要应用领域及3S技术 第一节 摄影测量学的定义、任务 先来看一下例子&#xff1a; 思考&#xff1a; 1、摄影测量去常规测量的相同点与不同点&#…

云堆栈三大服务模式解析

如果准备使用云计算或者要在自己的IT环境中部署云计算&#xff0c;首先要确定合适的服务模式。这就需要我们对每种服务模式含义和特点都有所了解&#xff0c;很清楚从中能够获得哪些有益东西。正所谓“知己知彼百战不殆”&#xff0c;我们要对自己想要得到什么非常了解&#xf…

Excel数据生成SQL insert语句

CONCATENATE("insert into teacher(ID, NAME, ADDRESS) values (",A1,",",B1,",",C1,");")转载于:https://blog.51cto.com/kxtand/1704951

《看聊天记录都学不会Python到游戏实战?太菜了吧》(5)用前朝的剑斩今朝的官

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【摄影测量原理】第二章:单幅影像解析基础

本章提纲: 第一节 空中摄影基本知识第二节 中心投影与正射投影第三节 共线方程第四节 航摄像片的像点位移第五节 单幅影像解析基础第一节 空中摄影基本知识 2.1.1 航空摄影机 1. 光学航空摄影机 <

Blazor Hybrid / MAUI 简介和实战

1. BlazorBlazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架&#xff1a;使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI。共享使用 .NET 编写的服务器端和客户端应用逻辑。将 UI 呈现为 HTML 和 CSS&#xff0c;以支持众多浏览器&#xff0c;其中包括移动浏览器。与…

SpringMVC总结帖

SpringMVC是基于MVC设计理念的一款优秀的Web框架&#xff0c;是目前最流行的MVC框架之一&#xff0c;SpringMVC通过一套注解&#xff0c;让POPJ成为处理请求的控制器&#xff0c;而无需实现任何接口&#xff0c;然后使用实现接口的控制器也完全没问题&#xff1b;支持REST风格的…

基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客&#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N…

关 于 解 析 php 的 问 题

在搭建discuz论坛的时候出的问题&#xff0c;上次搭建用的是2.2版本&#xff0c;这次下了个2.4版的Apache发现有好多地方不一样&#xff1b;比如在order deny allow 方面就变了Deny from all变成Require all deniedAllow from all变成Require all granted今天在配置完后开始在浏…

【摄影测量原理】第三章:双像立体测图

本章主要内容: 第一节 人眼的立体视觉和立体观测第二节 立体像对相对定向和核线几何第三节 立体像对的前方交会第四节 单元模型的绝对定向第五节 双像解析摄影测量 第一节 人眼的立体视觉和立体观测 1.1 人眼的立体视觉 人用双眼判断景物可判断其远近,得到…

linux源码编译emqttd,emqtt编译及简单测试记录

emqtt&#xff1a;在Erlang中实现的MQTT客户端库和命令行工具&#xff0c;支持MQTT v5.0 / 3.1.1 / 3.1。下载源码编译cd emqtt & make运行./rebar3 shell测试1、初始化{ok, ConnPid} emqtt:start_link([{clientid, "2020"},{keepalive, 0},{proto_ver, v5},{ho…

《看聊天记录都学不会C语言?太菜了吧》(18)2分钟搞结构体

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

「System Design」设计一个短链接系统

短链接系统可以把比较长的 URL 网址转换成简短的网址字符串&#xff0c;短链接的优势是方便传播。适合在一些对字符串长度有要求的场景中使用&#xff0c;比如短信&#xff0c;微博等&#xff0c;比如https://www.cnblogs.com/myshowtime/p/16227260.html转换成短链接为https:/…

iOS中 Animation 动画大全 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang 新浪微博&#xff01; iOS开发者交流QQ群&#xff1a; 4463102061.iOS中我们能看到的控件都是UIView的子类,比如UIButton UILabel UITextField UIImageView等等 2.UIView能够在屏幕的显示是因为在创建它的时候内部自动添加一个CALa…

IROS 2017上,这些厂商将会给我们展示什么样的黑科技?

相比起大多数AI学术会议&#xff0c;机器人领域最具影响力的学术会议IROS要“好看”得多。在这个学术会议上不仅会有AI和机器人领域最新的研究成果的论文展示&#xff0c;更有不少来自于科研机构和机器人领域公司机器人&#xff0c;向我们展示着展示机器之美。 比如&#xff0c…