5

Microsoft Enterprise Library 5.0のLoggingブロックを使用していますが、LogWriterクラスとLoggerクラスの違いを知りたいと思いました。ロギングで使用するために構築したカスタムトレースリスナーがいくつかあり、LoggerとLogWriterを使用しても効果があるかどうかを知りたいと思いました。

MSDNからhttp://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.logging.logwriter.aspx

ログメッセージをデフォルト構成に書き込むには、ロガーファサードを使用します。カスタム構成を使用してログメッセージを書き込む必要がある場合にのみ、LogWriterのインスタンスを作成します。

コード例1:

namespace ExampleOne
{
    using System;
    using System.Diagnostics;
    using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
    using Microsoft.Practices.EnterpriseLibrary.Logging;

    public class Program
    {
        private static LogWriter logger = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();

        public static void Main(string[] args)
        {
            try
            {
                throw new Exception("My test exception message");
            }
            catch (Exception ex)
            {
                LogEntry logEntry = new LogEntry();
                logEntry.Message = "Error: " + ex.ToString();
                logEntry.Categories.Add("General");
                logEntry.Severity = TraceEventType.Error;
                logger.Write(logEntry);
            }
        }
    }
}

コード例2:

namespace ExampleTwo    
{
    using System;
    using System.Diagnostics;
    using Microsoft.Practices.EnterpriseLibrary.Logging;

    public class Program
    {        
        public static void Main(string[] args)
        {
            try
            {
                throw new Exception("My test exception message");
            }
            catch (Exception ex)
            {
                LogEntry logEntry = new LogEntry();
                logEntry.Message = "Error: " + ex.ToString();
                logEntry.Categories.Add("General");
                logEntry.Severity = TraceEventType.Error;
                Logger.Write(logEntry);
            }
        }
    }
}
4

2 に答える 2

5

依存性注入を使用する方が簡単で、ロガーがデータベースに書き込んだり、メールを送信したり、その他の方法で大きな外部コンポーネントとやり取りしたりする場合の単体テストが容易になるため、現在のインスタンスを取得するバージョンは、より良いバージョンになるための一部です。テスト対象のコードとは関係のない動作があります。

一方、目標がチームへのログオンを促進することである場合は、最小限のセットアップでログを記録することをお勧めしますが、構成は構成ファイル駆動型であり、テストと本番用に別々の構成ファイルが必要になります。

また、実際の組織では、運用担当者がWeb config(またはこの場合はEnt Lib config)のスーパー忍者であると常に期待できるとは限りません。場合によっては、ロギングをオンにしたりオフにしたりするUIを提供する必要があります。動作(別のメーリングリスト/ユーザーリストにエラーを送信するなど)であり、動的な構成が必要になります。私は組織で働いていましたが、UIを介してログの動作を変更するのは通常のトランザクションでしたが、web.configの文字を変更するだけで、神と変更管理ボードの巧妙な行動を取りました。

于 2012-12-26T17:21:56.560 に答える
5

静的Logger.Write()ファサードを使用する場合と、LogWriterのWriteメソッドを使用する場合に違いはありません。

Logger.Writeの機能は次のとおりです。

public static void Write(LogEntry log)
{
    Writer.Write(log);
}

ここで、WriterはLogWriterのインスタンスです。Logger.Write()は、EnterpriseLibraryの以前のリリースとの下位互換性のために提供されています。推奨されるアプローチは、主にテスト容易性が向上しているため、LogWriterインスタンスを使用することです。

エンタープライズライブラリオブジェクトの作成と参照から:

バージョン5.0より前のバージョンのEnterpriseLibraryのデフォルトのアプローチであったレガシーの静的ファサードとファクトリは引き続き使用可能であり、下位互換性の目的で引き続きサポートされます。ただし、このトピックの前のセクションで説明したように、新しいコードでは、サービスロケーターアプローチまたはコンテナーに直接アクセスするための手法のいずれかを使用する必要があります。

投稿された例外ロギングの例に基づいて、開発者がログに記録する必要がなく、例外を処理するだけで済むように、ロギングと一緒に例外処理ブロックを使用することを検討することをお勧めします。Processメソッドを使用して呼び出しをラップし、呼び出されたメソッドにコードが不要になるようにすることができる場合があります。

ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
em.Process( () => MethodThatMightThrow(), "My Logging Exception Policy"); 

別のアプローチは、 ExceptionCallhandlerとともにインターセプトを使用することです。

これらのアプローチはどちらも、設計の観点からはわずかに制限されますが、例外ロギングを開発者から完全に隠すことができるため、開発者はボイラープレートロギングコードの代わりにアプリケーションの記述に集中できます。

于 2012-12-30T07:11:18.743 に答える