2016-01-29 3 views
1

У меня есть веб-сервис с сотнями одновременных пользователей, у меня есть статический класс ведения журналов для регистрации ошибок, которые возникают. Мне нужно отслеживать UserID в журнале, который изначально не отслеживался.Отслеживание UserID в журнале регистрации исключений

Этот звук очень прост, потому что я мог просто передать UserID в вызов функции Logger, но поскольку это устаревшая система, я не могу изменить параметр вызова. Я могу добавить код, когда сначала запускается программа, или внутри самого журнала, но для изменения каждой сигнатуры вызова не может быть и речи.

Как получить идентификатор пользователя в журнале, не переходя к нему в каждом вызове журнала?

Вот моя текущая функция и то, что моя проблема:

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); 
    } 
} 
+0

Если вы не хотите передавать его в каждом вызове, существует ли еще один способ для получения * идентификатора пользователя *? В таком случае, что это? В противном случае я не вижу, как журнал мог бы получить его без изменения уже существующей кодовой базы ... – skypjack

+0

Ну, есть определенная функция, которая может получить текущий идентификатор пользователя, заданный НИЧЕГО, но как статический Logger предположил, что пользователь получить только с Исключением? – Bill

+0

Вы можете обернуть код так, как будто это критический раздел, таким образом контролируя, кто и как к нему обращается журнал, если идентификатор пользователя тесно связан с текущим потоком. Не уверен, что это работает, я думаю, что многие детали упущены, чтобы определить правильное решение, извините ... – skypjack

ответ

2

Ответ заключается в том, что вы не можете.

Но вы можете сделать аргумент опционным. Таким образом, код, который вы измените, будет иметь user_id, а другой код не сломается.

Ответы How can you use optional parameters in C#? обсуждают, как это сделать в версии 4.0 или (через перегрузку) в более ранних версиях.

+0

Несчастливо, ну хорошо – Bill

Смежные вопросы