.NET Core3.0 日志 logging的示例分析
创始人
2024-11-27 09:40:22
0次

.NET Core3.0 日志 logging的示例分析

多年的经验,日志记录是软件开发的重要组成部分。没有日志记录机制的系统不是完善的系统。在开发阶段可以通过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(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();
        })

创建日志

在 Web 应用或托管服务中,由依赖关系注入 (DI) 获取 ILogger。

private readonly ILogger _logger;
    public WeatherForecastController(ILogger logger)
    {
      _logger = logger;
      
      //可以显示指定类别名称ILoggerFactory logger
      //logger.CreateLogger("WebApi.Controllers.WeatherForecastController");
    }
[HttpGet]
    public IEnumerable 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"); //

.NET Core3.0 日志 logging的示例分析

.NET Core3.0 日志 logging的示例分析

.NET Core3.0 日志 logging的示例分析

非主机控制台

添加提供程序

在创建 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();
logger.LogInformation("非主机模式输出log message");

·

运行输出

.NET Core3.0 日志 logging的示例分析

第三方日志框架

log4net,NLog和Serilog这3种日志记录框架几乎在.NET空间中占主导地位,不需要太多介绍。看看最近6周的下载排名就知道了。如图

.NET Core3.0 日志 logging的示例分析

log4net 在NET Core 3.0使用

.NET Core3.0 日志 logging的示例分析

引用Log4net到项目中,安装NuGet包

Install-Package log4net -Version 2.0.8

在项目中添加log4net.config文件,右键改文件属性-》复制到输出目录选择-》始终复制


 
  
  
  
  

  
   
  
 

 
  
  
 

在Startup文件中添加log4net配置的文件

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }
      app.UseLog4net();
  /// 
    /// 使用log4net配置
    /// 
    /// 
    /// 
    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 logger)
    {
      this.log = LogManager.GetLogger(typeof(WeatherForecastController));
    } [HttpGet]
    public IEnumerable Get()
    {
      //第三方日志
      log.Error("log4net erro msg"); //log4net

运行查看日志文件

.NET Core3.0 日志 logging的示例分析

NLog 在NET Core 3.0使用

.NET Core3.0 日志 logging的示例分析

引用NLog到项目中,安装NuGet包

Install-Package NLog.Web.AspNetCore -Version 4.9.0
Install-Package NLog -Version 4.6.7

添加配置文件nlog.config




 
 
  
 

 
 
  
  

  
  
 

 
 
  
  

  
  
  
  
 

在Program.cs文件配置 Main方法添加

NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();

CreateHostBuilder方法添加

 .UseNLog() //NLog: Setup NLog for Dependency injection

使用

[HttpGet]
    public IEnumerable 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"); //

.NET Core3.0 日志 logging的示例分析

Serilog 在NET Core 3.0使用

.NET Core3.0 日志 logging的示例分析

引用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 日志 logging的示例分析

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...