在异常日志记录中跟踪UserID

时间:2016-01-29 21:50:20

标签: c# .net algorithm web-services error-logging

我有一个包含数百个并发用户的Web服务,我有一个静态日志记录类来记录引发的错误。我需要在记录器中跟踪最初未被跟踪的UserID。

这听起来非常简单,因为我可以将UserID传递给Logger函数调用,但由于这是遗留系统,我不能更改调用参数。我可以在程序首次启动时添加一些代码,或者在记录器本身内添加一些代码,但是修改每个调用签名都是不可能的。

如何在记录器中获取userID而不在每次记录器调用中都传递给它?

这是我当前的功能以及我的问题所在:

public static class Log
{
    public static void Error(object message, Exception ex)
    {
        log.Error(message, ex);

        IDictionary customData = new Dictionary<string, string>() {{"message", message.ToString()}};
        customData.Add("UserID",???????);
        DoLogging(ex, customData);
    }
}

以下是我无法使用的琐事解决方案:

public static class Log
{
    public static void Error(object message, Exception ex, int userID)
    {
        log.Error(message, ex);

        IDictionary customData = new Dictionary<string, string>() {{"message", message.ToString()}};
        customData.Add("UserID", userID.ToString());
        DoLogging(ex, customData);
    }
}

一个可能的解决方案是在Logger类中保存某种类型的静态变量,但请记住,这个类是静态的,并且可能有数百个并发实例,如何判断哪个实例正在调用记录器?

public static class Log
{
    private static concurrent DataStrucutre userIDs;
    public static void Error(object message, Exception ex)
    {
        log.Error(message, ex);

        IDictionary customData = new Dictionary<string, string>() {{"message", message.ToString()}};
        customData.Add("UserID",userIDs[????]);
        DoLogging(ex, customData);
    }
}

1 个答案:

答案 0 :(得分:2)

答案是你不能。

可以使参数可选。这样,您修改的代码将user_id,其他代码不会中断。

How can you use optional parameters in C#?的答案讨论了如何在4.0版中执行此操作或在早期版本中(通过重载)。