我正在将Serilog集成到我创建的现有多级层和多装配解决方案中。我之前使用的日志记录技术只是通过事件向字符串传递字符串。我想摆脱这个。
我已经读过我可以使用app.config文件将记录器配置加载到我的库中的每个类中,但是如何在多组件项目中执行此操作。
我有一个顶级/启动项目和两个类库项目。我想在整个程序中使用带有两个接收器的相同记录器。
这些是我到目前为止找到的文章
https://github.com/serilog/serilog/wiki/AppSettings
http://nblumhardt.com/2014/04/xml-configuration-for-serilog/
有人可以解释如何实现这个目标吗?
答案 0 :(得分:7)
Serilog允许您按程序使用记录器配置;虽然可以逐类调整日志记录,但这通常是在事后进行过滤等等。
推荐的方法是:
在Program.Main()
或您应用的切入点位置设置Serilog是第一件事:
Log.Logger = new LoggerConfiguration()
.WriteTo.Sink1()
.WriteTo.Sink2()
.CreateLogger();
注意这会设置静态Log
类。在你的应用程序的其他地方你现在可以写:
Log.Information("This is a message");
并将消息传递给两个接收器。你可以避免使用静态Log
而是传递ILogger
,但除非你在这里有强烈的偏好,否则静态选项不会那么麻烦。
XML / appSettings
配置并未改变任何此类配置。它只是将一些细节移动到配置文件,因此将第一个代码块更改为:
Log.Logger = new LoggerConfiguration()
.ReadFrom.AppSettings()
.CreateLogger();
并补充说:
<add key="serilog:write-to:Sink1" />
<add key="serilog:write-to:Sink2" />
到App.config
会产生同样的效果。如果可以避免使用XML,那么代码中的配置通常不那么麻烦(移动部件更少)。
答案 1 :(得分:1)
这是我的多程序集日志解决方案:
我像往常一样在主程序集中使用配置设置了 Mainlogger,即负责创建和配置日志的程序集。在我的例子中,logging-master 是一个 GUI 应用程序,它与一个 dll 交互,它实际上完成了这项工作。
然后我在 slave-assembly 中安装了 Serilog 并像这样向 master 程序集暴露了一个订阅功能:
void SubscribeLogging(ILogger masterlogger)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Logger(masterlogger)
.CreateLogger();
}
如有必要,我会从主程序集调用
myDll.SubscribeLogging(Log.ForContext("SourceContext", "myDll"));
据我所知,可以在一定程度上操纵日志配置,但我没有尝试在从组件中使用完全不同的输出模板。