c# - 在其他项目引用的类库中使用 serilog
问题描述
我有一个包含多个 .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();
})
================更新===================
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 注入您的多个 .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;
}
}
然后您可以将此项目的项目引用添加到您的 .NET Web API 项目中并在其中注入 Serilog,如下所示
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.InjectSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
此外,您可以进行InjectSerilog()
参数化以在每个项目的基础上进一步配置它。
更新 好的,根据您的更新,我认为您只想配置通用。所以你可以做的是在你的公共库中创建一个静态方法,它返回一个配置的记录器。
public static class MySerilog
{
public static Logger GetInstance()
{
return new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.FromLogContext()
// All my settings here
.CreateLogger();
}
}
然后在你的其他项目中你可以使用这个实例
public static int Main(string[] args)
{
Log.Logger = MySerilog.GetInstance();
}
在你的CreateHostBuilder
方法中,你可以简单地做
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
这适用于您的两种类型的项目,您也可以进行GetInstance()
参数化!
推荐阅读
- kubernetes - Kubernetes hpa cpu 利用率
- vba - 如何使用 XMLHTTP60 对象从 VBA 中的重定向 URI 获取授权码值?
- android - for 语句在 while 语句结束之前返回
- cloud - ICP4D(IBM Cloud Pak for Data)也可以用作数据质量工具吗?
- javascript - 是否可以从 javascript 中的“构造函数”调用类方法?
- xml - 如何在属性之后读取 XML 值
- javascript - 量角器测试中的条件:如果元素包含特定文本则执行操作
- swift - alamofire 中的时间间隔来观察 API 的变化
- excel - 如果另一列数据相等,则对列中的值求和
- python - Beautifulsoup 分页使用下一个按钮