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内置容器
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现有容器
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开头的日志
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配置文件,右键属性设置文件
Logging:如果没有配置就使用Logging的配置
{
"Logging": {
"LogLevel": {
"Default": "Error"
},
"Console": {
"LogLevel": {
"A.B": "Information"
}
},
"Debug": {
"LogLevel": {
"Default": "Information"
}
}
}
}
控制台:
只输出A.B开头的和日志级别为Information的日志
Debug:
只输出日志级别为Information的日志
代码:
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
// 日志提供程序
// 指定提供程序别名:配置文件时有用
[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,右键属性设置输出
配置什么的都不说了,看文档的事自己都能解决
<?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>
代码:
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
ILoggerFactory factory = LoggerFactory.Create(builder =>
{
builder.AddNLog();
});
var logger = factory.CreateLogger<ILogger<Program>>();
logger.LogInformation("666888");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!