March 30, 2013

Logging framework - NLog安裝與設定

公司目前使用的logging framework主要是Enterprise Library的Logging Application Block,前陣子在系統某個獨立的模組中使用了log4net感覺還不差,最近一個新專案則改用NLog試試,以下是安裝方式及設定技巧。

在Package Manager Console中輸入Install-Package NLog,這個指令會將NLog安裝到專案中,安裝完後基本上就可以開始使用NLog了。不過要注意的是使用這指令僅會安裝NLog的DLL檔,並不會有任何文件設定檔(*.config等)。即便如此,我們已經可以開始使用NLog,只是必須透過其所提供的Configuration API設定,即所有的設定皆寫在程式碼中。通常我們還是會以文件設定檔的方式來做設定比較有彈性,畢竟production環境和測試用環境的設定並不一定相同,例如在測試環境中你會想記錄debug資訊,而在production中可能會先記錄warn層級以上的資訊(warn/error/fatal),必要時再修改成debug層級以便追蹤問題。

透過Install-Package NLog.Config指令,我們可以安裝NLog的設定檔(nuget會先檢查NLog的DLL檔是否已經安裝,若沒有的話也會一併安裝)。安裝的過程中可能會出現錯誤訊息,可以先忽略它。錯誤的原因推測可能是我沒有安裝PowerShell的關係,從錯誤訊息看起來似乎是想將NLog.config的Copy to Output Directory屬性改成Copy if newer及Build Action屬性改成Content。這部份我們可以手動來修改,所以問題不大。


完裝完成後在專案中可看到NLog.configNLog.xsd兩個檔案。NLog.config即是NLog的設定檔,NLog.xsd則是NLog.config的結構描述檔。有了NLog.xsd,在Visual Studio中就可以透過Intellisense的支援設定NLog.config,相當方便,這也是log4net所沒有支援的(雖然有熱心網友提供,但畢竟不是官方出品)。
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <!--
  See http://nlog-project.org/wiki/Configuration_file
  for information on customizing logging rules and outputs.
   -->

  <targets>
    <!-- add your targets here --> 

    <!--
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
  </targets>

  <rules>
    <!-- add your logging rules here -->  

    <!--
    <logger name="*" minlevel="Trace" writeTo="f" />
    -->
  </rules>
</nlog>

上面是NLog.config的預設樣板,整個設定檔的設定方式基本上圍繞在targets和rules兩個元素。targets代表你想要輸出log成什麼型態的資料和資料格式的配置(layout),例如文字檔或事件紀錄(event log);rules代表你想針對哪些log層級(debug/warn/error/fatal等)做設定及寫到哪個target。要注意的是預設樣板將target和logger註解起來,若要使用請記得將註解移除。

以預設樣版來說明,在targets元素中宣告了一個名稱為f的target元素,用於將log寫到文字檔中(xsi:type="File"),log會寫到fileName屬性的路徑中,而log的內容會使用layout屬性裡的格式。而在rules元素中則宣告了一個logger元素,最小層級為Trace,表示只要是Trace以上的層級都會被記錄,而writeTo則表示要將log寫到名為f的target。有用過log4net的朋友應該會覺得這其實和log4net的appender及logger概念類似。

在fileName及layout屬性中可以看到如${basedir}或${longdate}這樣的參數,這是NLog所提供的內建樣板參數,稱之為Layout Renders。當然這些內建參數有可能無法達到你的需求,這時可以透過Event Context Layout Renderer來自訂參數。

拿掉預設樣板的註解並執行底下測試程式
using NLog;

namespace NLogTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Logger logger = LogManager.GetCurrentClassLogger();
            logger.Debug("this is a Debug level");
            logger.Trace("this is a Trace level");
            logger.Warn("this is a Warn level");
            logger.Error("this is a Error level");
        }
    }
}

接下來可以在bin/Debug/logs下看到*.log檔案,內容為

2013-03-30 19:06:15.9555 DEBUG this is a Debug level
2013-03-30 19:06:16.0688 TRACE this is a Trace level
2013-03-30 19:06:16.0688 WARN this is a Warn level
2013-03-30 19:06:16.0688 ERROR this is a Error level

接下來我們將設定檔logger元素中的minLevel屬性改成Debug後重新執行程式,輸出的內容會再加上

2013-03-30 19:08:05.3901 DEBUG this is a Debug level
2013-03-30 19:08:05.3901 WARN this is a Warn level
2013-03-30 19:08:05.3901 ERROR this is a Error level

可以發現Trace的部份不見了,原因是在NLog中,Trace層級比Debug層級還低,所以minLevel改為Debug後只會記錄Debug層級以上的資料。透過這樣的設定方式,我們可以在production環境中設為Warn層級,當需要追蹤更細部的問題時改為Trace或Debug層級,完全不需要重新佈署程式。不過要特別注意的是,如果要讓NLog在更改設定檔後重新自動載入新設定則需要在nlog元素中加上autoReload屬性並設定為true

參考

March 27, 2013

Outlook 2010中批量刪除RSS訂閱及資料夾

前陣子Google宣佈七月開始將中止Google Reader服務,當時因為還沒研究其它網路上推薦的RSS reader,所以就先暫時把RSS全都先匯入到Outlook 2010裡做備份。現在已經把RSS全都移到feedly了,試著把Outlook裡的訂閱全都刪除,卻發現樹狀選單裡只允許我一個一個刪除訂閱(Delete Folder),無法讓我一次刪除全部訂閱,有點不方便。



當然我們還是可以批量刪除訂閱,只是這功能是在別的地方,在File-> Info-> Account Settings-> RSS Feeds



進入RSS Feeds畫面後,如果要一次刪除所有訂閱,可先點選第一筆訂閱,把scroll bar拉到最下方,按下SHIFT鍵並點選最後一筆訂閱即完成全選所有訂閱,此時再點選Remove按鈕就會刪除所有的訂閱。如果只是一次刪除多筆訂閱,可按下CTRL鍵,點選多筆欲刪除的訂閱後再點選Remove按鈕。

操作完後會發現訂閱是被移除了,但回到Outlook的樹狀選單,之前訂閱RSS所建立的資料夾還是存在,這時我們需要借助一套在Codeplex上的免費工具MFCMAPI來幫我們移除資料夾。MFCMAPI有32及64位元兩種版本,我是使用64位元來做示範。下載後執行可以看到以下畫面


進入Session-> Logon,然後按OK



在紅色框線中點兩下滑鼠


展開左邊樹狀選單進入Root - Mailbox-> IPM_SUBTREE,此時可以看到RSS摘要選項。右鍵RSS摘要進入Advanced-> Empty items and subfolders from folder...後按下OK



最後關掉Outlook並重新開啟後就會看到RSS摘要下的訂閱資料夾都被刪除了。整個過程有點小麻煩,如果資料夾只有幾個,可能手動刪除還來得快。

參考

March 15, 2013

Hyper-V於系統開機自動啟動VM的設定方式

每次Server重開機時,VM都要一個個的重新開啟相當麻煩,Hyper-V其實有提供讓系統開機時可以自動啟動VM的選項。方法如下

右鍵點選欲自動啟動的VM後,進入Settings


點選Automatic Start Action


選取"Always start this virtual machine automatically"後按OK即完成設定。

CSRF的唸法

約莫兩年前英籍架構師還在公司服務時,請我研究了一下CSRF,當時幫公司產品加了防止CSRF功能進去,也記錄了一些參考資料在另一篇文章Cross Site Request Forgery (CSRF) 相關資源與參考。當時覺得CSRF唸起來真是饒舌啊,每次跟英籍架構師講CSRF時他也會故意說OK, I know CSI, CSI, CSI。前陣子在讀Professional ASP.NET MVC 4時在Chapter 7的Threat: Cross-Site Request Forgery單元看到了CSRF的唸法,以下節錄至該書內容
A cross-site request forgery (CSRF, pronounced C-surf, also known by the acronym XSRF) attack can be quite a bit more potent than simple XSS, discussed earlier.

有看到的朋友請別再唸C、S、R、F這饒舌的唸法,直接說C-surf吧。

March 14, 2013

NOTE: Failed to notify ''XXX'' via email

設定完log shipping後,嘗試到SQL Server Agent的restore job設定其Notifications,希望在每五分鐘交易restore成功時寄送通知到我的信箱


過了半小時候檢查發現並沒有收到通知,查看了一下log發現restore雖然成功,但log上卻顯示了NOTE: Failed to notify ''Pete.Chen'' via email訊息,Pete.Chen是我設定在Operators裡的其中一位operator名稱


本以為是Database Mail設定有誤,但使用Database Mail的Send Test E-mail功能卻可正常寄出信件。最後發現要到SQL Server Agent屬性的Alert System頁面裡啟用Database Email功能


啟用完後最重要的一點就是要重新啟動SQL Server Agent,否則仍然收不到通知

參考

March 13, 2013

CCTray無法開啟的解決方式

菲律賓同事跟我反應在CCTray上更新了Build Projects後,CCTray就再也開不起來了。原本在system tray裡雙擊點選CCTray可以出現設定視窗,現在卻完全沒有反應。嘗試了以下方式都無法解決問題。

  1. 關閉防火牆。由於與菲律賓同事的網路環境是在VPN之下,懷疑是否是防火牆擋掉了,但防火牆關掉後並未解決問題。
  2. 重新安裝CCTray。重新安裝CCTray後再更新Build Projects,但更新完後CCTray仍無法開啟
  3. 重新安裝CCTray後監控方式改用'Via the CruiseControl.NET dashboard'更新Build Projects。由於原本是用.NET Remoting方式監控CruiseControl.NET,一度懷疑是.NET Remoting出了問題,但改用dashboard方式監控仍無法解決問題
最後在Google Groups找到一個可行的方式,就是將CCTray的設定檔cctray-settings.xml刪除後重新安裝CCTray並更新Build Projects。我的CCTray安裝路徑是在C:\Program Files (x86)\CCTray,不過底下居然沒有這個設定檔。用Everything搜尋一下發現設定檔是儲存在另一個路徑C:\Users\Pete\AppData\Roaming\cctray-settings.xml(Pete是我的登入帳號名稱),這部份要稍微注意一下。

March 10, 2013

與Jenkins共舞 - 安裝MSBuild Plugin

筆者的工作環境主要是以.NET為開發平台,開發工具為Visual Studio。Visual Studio在建置專案時骨子裡其實就是使用MSBuild。在Jenkins可以順利建置Visual Studio專案前,我們必須先安裝MSBuild Plugin。欲安裝MSBuild Plugin可透過管理介面首頁-> Manage Jenkins-> Manage Plugins-> Available找到MSBuild Plugin。



安裝完後重新啟動Jenkins即可在管理介面看到MSBuild的設定區塊



按下Add MSBuild可加入單一或多個MSBuild設定



 以下說明筆者在設定上有使用到的屬性。

  • Name: 設定名稱。例如可以取名為.NET 4.0 Release,用以表示這個MSBuild設定用來建置.NET 4.0 Rlease模式的專案
  • Path to MSBuild: MSBuild的路徑。例如.NET 4.0的MSBuild路徑為C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
  • Default parameters: 預設的MSBuild參數。例如/p:Configuration=Release表示要以Release模式來建置專案。



設定完後按下Save即可儲存設定,相當簡單。

參考
  1. MSBuild Command-Line Reference
  2. Common MSBuild Project Properties