【发布时间】:2011-05-14 21:30:35
【问题描述】:
我使用 Log4Net 作为服务,它使用 StructureMap 注入到其他服务中。
如何确保日志文件包含进行 log4net 调用的调用服务类上下文(类名和/或线程)?
当然,调用类或线程将始终是日志服务,这无法帮助我了解日志调用的真正来源。
编辑:
注册码:
ObjectFactory.Initialize(x =>
{
x.For<ILog>().AlwaysUnique().Use(s => s.ParentType == null ?
LogManager.GetLogger(s.BuildStack.Current.ConcreteType) :
LogManager.GetLogger(s.ParentType));
});
服务层:
public class LoggerService : ILoggerService
{
private readonly ILog log;
public LoggerService(ILog logger)
{
log = logger;
log.Info("Logger started {0}".With(logger.Logger.Name));
}
public void Info(string message)
{
log.Info(message);
}
}
在日志记录中,我仍然总是将 LoggerService 作为上下文,因此我永远不会看到实际调用的记录器。它似乎无法正常工作。我觉得我在这里遗漏了一些东西......
编辑 2: 我在这里为控制台应用添加了粘贴链接:
我希望父类被记录,但它不能在最简单的级别上工作。
【问题讨论】:
-
看来您已经将记录器抽象到了我通常会做的水平之上,但请尝试使用 ObjectFactory.Initiatlize 来代替:用 [LogManager.GetLogger(s.ParentType)] 替换 [LogManager.GetLogger(s.ParentType)]。 GetLogger(s.ParentType.UnderlyingSystemType.Name))]
-
@Bryan - 我尝试改用 s.root.ConcreteType.Name 并将 app.config 设置为使用 %logger 输出记录器的名称。虽然它没有给我 SubActionService 记录器名称(请参阅下面的我的粘贴链接)。 UnderlyingSystemType 总是 LoggerService 这没有帮助。
-
尝试在 [x.For
().AlwaysUnique().Use] lambda 表达式中使用断点,在监视窗口内检查 [s.ParentType] 的值并钻取降低到您正在寻找的价值。这就是我在使用您的源代码查看注入类的父类型时使用的。
标签: dependency-injection log4net structuremap