網站偵錯紀錄-NLog 如何做Target-撰寫DLL
接上一篇(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,如左圖。
3. Override Write這個Function,然後在內依照自己的方式去寫Log,這個Function特別事項如下:
3.1 Write其傳入參數[LogEventInfo]會帶入,在上層傳來的訊息。
3.2 LogEventInfo的StackTrace、Exception,會有沒有值,這部分在研究中,要如何秀出。
4. 在Nlog.config內有一行設定(如下行),其中的LogPathName是可以自行定義,然後本Class在寫一個公開的屬性就可以拿到設定的Value。
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檔,成功畫面如下,
測試碼
成功畫面
透過這種參考自製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