簡體   English   中英

使用NLog進行日志記錄所需的C#派生類類型

[英]C# derived class type needed in base for logging using NLog

我們正在使用NLog登錄C#MVC3 Web應用程序。 我們所有的控制器都擴展了自定義基礎“ ApplicationController”,使我們可以訪問不斷需要的方法和s成員。

我希望所有控制器都可以通過此基類訪問Logger,但是希望了解知道日志語句源自哪個派生類的詳細信息。

我們的應用程序控制器如下所示:

public abstract class ApplicationController : Controller
{
    protected Logger _logger;
    protected virtual Logger Logger
    {
        get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); }
    }

    protected ApplicationController()
    {
        Context = new Entities();
    }

如果派生的控制器沒有覆蓋Logger,則所有語句將顯示它們源自Application控制器。 當前,在所有派生的控制器中,我基本上具有相同的Logger語句。 例如:

public class PropertyController : ApplicationController
{
    private readonly DatatapeService _datatapeService;
    private readonly PropertyService _propertyService;
    protected override Logger Logger
    {
        get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); }
    }

顯然,這是不良的實施實踐。

  1. 我該如何晾干呢? 具體而言,我對缺乏C#才能准確完成此特定任務的理解是什么?
  2. 在不直接暴露日志記錄類(NLog)的地方是否應該遵循一種日志記錄模式?

TIA!

我不熟悉NLog,但是在Log4Net中,語法LogManager.GetLogger(this.GetType())將完成您想要的。 即使在基礎ApplicationController類中調用了GetType也會在繼承層次結構中返回葉類型,當首次創建記錄器時(即:首次訪問Logger屬性時)它將使用PropertyController類型實例化它

NLog API與Log4net略有不同。 您需要使用

Logger = LogManager.GetLogger(GetType().Name);

如果僅傳遞類型,LogManager將期望記錄器類型(即自定義記錄器)

NLog Wiki的如何為子類創建記錄器”頁面現在建議以下模式:

class BaseClass
{
    protected BaseClass()
    {
        Log = LogManager.GetLogger(GetType().ToString());
    }

    protected Logger Log { get; private set; }
}

class ExactClass : BaseClass
{
    public ExactClass() : base() { }
    ...
}

只需在此處檢查nLog Wiki

在大多數情況下,每個班級只有一個記錄器,因此為記錄器提供與當前班級相同的名稱是很有意義的。

這樣做很有意義

public abstract class ApplicationController : Controller
{
    protected Logger _logger;
    protected virtual Logger Logger(string className)
    {
       return LogManager.GetLogger(className);
    }
}


public class PropertyController : ApplicationController
{
    private readonly DatatapeService _datatapeService;
    private readonly PropertyService _propertyService;
    protected override Logger Logger()
    {
        return base.Logger("PropertyController ");
    }
}

暫無
暫無

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

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