这完全没问题。通常,实例化记录器很便宜,因此完全可以像执行性能那样进行。
仍然可以考虑(1)使用Serilog所具有的全局日志实例,或者(2)使用在字段声明中初始化的静态字段。再一次,不是出于性能的原因,而是为了避免污染你的构造函数而不是相关的东西。
UPD更新关于实施(1)
基本上,它只是一个决定会在哪里你把记录器初始化代码到的问题。在ASP.NET核心将是Main
方法的第一行(即Log
是Serilog
命名空间的静态类):
Log.Logger = new LoggerConfiguration().WriteTo.LiterateConsole(LogEventLevel.Debug, LogTemplate)
.WriteTo.File(@"C:\logs\elbakogdabot.log", LogEventLevel.Debug, LogTemplate)
.Enrich.FromLogContext()
.CreateLogger();
(仅仅是明确的:我把代码从我的实际项目,但是记录器的实际配置可能不同)。
然后我会在任何地方使用它像这样:
Log.Warning($"got a message for an unknown user: userid=[{userId}]");
此行可能被扔进任何类,你不必做任何额外的初始化这个类。
UPD更新关于执行(2)
我想在一个典型的企业应用程序这将是有问题永远记得你每次登录的东西的时候把类名在邮件中。所以我大部分时间都会去static readonly
。随着Serilog你可以做这样的:
public class XYZService
{
private static readonly Serilog.ILogger log = Log.ForContext<XYZService>();
...
这样你既不会污染构造,并会自动在您所有的日志信息的获取类名。我曾经在ReSharper片段中有这条线,所以我不得不在每个新班级中输入lg<TAB>
。
感谢您的快速回复。选项1的任何好的参考文章? – vibs
听起来不错。我试图在我的代码中实现它。它的工作原理! – vibs
只有两件事:1)我必须在我的业务库中安装serilog nuget软件包以获取Log对象的访问权限2)我的输出模板格式没有获取sourcecontext,因为它是全局的。所以我们必须在日志消息中编写n类方法的详细信息。如果错了,纠正我。 – vibs