获取没有DI的Serilog记录器的实例

c#

我有一个没有依赖注入的控制台应用程序,它使用 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 允许用它们的来源标记事件,通常是写它们的类的名称。您可以使用该类的ForContext方法之一来做到这一点Log

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

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


以上是获取没有DI的Serilog记录器的实例的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>