将 Serilog 正确注入 .net core 类 作为 Microsoft.Extentions.Logging.ILogger - 不是 ASP .Net Core
Correctly Injecting Serilog into .net core classes as Microsoft.Extentions.Logging.ILogger - Not ASP .Net Core
所以我有一个 .Net Core 控制台应用程序和一堆 .Net 核心库。
库中的大多数 类 都有这样的构造函数。
public class ReportingManager
{
private ILogger _logger;
Public ReportingManager(ILogger logger)
{
_logger = logger;
}
}
ILogger
属于 Microsoft.Extentions.Logging.ILogger
类型
在我的控制台应用程序中我有这个。
class Program
{
static void Main(string[] args)
{
var serilog = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
.CreateLogger();
ReportingManager manager = new ReportingManager(serilog);
}
}
我在 'ReportingManager manager = new ReportingManager(serilog);'
处遇到智能感知错误
cannot convert from 'Serilog.Core.Logger' to 'Microsoft.Extensions.Logging.ILogger'
所以我的问题是,如何正确传递 Serilog?
在网上和这里看过,但大多数人都在谈论 ASP.Net 核心。
您需要将 Serilog 记录器包装到 Microsoft.Extensions.Logging.LoggerFactory
中。这正是在 ASP.NET.
中的 DI 中使用 same 时发生的情况
像这样:
Serilog.Core.Logger serilog = ...;
var loggerFactory = new LoggerFactory()
.AddSerilog(serilog);
Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger("Logger");
这需要 Serilog.Extensions.Logging
NuGet 包。
我的 .net 核心控制台应用程序中需要一个记录器来登录文件。这是我的解决方案...
PM> install-package Serilog.Extensions.Hosting
PM> install-package Serilog.Sinks.File
//Serilog configuration
var serilogLogger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
//Create a logger factory
var loggerFactory = new LoggerFactory().AddSerilog(serilogLogger);
//Get a logger
var logger = loggerFactory.CreateLogger<MyService>();
为了使用 DI 提供更完整和最新的答案,这是将 .Net ILogger 接口与 Serilog 一起使用的方法。这是针对 WPF/Console 应用程序
.Net 6 ILogger 更新 - 如 Microsoft 所述
Starting with .NET 6, logging services no longer register the ILogger
type. When using a logger, specify the generic-type alternative
ILogger or register the ILogger with dependency
injection (DI).
您现在必须使用 ILogger 进行日志记录才能工作,T 是类别名称。 https://docs.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line
包
使用 Serilog 和 .Net 6 Logging 需要以下包(配置是可选的,如果您打算使用代码配置,为此我使用 appsettings.json 作为配置)
Install-Package Serilog
Install-Package Serilog.Sinks.File
Install-Package Serilog.Extensions.Logging
Install-Package Serilog.Settings.Configuration
Install-Package Microsoft.Extensions.Logging
Install-Package Microsoft.Extensions.Logging.Configuration
可选包(用于格式化为 JSON)
Install-Package Serilog.Formatting.Compact
在App.cs添加配置
var builder = new ConfigurationBuilder();
builder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
将 appsettings.json 文件添加到应用程序的根目录(确保复制到输出目录)
{
"Serilog": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "log.json",
"rollingInterval": "Day",
"MinimumLevel": "Information",
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
}
}
]
}
}
Serilog 支持 windows 环境变量的路径,所以你可以做 %localappdata%\log\ 来存储使用中的应用程序数据等,更多信息在这里:https://github.com/serilog/serilog-settings-appsettings
格式化程序是可选的,它可以被删除,您可以只记录文本,“rollingInterval”可以是日、月、年。还有很多其他配置是可以接受的,更多信息可以在这里找到:
https://github.com/serilog/serilog-settings-appsettings
添加记录器
var seriLog = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
ILoggerFactory logger = LoggerFactory.Create(logging =>
{
logging.AddSerilog(seriLog);
});
ILogger<T> myLogger = logger.CreateLogger<T>();
如果你使用 DI,你需要像这样注册这个记录器
services.AddSingleton(myLogger);
您现在可以在您的应用程序中使用 Microsoft ILogger 接口 类(将 ILogger 作为参数构造函数传递,如果构造函数注入)并且 Serilog 将成为底层日志记录提供程序。
所以我有一个 .Net Core 控制台应用程序和一堆 .Net 核心库。
库中的大多数 类 都有这样的构造函数。
public class ReportingManager
{
private ILogger _logger;
Public ReportingManager(ILogger logger)
{
_logger = logger;
}
}
ILogger
属于 Microsoft.Extentions.Logging.ILogger
在我的控制台应用程序中我有这个。
class Program
{
static void Main(string[] args)
{
var serilog = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
.Enrich.FromLogContext()
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
.CreateLogger();
ReportingManager manager = new ReportingManager(serilog);
}
}
我在 'ReportingManager manager = new ReportingManager(serilog);'
处遇到智能感知错误cannot convert from 'Serilog.Core.Logger' to 'Microsoft.Extensions.Logging.ILogger'
所以我的问题是,如何正确传递 Serilog?
在网上和这里看过,但大多数人都在谈论 ASP.Net 核心。
您需要将 Serilog 记录器包装到 Microsoft.Extensions.Logging.LoggerFactory
中。这正是在 ASP.NET.
像这样:
Serilog.Core.Logger serilog = ...;
var loggerFactory = new LoggerFactory()
.AddSerilog(serilog);
Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger("Logger");
这需要 Serilog.Extensions.Logging
NuGet 包。
我的 .net 核心控制台应用程序中需要一个记录器来登录文件。这是我的解决方案...
PM> install-package Serilog.Extensions.Hosting
PM> install-package Serilog.Sinks.File
//Serilog configuration
var serilogLogger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
//Create a logger factory
var loggerFactory = new LoggerFactory().AddSerilog(serilogLogger);
//Get a logger
var logger = loggerFactory.CreateLogger<MyService>();
为了使用 DI 提供更完整和最新的答案,这是将 .Net ILogger 接口与 Serilog 一起使用的方法。这是针对 WPF/Console 应用程序
.Net 6 ILogger 更新 - 如 Microsoft 所述
Starting with .NET 6, logging services no longer register the ILogger type. When using a logger, specify the generic-type alternative ILogger or register the ILogger with dependency injection (DI).
您现在必须使用 ILogger 进行日志记录才能工作,T 是类别名称。 https://docs.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line
包
使用 Serilog 和 .Net 6 Logging 需要以下包(配置是可选的,如果您打算使用代码配置,为此我使用 appsettings.json 作为配置)
Install-Package Serilog
Install-Package Serilog.Sinks.File
Install-Package Serilog.Extensions.Logging
Install-Package Serilog.Settings.Configuration
Install-Package Microsoft.Extensions.Logging
Install-Package Microsoft.Extensions.Logging.Configuration
可选包(用于格式化为 JSON)
Install-Package Serilog.Formatting.Compact
在App.cs添加配置
var builder = new ConfigurationBuilder();
builder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
将 appsettings.json 文件添加到应用程序的根目录(确保复制到输出目录)
{
"Serilog": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "log.json",
"rollingInterval": "Day",
"MinimumLevel": "Information",
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
}
}
]
}
}
Serilog 支持 windows 环境变量的路径,所以你可以做 %localappdata%\log\ 来存储使用中的应用程序数据等,更多信息在这里:https://github.com/serilog/serilog-settings-appsettings
格式化程序是可选的,它可以被删除,您可以只记录文本,“rollingInterval”可以是日、月、年。还有很多其他配置是可以接受的,更多信息可以在这里找到:
https://github.com/serilog/serilog-settings-appsettings
添加记录器
var seriLog = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
ILoggerFactory logger = LoggerFactory.Create(logging =>
{
logging.AddSerilog(seriLog);
});
ILogger<T> myLogger = logger.CreateLogger<T>();
如果你使用 DI,你需要像这样注册这个记录器
services.AddSingleton(myLogger);
您现在可以在您的应用程序中使用 Microsoft ILogger 接口 类(将 ILogger 作为参数构造函数传递,如果构造函数注入)并且 Serilog 将成为底层日志记录提供程序。