我想了解人们如何处理跟踪和登录实际应用程序的故事.以下是一些可能有助于解释您的答案的问题.
构架
你使用什么框架?
如果使用跟踪,是否使用Trace.Correlation.StartLogicalOperation?
您是手动编写此代码,还是使用某种形式的面向方面编程来执行此操作?小心共享代码片段?
您是否在跟踪源上提供任何形式的粒度?例如,WPF TraceSources允许您在不同级别配置它们:
听众
你使用什么日志输出?
如果使用文件,您使用滚动日志还是仅使用单个文件?如何使日志可供人们使用?
查看
您可以使用哪些工具查看日志?
如果要构建ASP.NET解决方案,是否还使用ASP.NET运行状况监视?您是否在运行状况监视器事件中包含跟踪输出?那么Trace.axd呢?
自定义性能计数器怎么样?
我一直在寻找.net(c#)的日志框架,并决定在阅读stackoverflow上的一些问题/答案线程后给log4net一个机会.我看到人们一遍又一遍地提到他们使用log4net的包装类,我很想知道它会是什么样子.
我将我的代码拆分为不同的项目(数据访问/业务/ webservice/..).log4net包装器类怎么样?包装类是否需要包含在所有项目中?我应该将它作为一个单独的项目一起构建吗?
包装器应该是单件类吗?
最近宣布的.NET 4.0托管可扩展性框架(MEF)是一个依赖注入框架吗?模式和实践中的Microsoft Unity在4.0中是否会过时?MEF与Unity这样的框架相比如何?
我想知道一些关于日志记录和日志记录框架以及依赖注入的最佳实践.具体来说,如果我正在设计一个需要记录方法的类,我应该如何设置一个接口来记录依赖注入?
依赖注入似乎表明外部依赖应该从外部注入(构造函数或属性设置器),所以我应该在构造函数中使用ILog实例并在类中使用吗?我应该考虑记录一个可选的依赖项并将其置于setter中吗?我是否通过允许更改日志记录界面来推动过多的灵活性,并且我应该对特定的日志记录接口采取硬依赖(例如通过调用工厂方法创建静态ILog变量)?这个工厂方法可以调用容器来获取ILog实现,还是会在初始化的静态变量和初始化的IoC容器之间产生初始化冲突?
我应该这样做:
public class MyService : ISomeService
{
private static readonly ILogger s_log =
LoggingFactory.GetLogger(typeof(MyService))
...
}
Run Code Online (Sandbox Code Playgroud)
或许这个:
public class MyService : ISomeService
{
protected virtual ILogger Logger {get; private set;}
public MyService(ILogger logger, [other dependencies])
{
Logger = logger;
}
}
Run Code Online (Sandbox Code Playgroud)
甚至这个:
public class MyService : ISomeService
{
public virtual ILogger Logger {get; set;}
public MyService()
{
}
}
Run Code Online (Sandbox Code Playgroud)
其他模式或方法吗?那里的人在做什么?什么工作,什么时候?
我想在我的MVC控制器抽象基类中构建我的log4net记录器,如下所示:
protected static readonly ILog Log = LogManager.GetLogger(typeof(AuthorizedController));
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我可以定义一次记录器并完成它.唯一的问题是日志输出中的logger属性将永远是AuthorizedController,如果我FooController继承了AuthorizedController我想像日志输出那样反映.
这样做会有什么好的KISS,DRY和高效方式?
我在API中有一个类,有一个静态方法,用于验证和记录详细信息.任何指导如何注入ILogger接口请.
public class ValidateDataInAPI
{
public static bool IsValid(string data)
{
//do something
If(error)
{
_logger.Error("Log error as implemented by caller");
}
}
}
Run Code Online (Sandbox Code Playgroud) 我已经碰到了围绕各个网站提出的一些问题,答案似乎是由l4n officianados转向了log4net'是'的轻量级包装器的价值(你不明白吗?)和类似的观点令人难以置信的事实.
然而,似乎用户要求的(这是我的问题)是如何使log4net objet模型适应fluent配置界面中的registertype/registerinstance序列.
这里的目标不是重新包装l4n,而只是为了获得一个不需要劫持流畅流量的体面参考,就像它一样.
糟糕的ejemplow,我想从LogManger.GetLogger方法获得对已配置的ILog实例的引用,并将其尽早放入流体流中,以将其注入我的下游对象的属性中.
因此,为了回应一个不耐烦的建议,我尝试以规范的方式创建了一个正常的ILog实例:
log4net.Config.XmlConfigurator.Configure();
static readonly log4Net.Ilog Log = LogManager.GetLogger(thatlongassemblyreflectionstuff);
Run Code Online (Sandbox Code Playgroud)
因此,现在将这个引用添加到Unity容器并继续我的美好生活似乎是微不足道的(在真正意义上毫不费力).
但是,RegisterInstance方法的签名需要"类型"而不是接口.
对于那些没有搜索过log4net对象模型的人来说,afficiananderos是正确的:l4n是一个"包装器",你无法得到Log thingie的实际"类型".
所以现在我必须测试.你知道这意味着什么,它可能需要一分钟,但更可能需要一个小时或四个(类似于'小时'和'四'的拼写在现实生活中从来不是巧合).
但是,以下内容除了关于规范设置的省略部分外,确实有效:
container
.RegisterInstance("Logger", Log, new ContainerControlledLifetimeManager())
.RegisterType<IControllerContext, ControllerContext>
(
"CtlrCtx",
new ContainerControlledLifetimeManager(),
new InjectionConstructor(new ResolvedParameter<IMessageBuilder>("MsgBldr")),
new InjectionProperty("Log",new ResolvedParameter<ILog>("Logger"))
);
Run Code Online (Sandbox Code Playgroud)
因此,原始Log对象的哈希码和注入到我的marvy小对象对象的属性中的Log对象是相同的.
然而...
注入过程要求我通过其接口公开Context对象的Log属性,这意味着它不再是静态对象.并且log4net ILog对象是否是静态的似乎是决定它是否可序列化并且可以在程序集之间进行编组而没有戏剧性的"运行时将变得不稳定"警告(这对于Matrix粉丝来说真正有意义).
气馁,虽然没有阻止,但我使用Resharper的漂亮'带有支持字段的属性'并将支持字段设置为静态,而Interface属性保持非静态.它建成了,测试运行绿色.
所以我甚至进行了重建并且有效.所以也许当这个泡沫达到集成测试时,我会偷偷溜过log4net,这不是可序列化的崩溃.
所以也许这会有所帮助
谢谢
Stato
我想知道将NLog与托管可扩展性框架(MEF)一起使用的最佳方法是什么?
我有一个支持使用MEF架构(导入和导出等)插件的应用程序我想为我的应用程序添加日志记录功能.作为日志记录组件,我想使用NLog.
你会推荐什么?1.为NLog创建一个包装器,即配置NLog的其他插件,并导出其他插件导入的void Log(字符串级别,字符串消息)等函数.每个插件都应该拥有自己配置和使用的NLog实例.(他们都会写到同一个文件).
我试图更好地理解依赖注入模式,我遇到了是否应该注入记录器的问题。
我使用的语言是 Python,但这个概念是不可知的。我现在所做的只是将单例记录器模块导入到作用域中,并在必要时调用它。例如:
import logger
class Television(object):
def __init__(self, colour, inches):
self._colour = colour
self._inches = inches
def turn_on(self):
# do something
logger.message('TV has been turned on')
Run Code Online (Sandbox Code Playgroud)
如果我使用依赖注入,我会做这样的事情:
import logger
class Television(object):
def __init__(self, colour, inches, logger):
self._colour = colour
self._inches = inches
self._logger = logger
def turn_on(self):
# do something
self._logger.message('TV has been turned on')
Run Code Online (Sandbox Code Playgroud)
这使得代码更易于测试(尽管 python 是如此动态,以至于在测试时您可以实时模拟模块中的记录器)。
缺点是我必须通过使用替代构造函数、一些注入框架或服务定位器来处理注入。我不太确定这种努力是否有回报。
我看过其他类似的问题,但我无法真正理解它们,或者答案没有让我满意: