AspNetCore Logging

前言

日志。。。

1.基础知识

aspnetcore日志是基于IOC实现的。微软提供了大量的日志提供程序,以及第三方日志也相继支持。我们尽量面向微软的日志接口进行编程。

  • 依赖项

    Microsoft.Extensions.Logging.Abstractions:抽象包

    Microsoft.Extensions.Logging:基础包

    Microsoft.Extensions.Logging.Configuration:配置文件支持,用于支持日志过滤配置

    Microsoft.Extensions.Logging.Console:控制台实现

    Microsoft.Extensions.Logging.Debug:调试实现

  • 核心接口

    ILogger:日志记录器

    ILogger:泛型日志记录器,基础自ILogger

    ILoggerFactory:日志工厂,用于获取命名实列

    ILoggingBuilder:用于配置日志服务到容器里,并简化ILoggerFactory的创建,ILoggingBuilder拥有丰富的api,用以支持扩展

2.构建日志

安装包:

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="7.0.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
  </ItemGroup>

2.1内置容器

image-20231113002529219

using Microsoft.Extensions.Logging;
var factory = LoggerFactory.Create(builder =>
{
    builder.AddConsole();
    builder.AddDebug();
});
var logger1 = factory.CreateLogger<Program>();
var logger2 = factory.CreateLogger("Peng");
logger1.LogInformation("666888");
logger2.LogInformation("666888");

2.2现有容器

image-20231113003007601

var services = new ServiceCollection();
services.AddLogging(builder => {
    builder.AddConsole();
    builder.AddDebug();
});
var sp = services.BuildServiceProvider();
var logger1 = sp.GetRequiredService<ILogger<Program>>();
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
var logger2 = loggerFactory.CreateLogger("Peng");
logger1.LogInformation("666888");
logger2.LogInformation("666888");

3.日志过滤

安装包:

<ItemGroup>
	<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
	<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="7.0.0" />
	<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="7.0.0" />
	<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
</ItemGroup>

3.1编码方式

只输出A.B开头的日志

image-20231113003730181

var services = new ServiceCollection();
services.AddLogging(builder =>
{
    builder.AddDebug();
    builder.AddConsole();
    // provider:debug还是console
    // categorName:日志输出过滤。StartsWith("A.B")只输出A.B开头的日志。
    // level:日志级别
    builder.AddFilter((provider, categorName, level) => {
        return categorName!.StartsWith("A.B") && level >= LogLevel.Information;
    });
    //过滤指定的提供程序
    //configure.AddFilter<DebugLoggerProvider>((categorName, level) =>
    //{
    //    return categorName.StartsWith("A") && level >= LogLevel.Information;
    //});
});
var sp = services.BuildServiceProvider();
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
var logger1 = loggerFactory.CreateLogger("A");
var logger2 = loggerFactory.CreateLogger("A.B");
var logger3 = loggerFactory.CreateLogger("A.B.C");
logger1.LogInformation("666888");
logger2.LogInformation("666888");
logger3.LogInformation("666888");

3.2配置方式

创建json配置文件,右键属性设置文件

image-20231113004130073

Logging:如果没有配置就使用Logging的配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Error"
    },
    "Console": {
      "LogLevel": {
        "A.B": "Information"
      }
    },
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
}

控制台:

只输出A.B开头的和日志级别为Information的日志

image-20231113004825108

Debug:

只输出日志级别为Information的日志

image-20231113004949386

代码:

var services = new ServiceCollection();
var configuration = new ConfigurationManager();
configuration.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("logConfig.json");
services.AddLogging(builder =>
{
    builder.AddConsole();
    builder.AddDebug();
    builder.AddConfiguration(configuration.GetSection("Logging"));
});
var sp = services.BuildServiceProvider();
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
var logger1 = loggerFactory.CreateLogger("A");
var logger2 = loggerFactory.CreateLogger("A.B");
var logger3 = loggerFactory.CreateLogger("A.B.C");
logger1.LogInformation("666888");
logger2.LogInformation("666888");
logger3.LogInformation("666888");

4.自定义日志

需要实现接口:

Microsoft.Extensions.Logging.ILoggerProvider
Microsoft.Extensions.Logging.ILogger

image-20231113012107131

// 日志提供程序
// 指定提供程序别名:配置文件时有用
[ProviderAlias("File")]
public class FileLoggerProvider : ILoggerProvider
{
    private LoggerExternalScopeProvider _scopeProvider = new LoggerExternalScopeProvider();

    public ILogger CreateLogger(string categoryName)
    {
        var logger = new FileLogger(categoryName, _scopeProvider);
        return logger;
    }

    public void Dispose()
    {

    }
}

// 日志记录器
internal class FileLogger : ILogger
{
    private readonly string categoryName;
    public IExternalScopeProvider ScopeProvider { get; set; }

    public FileLogger(
        string categoryName,
        IExternalScopeProvider scopeProvider)
    {
        this.categoryName = categoryName;
        this.ScopeProvider = scopeProvider;
    }

    public IDisposable? BeginScope<TState>(TState state) where TState : notnull
    {
        return ScopeProvider.Push(state);
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        return logLevel != LogLevel.None;
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
    {
        var currentPath = Directory.GetCurrentDirectory();
        var path = Path.Combine(currentPath, $"{DateTime.Now:yyyy-MM-dd}.log");
        var message = formatter(state, exception);
        File.AppendAllText(path, $"{logLevel}: {categoryName} {DateTime.Now}\r\n{message}\r\n");
    }
}

public static class FileLoggerExtensions
{
    public static ILoggingBuilder AddFile(this ILoggingBuilder builder)
    {
        builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, FileLoggerProvider>());
        return builder;
    }
}
var services = new ServiceCollection();
var configuration = new ConfigurationManager();
configuration.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("logConfig.json");
services.AddLogging(builder =>
{
    builder.AddConsole();
    builder.AddDebug();
    builder.AddFile();
    builder.AddConfiguration(configuration.GetSection("Logging"));
});
var sp = services.BuildServiceProvider();
var loggerFactory = sp.GetRequiredService<ILoggerFactory>();
var logger1 = loggerFactory.CreateLogger("A");
var logger2 = loggerFactory.CreateLogger("A.B");
var logger3 = loggerFactory.CreateLogger("A.B.C");
logger1.LogInformation("666888");
logger2.LogInformation("666888");
logger3.LogInformation("666888");

5.NLog支持

安装包:

<PackageReference Include="NLog.Extensions.Logging" Version="5.3.5" />

创建NLog.Config,右键属性设置输出

image-20231113012536695

配置什么的都不说了,看文档的事自己都能解决

<?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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
	<!--
	  See https://github.com/nlog/nlog/wiki/Configuration-file
	  for information on customizing logging rules and outputs.
   -->
	<targets>
		<!--
		add your targets here
		See https://github.com/nlog/NLog/wiki/Targets for possible targets.
		See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
		 -->
		<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
		   layout="${longdate} ${uppercase:${level}} ${message}" />
		<target xsi:type="Console" name="c"
		   layout="${longdate} ${uppercase:${level}} ${message}" />
	</targets>

	<rules>
		<logger name="*" minlevel="Debug" writeTo="f,c" />
	</rules>
</nlog>

代码:

image-20231113012837874

using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;

ILoggerFactory factory = LoggerFactory.Create(builder =>
{
    builder.AddNLog();
});
var logger = factory.CreateLogger<ILogger<Program>>();
logger.LogInformation("666888");
posted @   peng_boke  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示