c# - 在没有 DI 的情况下获取 Serilog 记录器的实例

标签 c# .net-4.0 serilog

我有一个使用 log4net 的没有依赖注入(inject)的控制台应用程序。我正在尝试用 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 的方法类(class)。
在你上面的例子中,它会是这样的:

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

关于c# - 在没有 DI 的情况下获取 Serilog 记录器的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65628193/

相关文章:

c# - 如何向 ILogger 添加自定义属性

.net - 单元测试 serilog 配置

c# - C# 中的 QuickSort 错误复杂性

c# - decimal.Round 和 Math.Round 之间的区别

c# - 将文本转换为图像?

serilog - 有没有办法指定特定的浓缩器只能用于特定的接收器?

c# - 如何合成两个图像(使用 Source In 合成)?

visual-studio-2010 - 如何从 GAC 引用程序集?

C# 接口(interface)调试信息未链接到源

c# - EnvironmentPermission Deny 在 .Net 4.0 中已过时,有替代方案吗?