(14)ASP.NET Core2.2 中的日志记录

作者:老葱头蒸鸡日期:2025/10/2

1.前言

ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API。本文介绍了如何将日志记录API与内置提供应用程序一起使用。

2.添加日志提供程序

日志记录提供应用程序显示或存储日志。例如,控制台提供应用程序在控制台上显示日志,Azure Application Insights提供应用程序将这些日志存储在Azure Application Insights中。要添加提供应用程序,请在Program.cs中调用提供程序的Add{provider name}扩展方法:

1public static void Main(string[] args)
2{
3    var webHost = new WebHostBuilder()
4        .UseKestrel()
5        .UseContentRoot(Directory.GetCurrentDirectory())
6        .ConfigureAppConfiguration((hostingContext, config) =>
7        {
8            var env = hostingContext.HostingEnvironment;
9            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
10                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", 
11                      optional: true, reloadOnChange: true);
12            config.AddEnvironmentVariables();
13        })
14        .ConfigureLogging((hostingContext, logging) =>
15        {
16            //添加appsettings.json中关于日志的Logging节点配置
17            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
18            //日志控制台记录提供程序
19            logging.AddConsole();
20            //日志Debug记录提供程序
21logging.AddDebug();
22            //日志EventSource记录提供程序
23logging.AddEventSourceLogger();
24        })
25        .UseStartup<Startup>()
26        .Build();
27    webHost.Run();
28}

默认项目模板调用CreateDefaultBuilder,该操作将添加日志记录(控制台、DEBUG、EventSource)提供给应用程序:

1public static void Main(string[] args)
2{
3    CreateWebHostBuilder(args).Build().Run();
4}
5public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
6    WebHost.CreateDefaultBuilder(args)
7        .UseStartup<Startup>();

3.创建日志

创建日志可以从依赖注入(DI)中获取ILogger<TCategoryName>对象。以下Razor页面示例会创建级别为Information且类别为AboutModel类(Models/AboutModel)的日志:

1public class AboutModel
2{
3    private readonly ILogger _logger;
4    public AboutModel(ILogger<AboutModel> logger)
5{
6   //ILogger是Core内置日志组件,默认已经注入,无需再次手动注入
7        _logger = logger;
8    }
9    public void OnGet()
10    {
11        var Message = $"About page visited at {DateTime.UtcNow.ToLongTimeString()}";
12        _logger.LogInformation("Message displayed: {Message}", Message);
13    }
14}
15private readonly ILogger<AboutModel> _logger;
16public HomeController(ILogger<AboutModel> logger)
17{
18    _logger = logger;
19}
20public IActionResult Index()
21{
22    AboutModel aboutModel = new AboutModel(_logger);
23    aboutModel.OnGet();
24    return View();
25}

通过Kestral服务器启动调试:

看看控制台输出日志记录:

日志“级别”代表所记录事件的严重程度。日志“类别”是与每个日志关联的字符串。ILogger<T>实例会创建“类别”为类型T的完全限定名称的日志。

3.1启动时(Startup)创建日志

要将日志写入Startup类,构造函数签名需包含ILogger参数:

1public class Startup
2{
3    private readonly ILogger _logger;
4    public Startup(IConfiguration configuration, ILogger<Startup> logger)
5    {
6        Configuration = configuration;
7        _logger = logger;
8    }
9    public IConfiguration Configuration { get; }
10    public void ConfigureServices(IServiceCollection services)
11    {
12        _logger.LogInformation("Added TodoRepository to services");
13    }
14    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
15    {
16        if (env.IsDevelopment())
17        {
18            _logger.LogInformation("In Development environment");
19        }
20    }
21}

通过Kestral服务器启动调试看看控制台输出日志记录:

3.2在程序中(Program)创建日志

如果使用CreateDefaultBuilder,则可自行选择提供应用程序来替换默认应用程序。调用 ClearProviders,然后添加所需的应用程序:

1public class Program
2{
3    public static void Main(string[] args)
4    {
5        var host = CreateWebHostBuilder(args).Build();
6        var logger = host.Services.GetRequiredService<ILogger<Program>>();
7        logger.LogInformation("Seeded the database.");
8        host.Run();
9    }
10    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
11    WebHost.CreateDefaultBuilder(args)
12    .UseStartup<Startup>()
13    .ConfigureLogging(logging =>
14    {
15        logging.ClearProviders();
16        logging.AddConsole();
17    });
18}

通过Kestral服务器启动调试看看控制台输出日志记录:

4.Configuration

日志记录提供程序配置由一个或多个配置提供程序提供:
●文件格式(INI、JSON 和 XML)。 ●命令行参数。 ●环境变量。 ●内存中的.NET对象。 ●未加密的机密管理器存储。 ●加密的用户存储,如 Azure Key Vault。 ●(已安装或已创建的)自定义提供程序。
例如,日志记录配置通常由应用设置文件的Logging部分提供。以下示例显示了典型 appsettings.Development.json 文件的内容:

1{
2  "Logging": {
3    "LogLevel": {
4      "Default": "Debug",
5      "System": "Information",
6      "Microsoft": "Information"
7    },
8    "Console":
9    {
10      "IncludeScopes": true
11    }
12  }
13}

Logging属性可具有LogLevel和日志提供程序属性(显示控制台)。Logging下的LogLevel属性指定了用于记录所选类别的最低级别。在本例中,System和Microsoft类别在Information级别记录,其他均在Debug级别记录。如果提供程序支持日志作用域,则IncludeScopes将指示是否启用这些域。

5.日志级别

每个日志都指定了一个LogLevel值。日志级别指示严重性或重要程度。如果LogLevel是Warning级别,那么跟踪Trace,Debug,Information级别将不会记录。ASP.NET Core 定义了以下日志级别(按严重性从低到高排列):
●跟踪Trace = 0 ●调试Debug = 1 ●信息 Information = 2 ●警告 Warning = 3 ●错误 Error = 4 ●严重 Critical = 5

6.内置日志记录提供程序

**●控制台:**logging.AddConsole(); dotnet run 查看控制台日志记录输出。
**●调试:**logging.AddDebug(); 在 Linux 中,此提供程序将日志写入 /var/log/message。
**●EventSource:**logging.AddEventSourceLogger();在Windows中,它使用PerfView实用工具收集和查看日志,但尚无支持Linux或macOS的事件集合和显示工具。
**●EventLog:**logging.AddEventLog();向Windows事件日志发送日志输出。
**●TraceSource:**logging.AddTraceSource(sourceSwitchName);应用必须在.NET Framework(而非.NET Core)上运行。

7.第三方日志记录提供程序

适用于ASP.NET Core的第三方日志记录框架,链接地址官方文档中有:
●elmah.io(GitHub 存储库) ●Gelf(GitHub 存储库) ●JSNLog(GitHub 存储库) ●KissLog.net(GitHub 存储库) ●Loggr(GitHub 存储库) ●NLog(GitHub 存储库) ●Sentry(GitHub 存储库) ●Serilog(GitHub 存储库) ●Stackdriver(Github 存储库)
例如使用NLog:NLog是一个灵活的免费日志记录平台,适用于各种.NET平台,包括.NET标准。NLog可以轻松写入多个目标。(数据库,文件,控制台)并即时更改日志记录配置。

8.总结

这篇主要讲了asp.net core内置的日志提供程序,内置的日志自带功能还是有限,比如不能写入到.txt文件或数据库中。在项目使用中还是要考虑使用第三方日志提供程序。本篇对于内置的日志提供程序还有:日志消息模板、日志作用域、Azure中的日志记录、日志事件ID等未介绍,具体再参考官方文档。

参考文献:
ASP.NET Core 中的日志记录https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/logging/?view=aspnetcore-9.0&viewFallbackFrom=aspnetcore-2.2#third-party-logging-providers


(14)ASP.NET Core2.2 中的日志记录》 是转载文章,点击查看原文


相关推荐


Python 的内置函数 abs
IMPYLH2025/10/2

Python 内建函数列表 > Python 的内置函数 abs 无论是在数学计算、数据分析,还是日常编程中,我们经常需要获取一个数的绝对值。Python 提供的 abs() 函数,可以让我们轻松地计算数字的绝对值,而无需手动判断正负。 abs 函数的参数和返回值如下: def abs(x): ''' 计算参数的绝对值 :param x: 要计算的值 :return: x 的绝对值 ''' 示例 在线运行 print(abs(-50)) p


[论文阅读] 人工智能 + 软件工程 | 从“人工扒日志”到“AI自动诊断”:LogCoT框架的3大核心创新
张较瘦_10/1/2025

随着软件服务系统日益庞大、复杂,基于日志的故障诊断对保证软件服务的可靠性至关重要。已有的日志故障诊断方法虽能确定故障类型,但无法为推理过程提供解释,导致难以在生产环境部署。为此,本文提出LogCoT框架,通过Auto-FSC算法利用超大规模闭源LLM提取日志语义,生成可解释根因分析报告;结合无类别标注指令优化与有类别标注参数微调,优化Mistral基座模型;再用LLMf-IPO算法纠正错误结果,对齐用户意图。在两大生产日志数据集上的实验表明,LogCoT在Accuracy、Macro-F1、Weighted


WPS文字如何合并多个文档:两种方法
揭老师高效办公9/30/2025

要合并多个Word文档,使用WPS文字有两种方法,一种是插入附件,引用附件中的文字,会把所有文档中的文字依次合并。第二种方式需要会员,使用WPS的“文档合并拆分”应用,每个文档都会从新的一页开始插入。


Java-Spring入门指南(十一)代理模式与Spring AOP实战
珹洺2025/10/2

Java-Spring入门指南(十一)代理模式与Spring AOP实战 前言一、代理模式1.1 静态代理步骤1:定义租房接口(抽象行为)步骤2:实现房东类(真实对象)步骤3:编写中介类(代理对象)步骤4:测试静态代理静态代理的优缺点 1.2 动态代理 二、AOP是什么?2.1 AOP是什么?2.2 AOP有什么用?2.3 AOP的使用场景是什么?2.4 AOP的核心特点是什么? 三、AOP在Spring中的应用3.1 准备依赖3.2 配置Spring的AOP命名空间3.3 定义


医院病人信息管理系统 Web 版开发实战(一)
FPGA+护理+人工智能2025/10/3

医院病人信息管理系统Web版开发实战 文章目录 医院病人信息管理系统Web版开发实战一、概述二、项目结构搭建2.1 Flask 项目结构原理2.2 创建项目文件夹2.3 初始化 Flask 应用 三、路由设计3.1 Flask 路由机制原理3.2 定义核心路由3.3 数据存储函数 四、模板开发4.1 Jinja2 模板引擎原理4.2 基础模板设计4.3 首页模板(index.html)4.4 添加病人模板(add.html)4.5 详情和编辑模板 未完待续


精选 4 款开源免费、美观实用的 MAUI UI 组件库,助力轻松构建美观且功能丰富的应用程序!
追逐时光者2025/10/5

前言 一套优秀的 UI 组件库不仅能大幅提升开发效率,还能显著增强应用的视觉体验与交互质感。今天大姚给大家分享 4 款开源免费、美观实用的 MAUI UI 组件库,助你轻松打造专业级的跨平台应用程序。 .NET MAUI介绍 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET开源免费的跨平


Android系统模块编译调试与Ninja使用指南
龙之叶2025/10/6

模块编译调试方法 (此处举例framework、installd、SystemUI等模块的编译调试,其他类似) 1. Framework模块编译 Android系统代码的framework目录内,一共有3个模块单独编译:framework、services、framework-res.apk。 注意:偶尔会有改了代码但没检测到,编译结束后产物并未更新的情况,所以可以考虑先剪切掉原先的产物或者检查产物更新时间确保已经重新编译。 步骤: 完成根目录下 source build/envsetup.sh


Webpack实战笔记:从自动构建到本地服务器搭建的完整流程
XiangCoder2025/10/7

作为前端开发者,Webpack 是绕不开的构建工具。最近系统学习了 Webpack 的自动构建和服务器搭建,整理了一套从基础到实战的操作笔记,包含具体案例和踩坑经验,适合新手跟着实操。 前言:为什么需要 Webpack 构建工具? 刚开始写前端项目时,我们习惯在 index.html 里手动引入各种 js、css 文件。但随着项目变大,会遇到两个核心问题: 资源越来越多,手动管理引入路径容易出错(尤其是加哈希值优化缓存时); 开发时需要频繁刷新页面看效果,效率太低。 Web


单机已达上限?PerfTest 分布式压测登场,轻松模拟百万用户洪峰
Go有引力2025/10/9

前言 在前一篇文章中,我们详细介绍了 perftest 的单机压测能力,展示了它如何通过极简的命令行实现对 HTTP/1.1、HTTP/2、HTTP/3 与 WebSocket 的高性能测试。然而,当业务系统庞大、服务部署分布式、网络链路复杂时,单机的压测能力显然无法满足真实生产环境的模拟需求。 幸运的是,perftest 不止于单机。它同样支持 分布式集群压测,通过 Collector + Agent 的架构,让你轻松在多台机器上同时发起测试,实现百万乃至千万级并发的性能评估。 为什么选择分


老题新解|十进制转二进制
程序员莫小特2025/10/10

《信息学奥赛一本通》第160题:十进制转二进制 题目描述 给定一个十进制整数 n n n,请将其转换为对应的二进制表示,并输出。 输入格式 输入包含一行,一个整数 n

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0