ASP.NET Core 中的日志记录

内置日志的使用

Logger 是 asp .net core 的内置 service,所以我们就不需要在ConfigureService里面注册了。同时在asp.net core 2.0版本及以后,系统已经在CreateDefaultBuilder方法里默认配置了输出到Console和Debug窗口的Logger。

.ConfigureLogging(delegate(WebHostBuilderContext hostingContext, ILoggingBuilder logging)
{
    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
    logging.AddConsole();
    logging.AddDebug();
})

所以我们可以Controller里面直接注入ILoggerFactory然后再创建具体的Logger。

private readonly ILogger _logger;
public HomeController(ILoggerFactory logger)
{
    _logger = logger.CreateLogger<HomeController>();
}

但是还有更好的方式,Container可以直接提供一个ILogger的实例,这时候呢Logger就会使用T的名字作为日志的类别:

private readonly ILogger _logger;
public HomeController(ILogger<HomeController> logger)
{
    _logger = logger;
}

然后在【Output】窗口中可以看到输出的日志:

LogDemo> info: LogDemo.Controllers.HomeController[0]
LogDemo>       Return Index view

Log到Debug窗口或者Console窗口还是比较方便的,但是正式生产环境中这肯定不够用。正式环境应该Log到文件或者数据库等。接下来试下Nlog。

使用Nlog

  1. NuGet添加 NLog.Web.AspNetCore

    <PackageReference Include="Microsoft.AspNetCore.App" />
  2. 添加配置文件

    新建一个文件nlog.config(建议全部小写,linux系统中要注意), 并右键点击其属性,将其“复制到输出目录”设置为“始终复制”。文件内容如下

    <?xml version="1.0" encoding="utf-8" ?>
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          autoReload="true"
          internalLogLevel="info"
          internalLogFile="c:\temp\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="c:\temp\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="c:\temp\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>
        <Content Update="nlog.config">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        </Content>
  3. 修改Program.cs文件

    添加引用 NLog.Web 和 Microsoft.Extensions.Logging。
    在 .UseStartup() 后添加一句 .UseNLog()

    如果要禁用默认的输出框日志,可以调用logging.ClearProviders()

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(LogLevel.Trace);
            })
            .UseNLog();
  4. 输出到数据库

    除了把日志输出到文件之外,也可以保存到SQL Server, PostgreSQL, MySQL, Elasticsearch等。下面是保存到SQL Server的一个示例配置:

    <?xml version="1.0" encoding="utf-8" ?>
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          autoReload="true"
          internalLogLevel="info"
          internalLogFile="d:\temp\logs\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="d:\temp\logs\all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
    
        <target name="blackhole" xsi:type="Null" />
    
        <target name="database" xsi:type="Database" dbProvider="System.Data.SqlClient">
          <connectionString>
            Server=.;Database=Log;Trusted_Connection=True
          </connectionString>
          <commandText>
                  insert into dbo.Log (
                  Application, Logged, Level, Message,
                  Logger, CallSite, Exception
                  ) values (
                  @Application, @Logged, @Level, @Message,
                  @Logger, @Callsite, @Exception
                  );
              </commandText>
    
              <parameter name="@application" layout="Application" />
              <parameter name="@logged" layout="${date}" />
              <parameter name="@level" layout="${level}" />
              <parameter name="@message" layout="url: ${aspnet-request-url} | action: ${aspnet-mvc-action} | ${message}" />
    
              <parameter name="@logger" layout="${logger}" />
              <parameter name="@callSite" layout="${callsite:filename=true}" />
              <parameter name="@exception" layout="${exception:tostring}" />
        </target>
      </targets>
    
      <!-- rules to map from logger name to target -->
      <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Info" 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="Info" writeTo="database" />
      </rules>
    </nlog>
  5. 配置简要说明

    targets:用于配置输出相关内容,比如 type 属性可选项为File、Mail、Console等,用于设置输出目标,layout属性用于设置输出信息的组成元素及格式。
    rules: 其实是一个“路由表”,日志是从上到下匹配的。 logger name="Microsoft." maxlevel="Info" final="true" 一句话的 final="true" 过滤掉了"Microsoft." Info级别以下的日志。

  6. 全局异常中间件

    除了输出日志外,可以写一个中间件来处理全局的异常。

    public class GlobalErrorHandlingMiddleware
    {
        private readonly RequestDelegate next;
        private readonly ILogger<GlobalErrorHandlingMiddleware> _logger;
    
        public GlobalErrorHandlingMiddleware(RequestDelegate next, ILogger<GlobalErrorHandlingMiddleware> logger)
        {
            this.next = next;
            this._logger = logger;
        }
    
        public async Task Invoke(HttpContext context)
        {
            try
            {
                await next(context);
            }
            catch (Exception ex)
            {
    
                var Request = context.Request;
                ///访问路径
                string visit_url = Request.Path;
                ///URL 请求方法
                string method = Request.Method.ToUpper();
                ///URL 请求的参数
                string url_paramters = string.Empty;
    
                if (method == "GET") url_paramters = Request.QueryString.Value;
    
    
                if (method == "POST")
                {
                    foreach (var item in Request.Form)
                        url_paramters = url_paramters + item.Key + "=" + item.Value + "&";
                }
    
                ///错识信息
                string err_msg = ex.Message;//ex.StackTrace;
    
                ///日志格式内容
                var logs_msg = $"{visit_url}#{method}#{url_paramters}#{err_msg}";
    
                _logger.LogError(logs_msg);
    
                var statusCode = context.Response.StatusCode;
    
                var msg = $"Status Code: {statusCode}, Message: {ex.Message}";
    
                await HandleExceptionAsync(context, msg);
            }
        }
    
        private static Task HandleExceptionAsync(HttpContext context, string msg)
        {
            //var data = new Result { Title = "异常中间件返回", Msg = msg };
            //var result = JsonConvert.SerializeObject(data);
            //context.Response.ContentType = "application/json;charset=utf-8";
            return context.Response.WriteAsync(msg);
        }
    }
    
    public static class GlobalErrorHandlingMiddlewareExtensions
    {
        public static IApplicationBuilder UseGlobalErrorHandlingMiddleware(
            this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<GlobalErrorHandlingMiddleware>();
        }
    }

集成ELK

  1. ELK简介

    ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。现在新增了一个FileBeat,它是一个轻量级的日志收集处理工具。
    • Logstash: 是动态数据收集管道,能够同时从多个来源采集数据、转换数据、然后将数据存到数据库中。
    • Elastaicsearch: 分布式搜索和分析引擎,提供搜集、分析、存储数据三大功能。。
    • Kibana:数据可视化Web。
    • Beats: 轻量型采集器的平台,从边缘机器向 Logstash 和 Elasticsearch 发送数据。

    ELK

  2. 环境快速搭建

    这里使用docker-compose一键搭建ELK测试环境:
    1. 请确保已经安装Docker-compose

      docker-compose --version
    2. 下载代码从 The ELK stack powered by Docker and Compose 从并运行:

      git clone https://github.com/deviantony/docker-elk.git
      cd docker-elk
      docker-compose up -d
    3. 浏览器上访问安装服务器的ip:5601 可以打开 kibana 管理后台
      • 5000: Logstash TCP input.
      • 9200: Elasticsearch HTTP
      • 9300: Elasticsearch TCP transport
      • 5601: Kibana
  3. 修改nlog配置文件

    <target xsi:type="Network"
            name="ownLog-tcp"
            keepConnection="false"
            address="tcp://IP:5000"
            layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
    

    启动项目测试,进入 kibana 后台配置并添加 index pattern。

  4. 其他写入Elasticsearch的方法

    把日志写入Elasticsearch的方法可以有多种:
    • Logstash:如上面的例子。它的优势是灵活性和诸多插件,它的问题是性能以及资源消耗。
    • Filebeat:轻量级的日志传输工具,可以将将日志直接传输存储到 Elasticsearch,也可经过Logstash或者Kafka/Redis。
    • .Net Core logger provider:如果仅限于 .Net Core的话,可以基于Elasticsearch的 .Net Core SDK封装一个日志提供程序直接写入Elasticsearch。

参考

转载于:https://www.cnblogs.com/royzshare/p/9454625.html

.NET CoreASP.NET Core 日志记录:你需要知道的5个关键步骤 🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。 阅读详情

相关推荐

掌握ASP.NET Core日志记录与部署的艺术

本文深入探讨了ASP.NET Core中的日志记录和部署技巧,涵盖了如何通过结构化日志简化生产错误排查、使用作用域为日志添加属性以提高诊断效率,以及发布和部署ASP.NET Core应用程序的不同方法。文章详细介绍了日志记录的重要性,如何通过不同方式控制日志输出,以及如何在IIS和Linux环境下托管和部署应用。

weixin_28235889的博客 328

ASP.NET Core 日志

NET Core 支持适用于各种内置和第三方日志记录提供程序的日志记录 API。 内置日志记录提供程序 Console:logging.AddConsole(); dotnet run 查看控制台日志记录输出。 Debug:调试logging.AddDebug(); 在 Linux 中,此提供程序将日志写入 /var/log/message。 EventSource: logging.AddEventSourceLogger(); 在 Windows 中,它使用 PerfView 实用工具收集和查看日志,

随笔 1199

掌握日志记录ASP.NET Core的应用与实践

本文深入探讨了ASP.NET Core中的日志记录机制,包括其在生产环境中的有效使用方法。通过在日志消息中附加键值对数据,日志记录不仅有助于简化错误查找过程,还能在审计、分析和记录非错误事件中发挥关键作用。文中强调了日志记录对于问题诊断的重要性,并展示了ASP.NET Core如何通过内置的基础设施日志记录和用户自定义日志消息来辅助开发者快速定位和解决问题。

weixin_35829279的博客 455

玩转ASP.NET Core中的日志组件

简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息。ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console Debug EventSource EventLog TraceSource Azure App Service 除了内置的日志提供器,ASP.NET Core还支持了多种第三方日志工具,例如 ...

weixin_30389003的博客 565

ASP.NET Core 基础知识】--部署和维护--日志记录和错误处理

ASP.NET Core 日志记录和错误处理是开发 ASP.NET Core 应用程序中至关重要的方面。本文介绍了日志记录和错误处理的基本概念、内置提供程序、第三方提供程序以及它们在应用程序开发中的应用。在文章中,我们首先讨论了日志记录的概念,它是记录应用程序运行时状态、活动和事件的过程。随后,我们介绍了 ASP.NET Core 内置的日志记录提供程序,包括控制台、调试、事件源、EventLog、TraceSource 等。通过使用这些内置提供程序,开发人员可以方便地记录日志并查看应用程序的运行情况。

喵叔 2506

ASP.NET Core - 日志记录系统()

NET Core 框架中内置了日志记录系统,支持通过统一的 API 进入日志的记录,并且支持通过配置各种日志提供程序以各种不同的方式保存日志信息,不仅有多种内置的日志提供程序,也兼容各种按照标准规范实现的第三方框架。这样一个日志记录器实例。日志记录器在创建的时候需要指定日志类别,它会与该记录器的记录的每一条日志关联,方便我们在众多的日志信息中查找特定的日志。我们可以在记录日志的时候指定日志的级别,但是并不是我们记录的任何一个级别的日志都会输出保存,还得配合日志记录系统的配置,就像上面的例子中,最开始。

weixin_37648525的博客 2043

.NET Core下的日志(1):记录日志信息

记录各种级别的日志是所有应用不可或缺的功能。关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net、NLog、Loggr和Serilog 等,当然我们还可以选择微软原生的诊断机制(相关API定义在命名空间“System.Diagnostics”中)实现对日志的记录。.NET Core提供了独立的日志模型使我们可以采用统一的API来完成...

weixin_33670713的博客 506

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

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

wzk153的博客 1192

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core提供了强大的日志记录功能,支持多种内置日志提供程序(控制台、调试、EventSource等),并允许通过ILogger接口实现自定义日志记录。开发者可以灵活配置日志级别,并通过DI注入ILogger服务。文章还详细介绍了如何创建自定义彩色控制台日志记录器,包括实现ILogger接口、配置日志级别与颜色映射,以及注册自定义日志提供程序。该日志系统可扩展性强,能满足不同应用场景的需求,是应用程序监控和问题诊断的重要工具。

morliz的博客 1398

ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门

ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门 原文:ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门一、前言 1、本教程主要内容 ASP.NET Core + 内置日志组件记录控制台日志 ASP.NET Core + NLog 按天记录本地日志...

weixin_30802171的博客 316

ASP .NET Core 中的请求-响应日志记录

尽管仍然记录发生的异常,但我们不再需要依赖它,因为我们在日志中间件ExceptionHandlerMiddleware中记录了异常。如您所见,尽管我们记录了很多内容,但我们无法真正说出有关请求的很多信息。我们可能会找出哪个端点被击中以及我们的响应是否成功(如果我们使用 http 状态代码),但仅此而已。此外,在高负载环境中,匹配请求和响应可能是一个挑战,因为它们是分开记录的。幸运的是,我们有一个 nuget 包可以弥补内置库的盲点。所以,亲爱的 .NET 海狸们,让我们看看微软给我们的日志吧!

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1229

如何在ASP.NET Core中编写自定义日志记录提供程序

目录 介绍 如何实现所需的接口 基础类和附件 FileLoggerProvider具体类及其附件 1. ConfigureLogging() 2. appsettings.json文件 介绍 源代码可以在github上找到。 在可用的文档中,没有关于如何在ASP.NET Core中编写自定义日志记录提供程序的官方说明。因此,如果有人需要在ASP.NET Core中编写自定义日志记...

寒冰屋的专栏 2155

ASP.NET Core - 日志记录系统()

显然,仅这些内置日志提供程序并不能满足我们生产开发中的使用,例如缺少最基础且常用的文件日志提供程序,还有在分布式应用已经非常普遍的业界现状下,时常需要将日志写分布式日志系统中进行统一的管理和分析,这些是微软没有提供的,但是第三方都有成熟的按照 .NET Core 日志记录系统体系架构开发的实现,这些将在下面细讲。类应用了装饰器模式,对多种日志记录提供程序的记录器进行了包装,提供了统一的日志记录 API,使得我们在使用时可以通过统一的入口将日志同时书写到不同的地方。

weixin_37648525的博客 1194

NLog写日志到数据库

需求:NLog写日志到数据库。

wuxhyou的专栏 1162

ASP.NET MVC的最佳日志记录

目录 介绍 4个日志记录库 log4net Log4net记录文本文件中 Log4net记录到数据库中 NLOG Nlog日志记录在文本文件中 NLog日志记录到数据库中 Serilog Serilog记录到文本文件中 Serilog记录到数据库中 Serilog.Settings.AppSettings ELMAH ELMAH记录数据库 在本文中,我们...

寒冰屋的专栏 5824

asp.net core日志与异常处理小结

tryelse//不包含文件实际内容_logger.LogError("堆栈:{e}\n\t路径:{c}\n\t查询字符串:{p}\n\t内容:{f}", e,context.Request.Path,context.Request.QueryString,bodystring);

风清扬的专栏 2144

ASP.NET Core 基础(八)——日志记录

日志组件包括提供器(Provider)和记录器(Logger) # 1.日志提供程序(Log provider) 框架自带的日志provider有以下几种,前4个都在`CreateDefaultBuilder`里被添加进去,后续几个需要添加nuget包。 - 控制台:即`Consol.WriteLine()` - 调试:即`Debug.WriteLine()` - EventSource:EventSource 提供程序写入名称为 Microsoft-Extensions-Logging 的跨平台事件源。

catshitone的专栏 1624

ASP.NET Core日志配置终极指南】:掌握高效日志记录的7大核心技巧

掌握ASP.NET Core日志记录配置的完整方法,解决开发与生产环境日志管理难题。涵盖内置日志提供程序、第三方框架集成、日志级别控制、结构化日志等七大技巧,提升应用可观测性与调试效率,值得收藏。

SimProceed的博客 666
上一篇: P2564 [SCOI2009]生日礼物
下一篇: Java对象的序列化和反序列化
badiu_30394251
博客等级 码龄11年 124粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值