c# - 如何编写和使用/配置呈现通用集合(并使用属性)的 log4net 对象渲染器?

标签 c# generics logging log4net log4net-configuration

我有几个通用集合,例如,

IList<MyClass>
IList<MyOtherClass>

1) 我如何为此编写 log4net IObjectRenderer?到目前为止我得到的是:

public class ListOfMyClassRenderer : IObjectRenderer
{
    public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
    {
        try
        {
                var myList = obj as List<MyClass>;
                int no = 1;
                foreach (MyClass entry in myList)
                {
                    writer.Write("Entry {0}: PropertyA={1} PropertyB={2}\n",
                            no++,
                            entry.PropertyA,
                            entry.PropertyB);
                }
        }
        catch (NullReferenceException ex)
        {
            writer.Write(SystemInfo.NullText);
        }
    }
}

2) 我该如何在 Log4Net.config 文件中进行配置?我有:

<renderer renderingClass="MyNamespace.ListOfMyClassRenderer" renderedClass="System.Collections.IList<MyClass>" />

3)最后一个问题。如果我想将每个条目写入 log4net 属性,我该怎么做?我应该使用 RendererMap 吗?

最佳答案

以下链接是Better Stack Overflow Answer 。为了完整性保留我的问题:

1) 这可以通过创建 IList 的渲染器并询问它正在使用什么泛型来完成。我们无法为每个泛型创建一个渲染器类,但可以工作。

class MyListRenderer : IObjectRenderer
{
    public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
    {
        var myList = obj as IList<MyClass>;
        if (myList != null) {
            try
            {
                int no = 1;
                foreach (MyClass entry in myList)
                {
                    writer.Write("Entry {0}: PropertyA={1} PropertyB={2}\n",
                            no++,
                            entry.PropertyA,
                            entry.PropertyB);
                }
            }
            catch (NullReferenceException ex)
            {
                writer.Write(SystemInfo.NullText);
            }
        }
        else
        {
            new DefaultRenderer().RenderObject(rendererMap, obj, writer);
        }
    }
}

请注意,如果其他一切都失败,我们将如何使用默认渲染器。这保留了默认的 IList 渲染。可能已经扩展了 DefaultRenderer() 但它是密封的。

2)这可以通过使用进行配置

<renderer renderingClass="MyNamespace.MyListRenderer" renderedClass="System.Collections.IList" />

3) 似乎不可能使用对象渲染器设置 log4net 属性。

关于c# - 如何编写和使用/配置呈现通用集合(并使用属性)的 log4net 对象渲染器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12197188/

相关文章:

c# - 在 Blazor 组件中使用具有继承的泛型类型

java - 每当由 DOMConfigurator.configureAndWatch 方法创建的线程重新加载 log4j.xml 时都需要回调

c# - AOP(面向方面​​的编程)和日志记录。它真的很实用吗?

C#:有没有办法确定一个范围内的元素是否为空?

c# - 比较 : LINQ vs LAMBDA Expression

c# - 清除包含敏感数据的 c# 字节数组

delphi - 我可以使用泛型对类似类型的控件执行相同的操作吗?

java - 如何在异构映射中使用泛型?

java - log4j.xml 文件位于类路径中,但 log4j 无法检测到

c# - Xaml C# 绑定(bind)数据仅在第一次有效