我正在开发一个包含三个Windows服务和几个普通Windows应用程序(.exe)的大型产品。现在我们要转向ETW和语义记录,并使用Microsoft.Diagnostics.Tracing.EventSource。
我在某处读到应用程序的所有逻辑连接部分都应使用相同的事件源。这意味着我们希望为我们的服务提供几乎一个EventSource。但是,如果不在产品中的几乎所有组件中引入依赖关系,我们怎么做呢?
该应用程序目前包含大约70个程序集。并且为了能够在EventSource中创建一个log-method(例如接受枚举值),包含事件源的程序集必须引用定义枚举的程序集,这意味着需要将枚举定义从使用它的程序集,或者.exe可能是所有程序集引用的东西。
是否有某种方法可以在一个仍然使用相同ETW EventSource的应用程序中从EventSource派生几个类?或者,如果不希望引入一大堆新的依赖项来创建日志类,那么在这样的场景中使用ETW实现语义日志记录的好方法是什么?
答案 0 :(得分:0)
有三种策略:
答案 1 :(得分:0)
小心,EventSource
课程必须密封!
如果您想使用EventSource
使用依赖注入,则有一种解决方法......
定义一个简单的界面:
// A simple interface to log what you need ...
public interface ILog
{
void Debug(string message);
void Info(string message);
void Warn(string message);
void Error(string message);
void Error(string message, Exception exception);
}
实现(接口的实现必须使用NonEventAttribute
:
[EventSource(Name = "MyLogEventsource")]
public class Log : EventSource, ILog
{
public Log()
{
EventSourceAnalyzer.InspectAll(this);
}
[NonEvent]
public void Debug(string message)
{
DebugInternal(message);
}
[Event(1)]
private void DebugInternal(string message)
{
WriteEvent(1, message);
}
[NonEvent]
public void Info(string message)
{
InfoInternal(message);
}
[Event(2)]
private void InfoInternal(string message)
{
WriteEvent(2, message);
}
[NonEvent]
public void Warn(string message)
{
WarnInternal(message);
}
[Event(3)]
private void WarnInternal(string message)
{
WriteEvent(3, message);
}
[NonEvent]
public void Error(string message)
{
ErrorInternal(message, "", "");
}
[NonEvent]
public void Error(string message, Exception exception)
{
ErrorInternal(message, exception.Message, exception.ToString());
}
[Event(4)]
private void ErrorInternal(string message, string exceptionMessage, string exceptionDetails)
{
WriteEvent(4, message, exceptionMessage, exceptionDetails);
}
}
您现在可以注入您的日志记录类^^
答案 2 :(得分:0)
我通常这样做,即使它们使用事件源的单个实例,也存在接口隔离。在我的ioc中,所有使用ISingletonDependency的代码都注册为singleton。因此,您可以使用非常具体的方法调用接口,但它们仍然是相同的EventSource。
希望这有帮助。
public MyCompanyEventSource: IMyCompanyEventSource, ISingletonDependency{
}
public IMyCompanyEventSource: IComponentLogger1, IComponentLogger2, IComponentLogger3{
}
public Component1{
public Component1(IComponentLogger logger){
}
}