【发布时间】:2021-01-08 11:33:04
【问题描述】:
我有一个使用 log4net 的没有依赖注入的控制台应用程序。我正在尝试用 Serilog 替换 log4net。
这接近于 log4net 的设置方式:
using log4net;
using log4net.Config;
using System;
using System.IO;
using System.Reflection;
namespace LoggingDemo.Log4Net
{
class Program
{
private static readonly ILog log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
log.Debug("Starting up");
log.Debug("Shutting down");
Console.ReadLine();
}
}
}
在其他类中通过设置private static readonly ILog log = LogManager.GetLogger(typeof(Program));获取记录器
Serilog 是这样设置的:
using Serilog;
using System;
namespace LoggingDemo.Serilog
{
class Program
{
static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("logfile.log", rollingInterval: RollingInterval.Day)
.CreateLogger();
Log.Debug("Starting up");
Log.Debug("Shutting down");
Console.ReadLine();
}
}
}
如何像我们在其他类中使用 log4net 一样获取 Serilog 记录器的实例,即 private static readonly ILog log = LogManager.GetLogger(typeof(Program));?
【问题讨论】:
-
Serilog 不是 log4net。为什么要为每个类创建一个新的记录器?发出类名?检查Serilog add class name and method to log
-
您也可以use the
ForContextorForContext<T>method添加上下文属性。您可以使用例如Log.ForContext<Program>或Log.ForContext<MyController> -
我必须要么换掉每个类中的静态 log4net 记录器,要么引入 DI 并将记录器添加到所有构造函数中。我不想走最简单的路线
-
不,这个答案是错误的,因为它把苹果比作榨汁机。每次创建一个新的记录器本身不是目的。这是您包含上下文信息的方式。没有一个例子需要 DI。他们使用 DI 仅仅是因为大多数应用程序都使用 DI。不需要对 Serilog 使用依赖注入。如果要包含上下文信息,可以直接以
FromContext<T>开头,得到与log4net 相同的行为。 -
我敢打赌 DI 中间件实际上也会调用
FromContext<T>