没有 main 方法的 LoggerConfiguration()
LoggerConfiguration() without a main method
Serilog 的新手,如果我的问题之前已经回答,我提前道歉。
我发现的所有 Serilog 配置示例都暗示,在执行链的很早的某个地方,应该执行一些类似于下面的代码以使 Serilog 写入日志。
在常规控制台应用程序中,是的,它可以工作,我只需在 Main() 中添加该代码。但是,我正在编写一个 DLL,因此没有 Main() 方法。我不知道哪个方法会先被调用,所以我无法将代码添加到特定方法。
所以我几乎被困住了,除非我遗漏了一些明显的东西。谁能帮我提示一下?
谢谢
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Verbose()
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
日志记录管道设置通常是使用您的库的主机应用程序的关注点,而不是您在库本身内设置的内容。
如果您的 class 库与主机应用程序一起作为解决方案的一部分,并且您决定使用 Serilog,则您的库通常依赖 Log.Logger
由主机进程设置消耗你的图书馆。
public class MyClassWithinMyLibrary
{
private readonly ILogger _log = Log.ForContext<MyClassWithinMyLibrary>();
public void MyMethod()
{
_log.Information("Doing stuff inside the library");
}
}
如果你正在构建一个将被其他人使用的库(例如通过 NuGet)并且你真的不知道他们是否想使用 Serilog 或其他东西,那么你通常会依赖在 Microsoft.Extensions.Logging
上并要求用户在您的 classes 的构造函数中提供一个 ILogger<T>
实例,或者使用您在库中提供的自定义接口在他们的日志系统之间架起桥梁以及您图书馆的日志系统。
在更小众的场景中,如果您真的想在内部使用 Serilog 在库中进行日志记录(可能是因为非 .NET 应用程序使用了您的库),那么您可以使用 module initializer,它是一种在使用程序集时调用一次的方法,让您有机会执行初始化代码:
internal static class ModuleInitializer
{
[ModuleInitializer]
internal static void Run()
{
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Verbose()
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
}
}
N.B。模块初始值设定项要求您使用 C# 9 编译器编译您的代码。如果您使用的是旧版本,您仍然可以使用模块初始化程序,但您需要一个编织工具,例如 ModuleInit.Fody,它可以为您在程序集中包含模块初始化程序。
Serilog 的新手,如果我的问题之前已经回答,我提前道歉。
我发现的所有 Serilog 配置示例都暗示,在执行链的很早的某个地方,应该执行一些类似于下面的代码以使 Serilog 写入日志。
在常规控制台应用程序中,是的,它可以工作,我只需在 Main() 中添加该代码。但是,我正在编写一个 DLL,因此没有 Main() 方法。我不知道哪个方法会先被调用,所以我无法将代码添加到特定方法。
所以我几乎被困住了,除非我遗漏了一些明显的东西。谁能帮我提示一下?
谢谢
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Verbose()
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
日志记录管道设置通常是使用您的库的主机应用程序的关注点,而不是您在库本身内设置的内容。
如果您的 class 库与主机应用程序一起作为解决方案的一部分,并且您决定使用 Serilog,则您的库通常依赖 Log.Logger
由主机进程设置消耗你的图书馆。
public class MyClassWithinMyLibrary
{
private readonly ILogger _log = Log.ForContext<MyClassWithinMyLibrary>();
public void MyMethod()
{
_log.Information("Doing stuff inside the library");
}
}
如果你正在构建一个将被其他人使用的库(例如通过 NuGet)并且你真的不知道他们是否想使用 Serilog 或其他东西,那么你通常会依赖在 Microsoft.Extensions.Logging
上并要求用户在您的 classes 的构造函数中提供一个 ILogger<T>
实例,或者使用您在库中提供的自定义接口在他们的日志系统之间架起桥梁以及您图书馆的日志系统。
在更小众的场景中,如果您真的想在内部使用 Serilog 在库中进行日志记录(可能是因为非 .NET 应用程序使用了您的库),那么您可以使用 module initializer,它是一种在使用程序集时调用一次的方法,让您有机会执行初始化代码:
internal static class ModuleInitializer
{
[ModuleInitializer]
internal static void Run()
{
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Verbose()
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
}
}
N.B。模块初始值设定项要求您使用 C# 9 编译器编译您的代码。如果您使用的是旧版本,您仍然可以使用模块初始化程序,但您需要一个编织工具,例如 ModuleInit.Fody,它可以为您在程序集中包含模块初始化程序。