1

Enterprise Library 5.0のロギングコードブロックを使用するロギングライブラリを構築しようとしていますが、構成が構成ファイルからのものである場合に機能するCustomTraceListenerを作成できましたが、構成ソースビルダーを介して構成しようとしています。次のエラーが発生します。

"Unable to find appropriate 0 argument constructor for CustomTraceListener"

EL5.0コードベースを使用してエラーを見つけようとすると、CustomTraceListenerDataの構築文字列の作成に特に問題があります。

コードは次のとおりです。

using System;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
using System.Diagnostics;
using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;

namespace AHCALoggerLibrary
{
[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class ServiceTraceListener : CustomTraceListener
{
    public ServiceTraceListener()
        : base() {}

    public override void TraceData(System.Diagnostics.TraceEventCache eventCache, string source, System.Diagnostics.TraceEventType eventType, int id, object data)
    {
        base.TraceData(eventCache, source, eventType, id, data);
    }

    public override void TraceData(System.Diagnostics.TraceEventCache eventCache, string source, System.Diagnostics.TraceEventType eventType, int id, params object[] data)
    {
        base.TraceData(eventCache, source, eventType, id, data);
    }

    public override void Write(string message)
    {
        throw new NotImplementedException();
    }

    public override void WriteLine(string message)
    {
        throw new NotImplementedException();
    }
}

public class AHCALogger
{
    private static AHCALogger _logger = new AHCALogger();

    private LogWriter _Service = null; 

    public static LogWriter Service { get { return _logger._Service;} }

    private AHCALogger() { }

    public static void Init()
    {
        var builder = new ConfigurationSourceBuilder();

        builder.ConfigureLogging()
               .WithOptions
                 .DoNotRevertImpersonation()
               .LogToCategoryNamed("General")
                .WithOptions.SetAsDefaultCategory()
                    .SendTo.Custom<CustomTraceListener>("ServiceTraceListener")
                   .FormatWith(new FormatterBuilder()
                     .TextFormatterNamed("Text Formatter")
                       .UsingTemplate("Timestamp: {timestamp}...{newline})}"))
                 .SendTo.EventLog("Formatted EventLog TraceListener")
                    .FormatWithSharedFormatter("Text Formatter")
                      .ToLog("Application");

        var configSource = new DictionaryConfigurationSource();
        builder.UpdateConfigurationWithReplace(configSource);
        EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
        _logger._Service = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
    }
}
}

次に、ロガーを使用するには:

        AHCALogger.Init();
        AHCALogger.Service.Write("hello");

構成ファイルの設定を使用して次のコマンドを呼び出すと機能するため、構成が間違っていると思われます。

LogWriter ahcaLogger = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
ahcaLogger.Write("hello");

ConfigurationSourceBuilderの使用方法に関する詳細情報を見つけようとしましたが、役に立ちませんでした。

誰かがこれを手伝ってくれますか?

4

1 に答える 1

1

交換する必要があります

.SendTo.Custom<CustomTraceListener>("ServiceTraceListener") 

 .SendTo.Custom<ServiceTraceListener>("ServiceTraceListener")

エラーメッセージは、基本的に抽象クラスをインスタンス化できないことを示しています。具体的なクラスを渡す必要があります。[ConfigurationElementType(typeof(CustomTraceListenerData))]は効果がないため、とにかく必要ありません。

カスタム構成データをトレースリスナーに渡すには、データがTraceListener基本クラスのAttributesコレクションに格納されていることに注意する必要があります。これは、ctorでリスナーを初期化することはできませんが、最初のログ呼び出しで初期化できることを意味します。

静的ロガーのものを少しクリーンアップして、簡単にしました。

この厄介なSynchronizationLockExceptionのデバッグ中に気づきました

「オブジェクト同期メソッドが、同期されていないコードブロックから呼び出されました。」

これはEntlib5yuckのバグのようです。自分でユニティを再コンパイルして修正する以外に、これを回避する方法はまだ見つかりません。

これは、カスタムデータを使用した作業ロガーのコードです。

using System;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
using System.Linq;
using System.Collections.Specialized;
using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;

class Program
{
    static void Main(string[] args)
    {
        AHCALogger.Service.Write(new LogEntry() { Message = "Hi" });
    }
}

public static class AHCALogger
{
    static Lazy<LogWriter> _Service = new Lazy<LogWriter>(Init);
    public static LogWriter Service
    {
        get { return _Service.Value; }
    }

    static LogWriter Init()
    {
        var builder = new ConfigurationSourceBuilder();
        var serviceConfig = new NameValueCollection();
        serviceConfig.Add("Key", "data");
        builder.ConfigureLogging()
            .LogToCategoryNamed("General")
            .WithOptions.SetAsDefaultCategory()
            .SendTo.Custom<ServiceTraceListener>("ServiceTraceListener", serviceConfig);

        var configSource = new DictionaryConfigurationSource();
        configSource.Add(LoggingSettings.SectionName, builder.Get(LoggingSettings.SectionName));
        var cont = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
        return cont.GetInstance<LogWriter>();
    }
}

public class ServiceTraceListener : CustomTraceListener
{
    public ServiceTraceListener() { }
    public override void Write(string message)
    {
        Console.WriteLine("Custom trace Listener Data {0}", 
            String.Join(Environment.NewLine, base.Attributes.Keys.OfType<string>().Select(key => "[" + key + "]: " + base.Attributes[key])));
        Console.WriteLine("message: {0}", message);
    }
    public override void WriteLine(string message) 
    {
        Write(message + Environment.NewLine);
    }
}
于 2012-05-05T08:39:55.827 に答える