我有一个包含多个 .NET Core API 和 Windows 服务的解决方案。如何集成 Serilog,以便不需要在几个不同的位置进行更改来添加列或更改某些属性?
我正在考虑在公共库中添加 Serilog 并在所有其他项目中使用该自定义库,但是如何调用 Serilog 的起点,如我们在 Program.cs 中的以下代码中看到的那样,任何代码参考都会有所帮助。
.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();
})
Run Code Online (Sandbox Code Playgroud)
===============已更新===================
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();
}
}
Run Code Online (Sandbox Code Playgroud)
在程序.cs中
static void Main(string[] args)
{
ILogManager log = new LogManager();
log.WriteLog(Serilog.Events.LogEventLevel.Information, "Testing");
}
Run Code Online (Sandbox Code Playgroud)
在您的公共库中,您可以创建一个扩展方法,将 Serilog 注入您的多个 .NET Web API 项目
所以你可以在你的公共类库中有这样的东西
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以将该项目的项目引用添加到你的.NET Web API项目中并在其中注入Serilog,如下所示
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.InjectSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Run Code Online (Sandbox Code Playgroud)
此外,您还可以进行InjectSerilog()参数化,以根据每个项目进一步配置它。
更新 好的,根据您的更新,我认为您只想配置通用。因此,您可以做的是在公共库中创建一个静态方法,该方法返回配置的记录器。
public static class MySerilog
{
public static Logger GetInstance()
{
return new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.FromLogContext()
// All my settings here
.CreateLogger();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在你的其他项目中你可以使用这个实例
public static int Main(string[] args)
{
Log.Logger = MySerilog.GetInstance();
}
Run Code Online (Sandbox Code Playgroud)
在你的CreateHostBuilder方法中你可以简单地做
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Run Code Online (Sandbox Code Playgroud)
这适用于您的两种类型的项目,您GetInstance()也可以进行参数化!
您可以进一步参考这里 https://github.com/serilog/serilog-aspnetcore
| 归档时间: |
|
| 查看次数: |
8365 次 |
| 最近记录: |