.NET Microsoft.Extensions.Logging + NLog 记录日志到文件

最近想了解下面向对象开发,选择C# 语言 以及NET6.0
日志是开发中最常用的功能,本文记录下其中日志使用方法,理解不全的地方后续再学习补充

环境

  • Ubuntu 22.04.2 LTS
  • dotnet 6.0.411

准备工作

# https://learn.microsoft.com/zh-cn/dotnet/core/tools/dotnet-new-sdk-templates#web-others
# 使用worker模板创建一个项目,
# 项目能快速生成一个后台服务模板
dotnet new worker --use-program-main
# 安装NLog针对MicrosoftExtensions扩展
dotnet add package NLog.Extensions.Logging

在这里插入图片描述## 添加日志功能

1. 根目录添加一个nlog.conf

<?xml version="1.0" encoding="utf-8" ?>
<!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema-->
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogFile="example.log"
      internalLogLevel="Info" >
   <!-- example.log文件名可以修改 -->
  <!-- the targets to write to -->
  <targets>
    <!-- 同时写入文件和控制台 -->
    <target xsi:type="File" name="logfile" fileName="example.log"
            layout="${longdate}|${level}|${message} |${all-event-properties} ${exception:format=tostring}" />
    <target xsi:type="Console" name="logconsole"
            layout="${longdate}|${level}|${message} |${all-event-properties} ${exception:format=tostring}" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--  可修改最低日志等级 -->
    <logger name="*" minlevel="Trace" writeTo="logfile,logconsole" />
  </rules>
</nlog>

2. 注册服务

        IHost host = Host.CreateDefaultBuilder(args)
            .ConfigureServices(services =>
            {
                services.AddHostedService<Worker>();
                # 只用加以下一段
                services.AddLogging((builder) =>
                {
                    builder.ClearProviders(); 
                    builder.AddNLog();
                });
                # 只用加以下一段结束
            })
            .Build();

3. 使用

模板中的wroker已自动注入进去,不需要修改

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
        # 直接使用logger
        # _logger.LogInformation()
        # _logger.........
    }
}

完整修改如下

Program.cs

namespace dotnet_demo;
using NLog.Extensions.Logging;

public class Program
{
    public static void Main(string[] args)
    {
        IHost host = Host.CreateDefaultBuilder(args)
            .ConfigureServices(services =>
            {
                services.AddHostedService<Worker>();
                services.AddLogging((builder) =>
                {
                    builder.ClearProviders(); 
                    builder.AddNLog();
                });
            })
            .Build();

        host.Run();
    }
}

Worker.cs

namespace dotnet_demo;

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

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

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("正在执行任务,时间是: {time}", DateTimeOffset.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

效果

在这里插入图片描述

TODO

.NET Framework ASP.NET Core .NET Core Console中使用方法参考文档
https://github.com/NLog/NLog

  • 修改配置日志文件自动归档
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我可以给出以下回答: 在 .NET Framework 4.7.2 中,可以使用 Microsoft.Extensions.Configuration 来管理应用程序的配置信息。这个框架提供了一些类,可以从多种不同的配置源(如 JSON、XML、命令行参数等)中读取配置信息,并将其统一封装成一个 IConfiguration 对象,供应用程序使用。 下面是一个简单的示例,演示如何使用 Microsoft.Extensions.Configuration 读取一个名为 appsettings.json 的配置文件: 1. 首先,在项目中添加 Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.Json 包。 2. 在 appsettings.json 文件中定义需要读取的配置项,例如: ``` { "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } } } ``` 3. 在代码中读取配置项,例如: ``` using System.Configuration; using Microsoft.Extensions.Configuration; ... var builder = new ConfigurationBuilder() .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); IConfigurationRoot configuration = builder.Build(); var connectionString = configuration.GetConnectionString("DefaultConnection"); var logLevel = configuration["Logging:LogLevel:Default"]; ``` 这里的代码首先创建了一个 ConfigurationBuilder 对象,并通过 AddJsonFile 方法指定要读取的配置文件的路径和名称。然后,调用 Build 方法创建了一个 IConfigurationRoot 对象,该对象表示了整个配置文件的内容。最后,可以通过 GetConnectionString 和索引器等方法获取需要的配置项。 希望这个回答对你有所帮助。如果你还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值