9

log4netの使用について調査していますが、IObjectRendererインターフェースが興味深いことがわかりました。これにより、タイプのログ記録方法を制御し、別の、おそらくよりユーザーフレンドリーなToString()実装を提供できます。しかし、log4netを調べ始めたばかりですが、タイプとレンダラーの間の関連付けをプログラムで設定する論理的な方法を見つけることができないようです。

これは、マニュアルを読むことでXML構成ファイルで設定できることがわかりましたが、プログラムでこれらを追加することについてのヒントは得られませんでした。場合によっては、プログラマティックオブジェクトレンダラーが必要なように思われるので、これを行う方法に興味があります。

4

2 に答える 2

10

質問を書いている間、私はそれをいじくり回して、これを思いついた:

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

これが正しい方法かどうかはわかりませんが、うまくいったことは知っています。

于 2008-10-06T16:45:18.127 に答える
3

レンダラーをプログラムで登録したくない場合は、この行をlog4netのルートに追加することもできます。

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />
于 2012-07-26T19:01:33.620 に答える