ASP.NET Core Web API从静态类登录

Joh*_*hnC 15 logging dependency-injection static-classes asp.net-core asp.net-core-webapi

我在我的控制器上使用依赖注入正好记录,现在我需要静态类中记录一些东西.

如何静态类登录?

我不能使用依赖注入,因为它是静态的,我不能只将现有的logger对象传递给静态类,因为它在日志文件中会有错误的类名.

换句话说,如何从静态类中的loggerfactory中获取记录器?

我遇到了一个类似的问题,他们指出了一篇关于静态类中loggerfactory的文章,但实际上并没有工作,因为我无法从中获取新的记录器,因为它不会接受静态类作为参数:

"静态类型不能用作类型参数"

Joh*_*hnC 29

解决方案是在启动时初始化的实用程序静态类中对LoggerFactory进行静态引用:

/// <summary>
    /// Shared logger
    /// </summary>
    internal static class ApplicationLogging
    {
        internal static ILoggerFactory LoggerFactory { get; set; }// = new LoggerFactory();
        internal static ILogger CreateLogger<T>() => LoggerFactory.CreateLogger<T>();        
        internal static ILogger CreateLogger(string categoryName) => LoggerFactory.CreateLogger(categoryName);

    }
Run Code Online (Sandbox Code Playgroud)

你初学Startup.cs:

 public Startup(ILogger<Startup> logger, ILoggerFactory logFactory, IHostingEnvironment hostingEnvironment)
        {
            _log = logger;
            _hostingEnvironment = hostingEnvironment;
            Util.ApplicationLogging.LoggerFactory = logFactory;//<===HERE

        }
Run Code Online (Sandbox Code Playgroud)

然后你可以构建一个记录器来使用静态类,如下所示:

internal static class CoreJobSweeper
    {
        private static ILogger log = Util.ApplicationLogging.CreateLogger("CoreJobSweeper");
Run Code Online (Sandbox Code Playgroud)

  • 解决方案是将 ILogger&lt;Startup&gt; 记录器、ILoggerFactory logFactory 移至Configure() (3认同)
  • 但是,如果静态类位于 project/dll 中,并且启动时没有引用服务器项目怎么办? (3认同)
  • 你好...如何在 .NET Core 6 中没有“Startup”类的情况下执行此操作? (3认同)
  • 这不再像 https://github.com/aspnet/Announcements/issues/353 中的公告那样起作用。注入ILogger和ILoggerFactory不起作用。“新的 ApplicationInsightsLoggerProvider 可以在应用程序启动管道的早期捕获日志。尽管 Application InsightsLoggerProvider 在 Application Insights 中自动启用(从版本 2.7.1 开始),但直到管道后期才设置检测密钥。因此,只会捕获来自控制器/其他类的日志...” (2认同)

pek*_*aaw 8

我发现这个问题的答案很有用,但我记得我已经安装了 Serilog。我可以使用 Serilog 的默认实现,而不是实现自定义静态实例。

它带有多个不错的日志记录功能和多个重载版本。
这里有两个例子:

using Serilog;
...
    Log.Error(myException, "my message");
    Log.Warning("My message", myValue);
Run Code Online (Sandbox Code Playgroud)

Serilog.Log 是在 Program.cs 或 Startup.cs 中配置时准备好的静态实例。


小智 7

您可以将静态LoggerFactory实例与以下扩展方法一起使用,该方法接受类型的常规参数Type,而不是泛型类型参数: CreateLogger(ILoggerFactory, Type)

loggerFactory.CreateLogger(typeof(T))而不是loggerFactory.CreateLogger<T>()

  • 您的意思是“**_a_**静态`LoggerFactory`实例”吗?除非您设置一个,否则没有可用的静态“LoggerFactory”实例。 (8认同)