網站偵錯紀錄-NLog 如何做Target-撰寫DLL

網站偵錯紀錄-NLog 如何做Target-撰寫DLL

DotBlog 的標籤: , ,

   

   接上一篇(http://www.dotblogs.com.tw/c5todo/archive/2013/10/15/124125.aspx)設定好了網站的NLog.config後,

現在就來寫類別專案的內容,要注意的事項如下所列。

1. 引用元件,如左所列:Nlog.Targets、NLog.Config、NLog。

2. 在該Class上加上Attribute =>Target+([在Nlog.config內的目標Name一樣]),並繼承TargetWithLayout,如左圖image

3. Override Write這個Function,然後在內依照自己的方式去寫Log,這個Function特別事項如下:

3.1 Write其傳入參數[LogEventInfo]會帶入,在上層傳來的訊息。

3.2 LogEventInfo的StackTrace、Exception,會有沒有值,這部分在研究中,要如何秀出。

4. 在Nlog.config內有一行設定(如下行),其中的LogPathName是可以自行定義,然後本Class在寫一個公開的屬性就可以拿到設定的Value。

image

5. 記得網站專案要參考這個類別專案。

 

下面是完整的程式碼,其中的XML寫法是參考(http://bibby.be/2012/08/nlog-elamh.html)所寫的,目的是讓Elmah可以辨識該檔案,不過這部分

有些問題,所以要直接使用的話,會有Type不見及資料錯亂的問題,要小心服用。


using System.Collections.Generic;
using System.Linq;
using System.Web;
using NLog.Targets;
using NLog.Config;
using NLog;
using System.Configuration;
using System.Xml.Linq;

namespace NlogTargetElmahXML
{
    [Target("Elmah")]
    public sealed class ElmahTarget : TargetWithLayout
    {
        static ElmahTarget()
        {
            ConfigurationItemFactory.Default.Targets
                    .RegisterDefinition("Elmah", typeof(ElmahTarget));
        }

        public ElmahTarget()
        {
        }

        public string LogPathName { get; set; }

        #region for XML
        protected override void Write(LogEventInfo logEvent)
        {
            //var webPhysicalPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
            var logPathDir =  ConfigurationManager.AppSettings[LogPathName];

            var application = System.Web.Hosting.HostingEnvironment.ApplicationID;

            var time = logEvent.TimeStamp.ToUniversalTime();

            var errorId = Guid.NewGuid();

            var variables = from k in HttpContext.Current.Request.ServerVariables.AllKeys
                            let v = HttpContext.Current.Request.ServerVariables[k]
                            select new XElement("item",
                                                new XAttribute("name", k),
                                                new XElement("value",
                                                             new XAttribute("string", v)));
            

            var xdoc = new XElement("error",
                                   new XAttribute("errorId", errorId),
                                   new XAttribute("application", application),
                                   new XAttribute("host", System.Environment.MachineName),
                                   new XAttribute("type", logEvent.Exception == null ?
                                                     "" : logEvent.Exception.ToString()),
                                   new XAttribute("message", logEvent.FormattedMessage),
                                   new XAttribute("source", logEvent.LoggerName),
                                   new XAttribute("detail", logEvent.StackTrace == null ?
                                                             "" : logEvent.StackTrace.ToString()),
                                   new XAttribute("time", time.ToString("s") + "Z"),
                                   new XAttribute("statusCode", "0"),
                                   new XElement("serverVariables", variables));
            var saveLogPath = string.Format(@"{0}\error-{1}-{2}.xml",  logPathDir, time.ToString("yyyy-MM-ddhhss") + "Z", errorId);//存檔路徑
            xdoc.Save(saveLogPath);
        }
        #endregion
    }
}

透過上面方式在網站專案參考後,就完成了本次的目地將Log訊息寫成讓Elmah可辨識的XML檔,成功畫面如下,

測試碼

image

 

成功畫面

image

 

透過這種參考自製Dll方式就可以自行開發Log的相關做法,如與SMS作整合,不過其實透過NLog.config的設定可以做到如儲存紀錄到SQL Server(及其他資料庫)、寄信,

大家可以參考【mrkt的程式學習筆記:http://kevintsengtw.blogspot.tw/p/blog-page_12.html#.Ul1fyVDQmV9】去設定。

 

接下來的紀錄是Elmah 小心得~

 

參考資料:

How to write a traget : https://github.com/nlog/NLog/wiki/How%20to%20write%20a%20Target

整合NLog到Elmah : http://bibby.be/2012/08/nlog-elamh.html

系統記錄與效能監測(mrkt的程式學習筆記) : http://kevintsengtw.blogspot.tw/p/blog-page_12.html#.Ul1fyVDQmV9

TWMVC研討會的影片:https://www.youtube.com/watch?v=dmp3n7Z4axc