【发布时间】:2021-03-08 15:24:56
【问题描述】:
我有一个引用多个库(核心、标准)的 c# 项目。 每个库都通过以下方式使用 log4net:
public class LibOne
{
private static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public LibOne()
{
Log.Debug("ctor called");
}
}
主工程配置Logger:
XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetEntryAssembly()),
new FileInfo($"{AppDomain.CurrentDomain.BaseDirectory}\\log4net.config"));
层次结构如下所示:
MainProject
|
+---------+---------+
LibOne LibTwo LibThree
| |
| +---------+
+---------+ LibSix LibSeven
LibFour LibFive
好的,通过上述设置,我可以看到每个库的日志条目。
现在库应该现代化并变得更加通用,以便消费者可以决定他最喜欢的记录器(例如 NLog、Console 等)。
因此我想使用Microsoft.Logging.Extensions。我阅读了大量文档、指南、提示等,发现ILoggerFactory 可能是最好的开始方式,但是
- 没有人解释,如何在多个层上使用
ILogger,以及如何在消费项目中配置记录器,
- 几乎我发现的每个示例都在 DI 的构造函数中添加了
ILogger/ILogger<T>参数,但我无法更改每个库的构造函数的签名。有没有办法以不同的方式做到这一点?
- 我读过一些关于
autofac的文章,但没有完全理解。也许我可以用它来定义我想在日志文件中看到哪些类型/库?
UPD 1 是否有可能更改库代码并以与 log4net 相同的方式处理它,但使用未指定的 logprovider,例如
public class LibOne
{
private static readonly ILogger<LibOne> Log = new LoggerFactory().CreateLogger<LibOne>(); //does this make sense?
public LibOne()
{
Log.LogDebug("ctor called");
}
}
那么如何在我的主项目中配置记录器(例如 log4net 或调试控制台)?我以后可以添加提供程序吗?
很抱歉这些问题,但是微软关于超出 asp.net 范围(并且没有 DependencyService)的日志扩展的文档真的很差。
【问题讨论】:
-
2:为什么不能改变构造函数?如果您想走看似自然的 DI 路线。
-
内部要求说,这些签名不得更改,因为这些库用于许多其他项目。我知道这是DI推荐的方式,但我问,是否有其他使用日志记录扩展的方法?如果实在没有别的办法,我就必须这样实现。
标签: c# logging log4net ilogger