需要一种不显眼的日志记录方法

本文关键字:不显眼 日志 记录 方法 一种 | 更新日期: 2023-09-27 18:33:45

所以,我应该设计一个方法来记录我的应用程序所做的一切,我正在考虑在我的方法中做这样的事情:

声明:

public static void Write(string text, params object[] parameters) {}

用法:

if (Log.On) Log.Write("Hello", valueA, valueB, valueC);

所以在我看来,这是优雅而干净的。但是,它有一个很大的缺陷,即值没有以任何方式标记。对我来说,显而易见的解决方案是这样的方法:

public static void Write(string text, Dictionary<string, object> parameters) {}

但是这种方法会使我的代码混乱。

if (Log.On)
{
Dictionary<string, object> p = new Dictionary<string, object>();
p.Add("valueA", valueA);
p.Add("valueB", valueB);
p.Add("valueC", valueC);
Log.Write("Hello", p);
}

任何想法如何使这种方法尽可能不引人注目?

需要一种不显眼的日志记录方法

你可以使用这个:

public static void LogValues(string text, object values)
{
    var properties = values.GetType().GetProperties();
    Log.WriteLine(text + ": " + string.Join(", ",
        properties.Select(property =>
        {
            var name = property.Name;
            var value = property.GetValue(values);
            return name + " = " + (value != null ? value.ToString() : "null");
        })));
}

喜欢这个:

int x = 5;
double y = 7.2;
LogValues("Some message", new { y, s = "test", x });

这将在您的日志中生成如下行:

Some message: y = 7.2, s = test, x = 5

这里的关键是使用 values 参数的匿名类型。这允许您传入"命名"变量,而不仅仅是这些变量的值。

如果要对打印出来的<name> = <value>对进行一致的排序,可以在 LINQ 查询中的.Select(...)之前插入一个.OrderBy(property => property.Name)