.NET Core 中的 Logging 简单实用 - 记录日志消息显示到控制台

.NET Core 支持适用于各种内置和第三方日志记录提供程序的日志记录 API。 本文介绍了如何将日志记录 API 与内置提供程序一起使用。
本文中所述的大多数代码示例都来自 .Net 5 应用。

首先创建一个控制台引用程序

创建 HostRunner 类 并注入 ILogger 对象

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;

namespace DotNetLoggingDemo
{
    public class HostRunner : BackgroundService
    {
        private readonly ILogger<HostRunner> _logger;

        public HostRunner(ILogger<HostRunner> logger)
        {
            _logger = logger;
        }

        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("这是日志消息");
            return Task.CompletedTask;
        }
    }
}

可以看出 HostRunner 类中的代码非常简单。
首先 HostRunner 继承自 BackgroundService,对于 BackgroundService 的实用,这里暂时不展开说明,
从代码中可以看出, 通过构造函数注入的方式,注入了 ILogger, 使用方式也很简单,我们在重写函数 ExecuteAsync 的时候直接使用 _logger.LogInformation 函数即可记录一条日志级别为 Information 的日志消息。

说明:
示例中使用 ILogger 自动获取使用完全限定类型名称 T 作为类别的 ILogger 实例,也可以使用显示指定类别,实现相同的功能,需调用 ILoggerFactory.CreateLogger,

private readonly ILogger _logger;
public HostRunner(ILoggerFactory logger)
{
   _logger = logger.CreateLogger(typeof(HostRunner).FullName.ToString()); // 此处也可以填写自定义任意类别名称
}

接下来在 Program 中写入如下代码

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace DotNetLoggingDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console.WriteLine("Hello World!");

            CreateHostBuilder(args).Build().Run();
        }

        static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureLogging(config =>
            {
                config.AddConsole();
            })
            .ConfigureServices((context, service) =>
            {
                service.AddHostedService<HostRunner>();
            });
    }
}

我们创建了一个泛型主机,并配置日志记录输出到控制台中,到现在,所有的代码就写完了

下面运行看一下执行效果:

日志消息的记录可以使用消息模版,每个日志 API 都使用一个消息模板。 消息模板可包含要填写参数的占位符。 注意,占位符中使用名称而不是数字。

string p1 = "param1";
string p2 = "param2";
_logger.LogInformation("Parameter values: {p2}, {p1}", p1, p2);

我们改造一下 HostRunnerExecuteAsync 的代码

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;

namespace DotNetLoggingDemo
{
    public class HostRunner : BackgroundService
    {
        private readonly ILogger<HostRunner> _logger;

        public HostRunner(ILogger<HostRunner> logger)
        {
            _logger = logger;
        }

        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            int count = 10;
            for (int i = 0; i < count; i++)
            {
                Thread.Sleep(100);
                _logger.LogInformation("这是日志消息 {序号}/{总数}。", i, count);

            }
            return Task.CompletedTask;
        }
    }
}

运行看一下效果:

查看或下载示例代码

下面列举了所有的日志级别进行列举

级别 方法 描述
Trace 0 LogTrace 描述不可恢复的应用程序/系统崩溃或需要立即引起注意的灾难性故障的日志。
Debug 1 LogDebug 在开发过程中用于交互式调查的日志。 这些日志应主要包含对调试有用的信息,并且没有长期价值。
Information 2 LogInformation 跟踪应用程序的常规流的日志。 这些日志应具有长期价值。
Warning 3 LogWarning 突出显示应用程序流中的异常或意外事件(不会导致应用程序执行停止)的日志。
Error 4 LogError 当前执行流因故障而停止时突出显示的日志。 这些日志指示当前活动中的故障,而不是应用程序范围内的故障。
Critical 5 LogCritical 描述不可恢复的应用程序/系统崩溃或需要立即引起注意的灾难性故障的日志。
None 6 不用于写入日志消息。 指定日志记录类别不应写入任何消息。
posted @ 2021-08-05 15:53  Earen  阅读(2018)  评论(0编辑  收藏  举报