log4net에 사용자 정의 iobjectrenderer를 어떻게 등록합니까?

StackOverflow https://stackoverflow.com/questions/175109

  •  05-07-2019
  •  | 
  •  

문제

log4net을 사용하는 것에 대한 연구를하고 있는데 iobjectrenderer 흥미로운 인터페이스. 유형이 기록되는 방법을 제어 할 수 있고 다른 사용자 친화적 인 다른 제품을 제공 할 수 있습니다. ToString() 구현. 방금 log4net을보기 시작했지만 유형과 렌더러 간의 연관성을 프로그래밍 방식으로 설정하는 논리적 인 방법을 찾을 수없는 것 같습니다.

나는 이것이 XML 구성 파일에서 설정할 수 있음을 발견했습니다. 수동, 그러나 프로그래밍 방식으로 추가하는 것에 대한 힌트를주지 않았습니다. 어떤 경우에는 프로그래밍 방식의 객체 렌더러가있는 것 같습니다. 그래서 나는 이것을하는 방법이 궁금합니다.

도움이 되었습니까?

해결책

나는 질문을 쓰면서 그것으로 약간 찌르고 이것을 생각해 냈습니다.

using System.IO;
using log4net;
using log4net.Config;
using log4net.ObjectRenderer;
using log4net.Util;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            BasicConfigurator.Configure();

            ILog log = LogManager.GetLogger(typeof(Program));
            var repo = LogManager.GetRepository();
            repo.RendererMap.Put(typeof(Foo), new FooRenderer());

            var fooInstance = new Foo() { Name = "Test Foo" };
            log.Info(fooInstance);
        }
    }

    internal class Foo
    {
        public string Name { get; set; }
    }

    internal class FooRenderer : log4net.ObjectRenderer.IObjectRenderer
    {
        public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
        {
            if (obj == null)
            {
                writer.Write(SystemInfo.NullText);
            }

            var fooInstance = obj as Foo;
            if (fooInstance != null)
            {
                writer.Write("", fooInstance.Name);
            }
            else
            {
                writer.Write(SystemInfo.NullText);
            }
        }
    }
}

이것이 올바른 방법인지 확실하지 않지만 그것이 효과가 있다는 것을 알고 있습니다.

다른 팁

렌더러를 프로그래밍 방식으로 등록하지 않으려면이 라인을 log4net의 루트에 추가 할 수도 있습니다.

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top