0

关于版本控制,语义日志记录应用程序块的文档建议:

如果确实需要修改 EventSource 类,则应将更改限制为添加方法以支持新的日志消息,以及添加现有方法的重载(这将具有新的事件 ID)。您不应删除或更改现有方法的签名。

假设我有以下 EventSource 类:

[EventSource(Name = "Instrumentation")]
public class InstrumentationEventSource : EventSource {
    private static readonly Lazy<InstrumentationEventSource> Singleton = new Lazy<InstrumentationEventSource>(() => new InstrumentationEventSource());

    public static InstrumentationEventSource Log { get { return Singleton.Value; } }

    private InstrumentationEventSource() {}

    [Event(eventId: 901)]
    public void EndPage(string url) {
        WriteEvent(901, url);
    }
}

然后我想添加对记录查询字符串的支持。我可以添加具有相同 ID 的重载方法吗?

[Event(eventId: 901)]
public void EndPage(string url) {
    WriteEvent(901, url);
}

[Event(eventId: 901)]
public void EndPage(string url, string queryString) {
    WriteEvent(901, url, queryString);
}

如何在对应用程序或进程外主机日志记录应用程序影响最小的情况下支持未来的修改?

我可以通过在模型类中进行添加来简化签名吗?

public class LogData {
    public string url { get; set; }
    // public string queryString { get; set; }
}

[Event(eventId: 901)]
public void EndPage(LogData data) {
    WriteEvent(901, data);
    // Or does the params object[] args parameter not support classes?
    // WriteEvent(901, data.url);
    // And this would have to be changed anyway?
    // WriteEvent(901, data.url, data.queryString);
}

我不太确定 Event ID 适合这一切的位置,以及EventSource类的维护需要多少注意这一点。

4

1 回答 1

1

EventSource 将您的日志记录显示为结构化数据。从这个意义上说,它是一个正式发布的 API。

然后我想添加对记录查询字符串的支持。我可以添加具有相同 ID 的重载方法吗?

不可以。EventIds 必须是唯一的。但是,如果您只需要向方法中添加新参数,那么只要将它们添加到允许的签名末尾(并增加事件版本)。

我可以通过在模型类中进行添加来简化签名吗?

否,因为 Event 参数必须是原始类型(基本上)。不支持自定义类型,例如 LogData。

假设你有:

[Event(eventId: 901)]
public void EndPage(string url) {
    WriteEvent(901, url);
}

并且您想向该方法添加更多信息,然后您可以修改现有方法:

[Event(eventId: 901, Version = 1)]
public void EndPage(string url, string queryString) 
{
    WriteEvent(901, url, queryString);
}

如果您不希望它影响现有的调用者,您可以为参数提供默认值:

[Event(eventId: 901, Version = 1)]
public void EndPage(string url, string queryString = null) 
{
    WriteEvent(901, url, queryString);
}

或者,您可以为现有客户端提供非事件重载以供使用:

[NonEvent]
public void EndPage(string url) {
    this.EndPage(url, null);
}

[Event(eventId: 901, Version = 1)]
public void EndPage(string url, string queryString) 
{
    WriteEvent(901, url, queryString);
}
于 2015-07-09T07:34:06.813 回答