簡體   English   中英

從自定義界面記錄Log4Net

[英]Log4Net logging from custom interface

我想知道如何使用log4net(在我的示例中)在%logger模式中打印正確的類名。

在我的應用程序中,我正在使用實現日志記錄接口的日志記錄類(在SOLID之后)。 其他類使用日志記錄接口抽象來執行實際的日志記錄。 我想切換到Log4Net,但是我正在考慮保留日志記錄抽象。 自定義日志記錄類方法將對象作為參數並根據其狀態創建日志。

因此,在下面的示例中,%logger模式將記錄“ MyLogger”,這是預期的,但是我想記錄調用類的名稱(在本例中為ObjectManipulator)。

using System.Reflection;
using log4net;

namespace LoggingTestur
{
    class Program
    {
        class AnObject
        {
            public string State { get; set; }
        }

        interface IMyLogger
        {
            void LogObjectStateChenge(AnObject anObject);
        }

        class MyLogger : IMyLogger
        {
            private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

            public void LogObjectStateChenge(AnObject anObject)
            {
                Log.InfoFormat("AnObject's state is: {0}", anObject.State);
            }
        }

        class ObjectManipulator
        {
            private readonly IMyLogger _logger;

            public ObjectManipulator(IMyLogger logger)
            {
                _logger = logger;
            }

            public void Manipulate()
            {
                var anObject = new AnObject { State = "New" };
                _logger.LogObjectStateChenge(anObject);
            }
        }

        static void Main(string[] args)
        {
            var logger = new MyLogger();
            var manipulator = new ObjectManipulator(logger);
            manipulator.Manipulate();
        }
    }
}

您可以通過以下幾種方法獲取類名:

  1. 將其作為參數傳遞,即LogObjectStateChange(AnObject anObject, Type type = null);

  2. 如果您的目標是4.5運行時,則可以使用CallerFilePath屬性獲取文件名,然后從中提取類名(假設每個類有一個文件,並且文件名與類名相同),即LogObjectStateChange(AnObject anObject, [CallerFilePath] string fileName = "")

  3. 使用反射從CallStack和StackFrame類獲取調用類。 請注意,盡管在Release版本中,編譯器可能會內聯方法或以其他方式重新安排內容,從而導致堆棧跟蹤中的信息不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM