c# - 在异常日志记录中跟踪用户 ID

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

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

这听起来很容易,因为我可以将 UserID 传递到 Logger 函数调用中,但因为这是一个遗留系统,我不能更改调用参数。我可以在程序第一次启动时或在记录器本身内部添加一些代码,但修改每个调用签名是不可能的。

如何在记录器中获取用户 ID 而无需在每次记录器调用时都传递给它?

这是我当前的功能以及我的问题是什么:

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

最佳答案

答案是你不能。

但是可以使参数可选。这样您修改的代码将具有 user_id 并且其他代码不会中断。

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

关于c# - 在异常日志记录中跟踪用户 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35094667/

相关文章:

c# - 在 Word 文档的开头插入文本 - openXML

c# - 带有 when 子句的 switch 语句的评估顺序是什么?

c++ - FF 的除数(计算给定数的除数乘积的除数数)

c# - SocketAsyncEventArgs 缓冲区充满了零

.net - 如何使用ConcurrentDictionary,INotifyCollectionChanged,INotifyPropertyChanged创建自定义可观察集合

algorithm - 选择贪心算法寻找成本最低的路径

html - 如何在 C 中查找所有出现的子字符串

c# - 由于包 ZedGraph 不兼容,无法运行包 EmguCV

c# - 如何使用 C# NEST 客户端将 post_filter 添加到 ElasticSearch 查询?

c# - 如何在 C# 程序中以 RAII 样式管理 COM 对象运行时?