【问题标题】:Getting an instance of the Serilog logger without DI在没有 DI 的情况下获取 Serilog 记录器的实例
【发布时间】: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 ForContext or ForContext<T> method添加上下文属性。您可以使用例如Log.ForContext<Program> 或Log.ForContext<MyController>
  • 我必须要么换掉每个类中的静态 log4net 记录器,要么引入 DI 并将记录器添加到所有构造函数中。我不想走最简单的路线
  • 不,这个答案是错误的,因为它把苹果比作榨汁机。每次创建一个新的记录器本身不是目的。这是您包含上下文信息的方式。没有一个例子需要 DI。他们使用 DI 仅仅是因为大多数应用程序都使用 DI。不需要对 Serilog 使用依赖注入。如果要包含上下文信息,可以直接以FromContext<T> 开头,得到与log4net 相同的行为。
  • 我敢打赌 DI 中间件实际上也会调用 FromContext<T>

标签: c# .net-4.0 serilog


【解决方案1】:

Serilog 允许使用它们的源来标记事件,一般来说就是编写它们的类的名称。您可以使用Log 类的ForContext 方法之一来做到这一点。

在你上面的例子中,它会是这样的:

private static readonly ILogger log = Log.ForContext<Program>();

或

private static readonly ILogger log = Log.ForContext(typeof(Program));

写入的事件将包含一个属性SourceContext,其值为"MyNamespace.MyClass",稍后可用于过滤噪声事件,或有选择地将它们写入特定的接收器。


文档:https://github.com/serilog/serilog/wiki/Writing-Log-Events#source-contexts

【讨论】:

  • 正是我正在寻找的问题。感谢@Panagiotis Kanavos 也
猜你喜欢
  • 2019-04-13
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多