【问题标题】:What is a simple way to log all items in a list using log4net (or other logging frameworks)?使用 log4net(或其他日志框架)记录列表中所有项目的简单方法是什么?
【发布时间】:2010-08-07 16:44:50
【问题描述】:

我通常有返回 IList 的方法。 我需要在此列表中记录返回的结果。

有没有比循环列表中的项目并像这样一一打印更好的方法?

foreach(string productName in productsNames)
            {
                prodsNames.Append(productName + " ");
            }
Logger.Debug("Loading data for Producers: " + prodsNames);

有什么方法可以让这更容易吗?

【问题讨论】:

    标签: .net logging log4net


    【解决方案1】:

    我会为 log4net 编写一个包装器,它会公开这样的方法:

    void Debug(string message, IList elements);
    

    实现如下(省略了一些细节):

    public Debug(string message, IList elements)
    {
        // this.Logger returns a reference to ILog object
        if (this.Logger.IsDebugEnabled)
        {            
            string logMessage;
            // build the string that you want to write to the log
            this.Logger.Debug(logMessage);      
        }
    }
    

    这只是一个例子:您可以按照最适合您的方式设计界面。

    Here 你可以找到一些关于包装器可能是什么样子的想法。

    【讨论】:

    【解决方案2】:

    将列表序列化为 XML,记录 XML 字符串。

    【讨论】:

    • 谢谢,我已经将我的列表序列化到 json 中,然后将其传递给我的动态对象,然后传递给 serilog,它就可以工作了。这只是一个基本的字符串列表,我希望 serilog 能够处理它,但似乎并不可悲。
    【解决方案3】:

    有什么理由不使用string.Join()

    Logger.Debug("Loading data for Producers: " + string.Join(" ", productsNames));
    

    【讨论】:

    • 这绝对有效,但会产生在格式化上花费 CPU 周期/堆分配的副作用,即使未启用调试日志记录级别(这是否重要取决于情况的性能要求, 当然:-))
    【解决方案4】:

    使用 NLog 和 Serilog,您可以这样做:

    Logger.Debug("Loading data for Producers: {producers}", prodsNames);
    

    另见https://messagetemplates.org/

    【讨论】:

    • 与字符串格式选项不同,如果您将事件发送到支持 JSON 的日志服务器,则可以使用 producers[?] = 'apples' 等查询很好地搜索元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多