C# 在其他项目引用的类库中使用serilog
我有一个包含多个.NET核心API和windows服务的解决方案。如何集成Serilog,使我不必在多个不同的位置更改添加列或更改某些属性 我正在考虑在一个公共库中添加Serilog,并在所有其他项目中使用该自定义库。然而,如何调用Serilog的起点,正如我们在Program.cs的下面代码中所看到的,任何代码引用都会有所帮助C# 在其他项目引用的类库中使用serilog,c#,serilog,C#,Serilog,我有一个包含多个.NET核心API和windows服务的解决方案。如何集成Serilog,使我不必在多个不同的位置更改添加列或更改某些属性 我正在考虑在一个公共库中添加Serilog,并在所有其他项目中使用该自定义库。然而,如何调用Serilog的起点,正如我们在Program.cs的下面代码中所看到的,任何代码引用都会有所帮助 .UseSerilog((hostingContext, loggerConfiguration) => {
.UseSerilog((hostingContext, loggerConfiguration) =>
{
loggerConfiguration.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File(path: Path.Combine(Environment.CurrentDirectory, "Logs", "log.txt"),
rollOnFileSizeLimit: true,
retainedFileCountLimit: 20,
rollingInterval: RollingInterval.Day,
fileSizeLimitBytes: 10000
)
.WriteTo.Console();
})
======================更新===================
For windows service, I have the code in common library.
public class LogManager : ILogManager
{
public LogManager()
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.FromLogContext()
// .WriteTo.Console(LogEventLevel.Debug, OutputTemplate, theme: AnsiConsoleTheme.Code)
.WriteTo.RollingFile(@"C:\Users\hnq6ww\Documents\Important\logs.txt",
LogEventLevel.Verbose,
// OutputTemplate,
retainedFileCountLimit: (int?)RollingInterval.Day,
buffered: true, fileSizeLimitBytes: 10000)
.CreateLogger();
}
}
在Program.cs中
static void Main(string[] args)
{
ILogManager log = new LogManager();
log.WriteLog(Serilog.Events.LogEventLevel.Information, "Testing");
}
在公共库中,您可以创建一个扩展方法,将Serilog注入到多个.NETWebAPI项目中 所以你可以在你的公共类库中有这样的东西
public static class SerilogDi
{
public static IHostBuilder InjectSerilog(this IHostBuilder hostBuilder)
{
hostBuilder.UseSerilog((hostingContext, loggerConfiguration) =>
{
loggerConfiguration.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File(path: Path.Combine(Environment.CurrentDirectory, "Logs", "log.txt"),
rollOnFileSizeLimit: true,
retainedFileCountLimit: 20,
rollingInterval: RollingInterval.Day,
fileSizeLimitBytes: 10000
)
.WriteTo.Console();
});
return hostBuilder;
}
}
然后,您可以将该项目的项目引用添加到您的.NETWebAPI项目中,并在其中注入Serilog,类似这样
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.InjectSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
然后在您的其他项目中,您可以使用此实例
public static int Main(string[] args)
{
Log.Logger = MySerilog.GetInstance();
}
在CreateHostBuilder
方法中,您只需
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Host.CreateDefaultBuilder(args)
.useserlog()
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
这将适用于两种类型的项目,您也可以将GetInstance()
参数化
你可以在这里进一步查阅
您可以在类库中创建一个扩展方法来实现这一点,并在API项目中使用该扩展方法。@honey\u ramgarhia抱歉,我不知道怎么做,请给我一个例子。谢谢。。。如果应用程序是windows服务,如何实现相同的功能。我已经在“更新”部分添加了代码,请您看一下,并帮助我如何在那里添加扩展,可能是web/windows服务应用程序的常见代码。这对我没有帮助,我觉得我被误导了。我不希望配置是通用的,配置将由每个应用程序发送,我不希望在每个应用程序中安装serilog和Encriers,因此我需要一个通用解决方案(库),以便库负责推送日志。
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});