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)
我发现这个问题的答案很有用,但我记得我已经安装了 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>()
| 归档时间: |
|
| 查看次数: |
8726 次 |
| 最近记录: |