2012年12月31日 星期一

NLog RichTextBox Target

NLog RichTextBox Target

將Log訊息寫到RichTextBox控制項
如果有現成的就指定控制項名稱,但需注意要在表單建立之後再取得Logger
例如在表單建構式之後,或是在Form_Load事件之後
不然還是會獨立建出一個RichTextBox出來

static Logger log;

private void Form1_Load(object sender, EventArgs e)
{
    // 需在Form_Load才取得Logger
    log = LogManager.GetCurrentClassLogger();
}

屬性

完整資料請參考官網的RichTextBox Target文件
  • name - Target的名稱
  • layout - 輸出的格式
  • autoScroll - 是否自動捲動最下方
  • maxLines - 最大行數,超過會往上移動,移除最上方記錄
  • controlName - 控制項名稱
  • formName - 表單名稱
  • useDefaultRowColoringRules - Log文字是否使用預設的顏色
非同步,自動捲動,最大20行,使用預設色系的設定檔
<?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 async="true">
        <target xsi:type="RichTextBox" name="f" 
                autoScroll="true"
                maxLines="20" 
                formName="Form1" 
                controlName="richTextBox1"
                useDefaultRowColoringRules="true"
                layout="${longdate} ${uppercase:${level}} ${message}"  />
    </targets>
    <rules>
        <logger name="*" minlevel="Trace" writeTo="f" />
    </rules>
</nlog>

NLog Debugger Target

NLog Debugger Target

將Log輸出到Vistual Studio的輸出視窗,Web應用程式的開發很有幫助

屬性

基本上和其他Target一樣,沒有特別需要介紹的屬性
完整資料還是參考官網的Debugger Target文件

  • name - Target的名稱
  • header - 頭部格式
  • layout - 輸出格式
  • footer - 尾部格式
屬性很簡單,設定檔也簡單
<?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>
        <target xsi:type="Debugger" name="f"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    </targets>
    <rules>
        <logger name="*" minlevel="Trace" writeTo="f" />
    </rules>
</nlog>


NLog Mail Target

NLog Mail Target

透過郵件把Log寄出,例如Error和Fatal等級的Log可以考慮直接寄出給管理員

屬性

完整的資料請參考官網Mail Target文件


  • html - 是否為HTML格式的郵件,預設為false
  • encoding - 郵件編碼,預設為UTF8
  • subject - 郵件主題
  • to - 收件者
  • bcc - 密件副本
  • cc - 副本
  • from - 寄件者
  • body - 郵件內容,預設為${message}
  • smtpUserName - 郵件主機寄信帳號
  • enableSsl - 是否啟用SSL通訊協定
  • smtpPassword - 郵件主密寄信密碼
  • smtpAuthentication - 郵件主機驗證模組,Basci、None、Ntml,預設為None
  • smtpServer -  郵件主機位址
  • smtpPort - 郵件主機埠號,預設為25

一個簡單的範例,發生Error層級以上的Log,就寄信給管理員
<?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>
        <target xsi:type="Mail" name="MailAlarm" 
                smtpServer="郵件主機位置"
                smtpPort="25"
                subject="${machineName}於${longdate}發生問題"
                from="寄信人Mail"
                to="收信人Mail"
                body="${longdate} ${uppercase:${level}} ${message}" />
    </targets>
    <rules>
        <logger name="*" minlevel="Error" writeTo="MailAlarm" />
    </rules>
</nlog>

NLog File Target

NLog File Target

輸出到檔案是預設的設定,可以是一個或是多個檔案

參數

File Target可以使用的參數很多,除了特殊需求之外,大部份採用預設值就行了
詳細說明請參考官網File Target文件

以下為常用的參數

  • name - target的名稱
  • layout - 輸出格式,預設為${longdate}|${level:uppercase=true}|${logger}|${message}
  • header - 頭部格式
  • footer - 尾部格式
  • encoding - 檔案編碼,如果有中文字的話,可以指定成utf-8
  • fileName - 檔案名稱,配合Layout Renderers組合檔名

常用範例

非同步,每小時寫檔,UTF8格式
<?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>
        <target xsi:type="AsyncWrapper" name="f" queueLimit="5000" overflowAction="Discard">
            <target xsi:type="File" fileName="${basedir}/logs/${date:format=yyyy-MM-dd-HH}.log"
                layout="${longdate} ${uppercase:${level}} ${message}" encoding="utf-8" />
        </target>
    </targets>
    <rules>
        <logger name="*" minlevel="Trace" writeTo="f" />
    </rules>
</nlog>

CSV格式
<?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>
        <target xsi:type="AsyncWrapper" name="f" queueLimit="5000" overflowAction="Discard">
            <target xsi:type="File" fileName="${basedir}/logs/${date:format=yyyy-MM-dd-HH}.log"
                layout="${longdate} ${uppercase:${level}} ${message}" encoding="utf-8" />
        </target>
    </targets>
    <rules>
        <logger name="*" minlevel="Trace" writeTo="f" />
    </rules>
</nlog>

2012年12月30日 星期日

NLog API

LogManager

LogManager是用來建立日誌和管理設定檔用的類別,有以下幾個Method

  • LogManager.GetLogger - 取得或建立指定的logger
    建議建立Logger的方式,需要手動指定名稱
  • LogManager.GetCurrentClassLogger  - 取得或建立目前類別名稱的logger
    雖然比較方便,但底層是以StackTrace取得名稱,成本高很多
  • LogManager.Configuration - 取得或設定目前日誌的設定資訊
  • LogManaget.GlobalThreshold - 取得或設定全域日誌的threshold


Logger

NLog.Logger類別是用來輸出Log用的,有以下幾個Method用來輸出不同層級的Log
每個Method都有多個overloads用來最小化內存配置以提高日誌速度
  • Log() - 使用指定的格式和參數,將訊息寫入指定的級別
  • Trace() - 使用指定的格式和參數,將訊息寫入Trace級別
  • Debug() - 使用指定的格式和參數,將訊息寫入Debug級別
  • Info() - 使用指定的格式和參數,將訊息寫入Info級別
  • Warn() - 使用指定的格式和參數,將訊息寫入Warn級別
  • Erro() - 使用指定的格式和參數,將訊息寫入Error級別
  • Fatal() - 使用指定的格式和參數,將訊息寫入Fatal級別
以下的方法和屬性用來檢查該層級的日誌是否啟用

  • IsEnabled() - 確定指定的級別日誌是否啟用
  • IsTraceEnabled - 確定Trace級別日誌是否啟用
  • IsDebugEnabled - 確定Debug級別日誌是否啟用
  • IsInfoEnabled - 確定Info級別日誌是否啟用
  • IsWarnEnabled - 確定Warn級別日誌是否啟用
  • IsErrorEnabled - 確定Error級別日誌是否啟用
  • IsFatalEnabled - 確定Fatal級別日誌是否啟用
除此之外,NLog還提供了一組方法來記錄Exception
通過配置Layout Renderer的${exception},可以取得很詳細的訊息
  • LogException() - 使用指定的格式和參數,將訊息和例外寫入指定的級別
  • TraceException() - 使用指定的格式和參數,將訊息和例外寫入Trace級別
  • DebugException() - 使用指定的格式和參數,將訊息和例外寫入Debug級別
  • InfoException() - 使用指定的格式和參數,將訊息和例外寫入Info級別
  • WarnException() - 使用指定的格式和參數,將訊息和例外寫曾Warn級別
  • ErrorException() - 使用指定的格式和參數,將訊息和例外寫曾Error級別
  • FatalException() - 使用指定的格式和參數,將訊息和例外寫曾Fatal級別

${exception}的詳細設定方式,請參考官網文件
  • format - 用逗號分隔的例外屬性例表,不區分大小寫
    Message, Type, ShortType, ToString, Method, StackTrace
  • innerFormat - 用逗號分隔的例外屬性例表,不區分大小寫
    Message, Type, ShortType, ToString, Method, StackTrace
  • maxInnerExceptionLevel - 內部錯誤的最大層數

${onexception} - 用來輸出內部例外

範例
StackTrace:${exception:format=stacktrace}
Exception Type:${exception:format=type}
Exception Message:${exception:format=message}
Inner Exception :${onexception:${exception:format=type,message,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method}}


Example

最基本的使用範例,取得Logger並輸出了一個字串訊息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NLog;

namespace NLogApp
{
    class Program
    {
        static readonly Logger log = LogManager.GetLogger("Program");

        static void Main(string[] args)
        {
            log.Debug("Debug Message...");
        }
    }
}

如果需要更多細部控制,可以實例化一個LogEvent來調整屬性,再傳給logger輸出
using System;
using System.Globalization;
using NLog;

class MyClass
{
    static Logger logger = LogManager.GetLogger("MyClass");

    public void LogSomething()
    {
        LogEventInfo myEvent = new LogEventInfo(LogLevel.Debug, "", "My debug message");
        myEvent.LoggerName = logger.Name;
        myEvent.Properties.Add("MyCustomValue", "This is from MyClass");

        logger.Log(myEvent);
    }
}

NLog 學習筆記

一套好用的Logging工具在開發和日後維護上很有幫助,之前一直用的是log4net,雖然功能強大,但層級式的設定檔比較複雜不容易掌握,而且相關的中文資源也不是很多

後來找到NLog這個套件,Google一下很快就上手了,而且也有不少詳細的中文資料,擴充功能也很簡單,在此記錄一下學習筆記和參考資料

NLog學習筆記

1. NLog 初體驗
    NLog的安裝、設定、和使用

2. NLog Config
    NLog的設定檔作用和內容

3. NLog Targets
    Nlog的輸出目標

4. NLog Rules
    NLog的輸出的路由規則

5. NLog Layout
    NLog的輸出格式

6. 好用的Log Viewer

7. Common.Logging

8. 個人常用Log格式

9. NLog Database Target

10. ELMAH

11. NLog.Elmah

參考資料

 mrkt 的程式學習筆記 - 系統記錄與效能監測

Dflying Chen @ cnblogs - NLog系列

NLog Layouts

NLog Layouts

Layout是用來決定記錄的訊息輸出的格式,通常設定在target的屬性中
這個功能可以讓我們動態增減日誌的內容,而不用回頭修改程式碼和重新編譯
使用方法是$字號和左右大括號,包住Layout Renderers
參數的使用方法則是冒號分隔,屬性=值的方式
預設的輸出格式如下

${longdate}|${level:uppercase=true}|${logger}|${message}


Layout Renderers


  • ${basedir} - 應用程式所在的資料庫
  • ${callsite} - 日誌來源的類別名稱、方法名稱和來源資訊
  • ${data} - 目前日期和時間
  • ${exception} - 例外的訊息
  • ${level} - 日誌的級別
  • ${logger} - 日誌的來源
  • ${logdate} - 長日期格式,yyyy-MM-dd HH:mm:ss.mmm
  • ${machinename} - 電腦名稱
  • ${message} - 日誌的內容
  • ${newline} - 換行符號
  • ${shortdate} - 短日期格式  yyyy-MM-dd
  • ${stacktrace} - 呼叫堆疊資訊
  • ${time} - 時間格式,HH:mm:ss.mmm.
  • ${windows-identity} - 登入帳號
每一個Layout Renderers還包含各自的屬性,詳細的內容可以參考官網Layout Renderers文件


Pre-Defined Layouts

NLog還包含了幾個預設定義好的格式,詳細的文件請參考官網的Layout文件
  • CsvLayout - CSV格式
  • LayoutWithHeaderAndFooter - 加上Header和Footer的格式
  • Log4JXmlEventLayout - Log4j相容的格式
  • SimpleLayout - 簡單的文字內容格式


上一篇 : NLog Rules


NLog Rules

NLog Rules

NLog使用一個簡單的路由表檢查
當檢查到符合的日誌名稱和級別時,會輸出到指定的一個或多個Target去
如果指定了final屬性,之後的規則就不再檢查
Rules可以使用的屬性如下

  1. name - 日誌來源的名稱(允許使用通配符號*)
  2. minlevel - 設定符合該規則的最低級別
  3. maxlevel - 設定符合該規則的最高級別
  4. level - 設定符合該規則的特定級別
  5. levels - 設定符合該規則的級別列表,用逗號分隔
  6. writeTo - 設定符合該規則的日誌要寫入的target列表,用逗號分隔
  7. final - 設定符合該規則的條件為最後一個規則,後面的規則不再檢查
以下為一些例子
<!-- 命名空間Name.Space下的Class1這個類別的日誌,符合Debug以上的級別,就輸出到f1這個Target -->
<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />

<!-- 命名空間Name.Space下的Class1這個類別的日誌,符合Debug和Error這兩個級別,就輸出到f1這個Target -->
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />

<!-- 命名空間Name.Space下的所有類別的日誌,就輸出到f3和f4這兩個Target -->
<logger name="Name.Space.*" writeTo="f3,f4" />

<!-- 
    命名空間Name.Space下的所有類別的日誌,級別在Debug和Error之間
    也就是說級別為Debug, Info, Warn, Error,不輸出日誌,因為這條規則沒有指定writeTo
    同時不再檢查之後的規則,因為這裡設定final=true
-->
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />


NLog Level

NLog的日誌級別分為六個等級,方便我們對於不同情境制訂出合適的級別輸出

  1. Trace - 大量而詳細的訊息,一般只用在開發環境
  2. Debug - 用來除錯用的詳細訊息,比Trace用的少一點,一般也只用在開發環境
  3. Info - 用來提示用的訊息,例如使用者登出入,交易參數資料
  4. Warn - 用來警告用的訊息,例如執行時間超出預期,連線數接近上限
  5. Error - 一般錯誤的訊息,一般就是try catch到的Exception
  6. Fatal - 致命錯誤的訊息,通常會造成應用程式無法執行
最簡單的設定檔配置,只要設定Rule和要寫入的Target就行了

上一篇: NLog Targets
下一篇: NLog Layouts 

NLog Targets

NLog Targets

target用來定義Log的輸出目標,基本的兩個屬性為

  • name - 目標的名稱,用來給rule路由指定的名稱
  • type - 目標的類型,NLog支援的類型很多,完整資料請參考官網Supported Targets文件
每一個target元素代表一個輸出目標,只要name屬性值不衝突即可
<targets>
    <target name="f1" xsi:type="File" fileName="file1.txt"/>
    <target name="f2" xsi:type="File" fileName="file2.txt"/>
    <target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>
    <target name="ds" xsi:type="OutputDebugString"/>
</targets>

依照type的不同,會有相對應的屬性,例如
File需要指定FileName檔名
Database需指定資料庫相關的參數和語法
Mail需指定郵件主機等資訊
每種類型的設定方式,之後再來詳細介紹

自訂target

要自行擴充target可以參考官網文件的How to write a target
只要繼承NLog的TargetWithLayout類別,覆寫Write(LogEventInfo logEvent)函式
再利用extensions元素或在程式碼中註冊就行了


Wrapper Targets

NLog提供幾個封裝和複合目標,用來增加target的功能
  • asynchronous processing (非同步功能,被封裝的target會由另一個執行緒來運行)
  • retry-on-error(自動重試功能)
  • buffering(緩衝處理,不會馬上寫出Log,而會依設定值累積一定數量才輸出Log)
  • filtering(過濾條件,會依設定值決定是否輸出Log)
更多詳細功能請參考官網的Wrapper Targets文件

Wrapper可以連續嵌套,以下的範例可以增加非同步和自動重試的功能
<targets>
    <!-- 增加非同步功能-->
    <target name="n" xsi:type="AsyncWrapper">
        <!-- 增加自動重試功能 -->
        <target xsi:type="RetryingWrapper">
            <target xsi:type="File" fileName="${file}.txt" />
        </target>
    </target>
</targets>

由於非同步處理是很常用來增加效能的功能,所以提供了一個更簡單的設定方式

<nlog>
    <targets async="true">
        <!-- 放在這個section之間的target都會有非同步功能 -->
    </targets>
</nlog>


Default wrappers

如果有多組target元素需要大腸包小腸的時後,多層的嵌套會比較複雜
所以提供了預設封裝的功能
使用default-wrapper元素設定,同一組的target就會有同樣的封裝功能
<nlog>
    <!-- 第一組Wrapper -->
    <targets>
        <default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>  
        <target name="f1" xsi:type="File" fileName="f1.txt"/>  
        <target name="f2" xsi:type="File" fileName="f2.txt"/>  
    </targets>
    <!-- 第二組Wrapper -->
    <targets>  
        <default-wrapper xsi:type="AsyncWrapper">  
            <wrapper xsi:type="RetryingWrapper"/>  
        </default-wrapper>  
        <target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>  
        <target name="n2" xsi:type="Network" address="tcp://localhost:4002"/>  
        <target name="n3" xsi:type="Network" address="tcp://localhost:4003"/>  
    </targets> 
</nlog>


Default target parameters

類似的功能在參數設定上也有
同一組的target需要設定同樣的參數設定的話,也可以利用這個功能設定一次就好
<nlog>
    <targets>
        <!-- 多組target都有同樣的屬性keepFileOpen -->
        <target name="f1" xsi:type="File" fileName="f1.txt" keepFileOpen="false"/>
        <target name="f2" xsi:type="File" fileName="f2.txt" keepFileOpen="false"/>
        <target name="f3" xsi:type="File" fileName="f3.txt" keepFileOpen="false"/>
    </targets>
</nlog>
<!-- 替代的設定方式如下 -->
<nlog>
    <targets>
        <!-- 利用default-target-parameters來設定一次就好 -->
        <default-target-parameters xsi:type="File" keepFileOpen="false"/>
        <target name="f1" xsi:type="File" fileName="f1.txt"/>
        <target name="f2" xsi:type="File" fileName="f2.txt"/>
        <target name="f3" xsi:type="File" fileName="f3.txt"/>
    </targets>
</nlog>


上一篇 : NLog Config
下一篇 : NLog Rules

2012年12月29日 星期六

NLog Config

NLog設定檔位置

NLog的設定檔有幾個位置,參考官網文件如下
  1. 應用程式的標準設定檔(app.config或是web.config)
    執行過程中如果需要修改NLog的配置,會造成應用程式重新啟動
  2. 應用程式所在目錄的app.exe.nlog
    每個專案都要手動指定檔名比較麻煩點
  3. 應用程式所在目錄的NLog.config
    建議使用的設定檔方式
  4. Nlog.dll所在目錄的NLog.dll.config
    和第三種方式差不多,還是選擇比較常見的第三種方式吧
  5. 環境變數NLOG_GLOBAL_CONFIG_FILE指定的檔案
    設在這種神秘的地方,應該會被扁吧
在ASP.NET或是Windows Form應用程式中有點差異,其他的專案類型有幾種方式不能用,所以建議使用最通用的第三種方式

NLog設定檔元素

Nlog的設定檔有以下五種元素,前兩種是必要項目,後三種是可選項目
  1. targets - 定義Log的輸出目標,輸出格式的Layout也在這裡設定
  2. rules - 定義Log的路由規則,Log的過濾條件也在這裡設定
  3. extensions - 定義擴充元件,包含NLog擴充模組和自定義的擴充模組
  4. include - 引用外部設定檔,簡化設定檔的複雜度和重覆利用
  5. variable - 定義設定檔中自行設定的變數,可以統一和簡化設定檔資料

NLog設定檔自動重讀

NLog的設定檔,在執行過程中預設是不會重讀的,每個修改都需要重新啟動應用程式才能生效
如果要自動重讀的話,需要設定一個屬性autoReload="true"才能生效

<nlog autoreload="true">
   ...
</nlog>

NLog設定檔疑難排解

有時後就算設好了設定檔,Log還是沒有寫出來,最常見的原因是權限問題造成的問題
例如ASP.NET的w3wp.exe沒有指定資料夾寫檔案的權限
這時後可以利用NLog內部的Log來查詢原因
  1. throwExceptions - 設定是否要引發錯誤
    NLog會吃掉所有內部引發的錯誤,要找問題時可以設為true,找到之後應該設回false
  2. internalLogFile - 設定內部錯誤要輸出的文件位置
    直接給一個檔名就好,會輸出在執行檔所在目錄下面
  3. internalLogLevel - 設定內部錯誤要輸出的層級
    基本上要找的是Error訊息比較簡潔點,不設定的話會輸出所有詳細訊息
  4. internalLogToConsole - 設定內部錯誤是否要輸出到Console視窗
    如果不想寫檔,又有Console可以用的話,那就設定為true吧
  5. internalLogToConsoleError - 設定內部錯誤是否要輸出到stderr串流
    為了不要和應用程式正常訊息混在一起,可以把錯誤訊息重導向到stderr

上一篇 : NLog 初體驗
下一篇 : NLog Targets

NLog 初體驗

先簡單介紹一下如何安裝NLog這個套件,和使用預設的設定檔來寫出Log
首先讓環境簡單點,所以開一個主控台專案來當範例

接下來引用NLog最簡單的方式當然就是用NuGet安裝了
如果對NuGet不熟的話,可以參考之前的NuGet學習筆記
NLog這個套件是NLog.dll元件本身
NLog.Config這個套件是NLog.config和NLog.xsd(用來幫助在設定檔中的IntelliSense)

安裝好後,專案中就會多了這三個東西


打開設定檔,把註解拿掉,先使用預設值來體驗一下
詳細的設定方式,之後再介紹

<?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的方式也很簡單,直接用LogManager來引用就行了
寫Log的方式也很直覺,總共有六個層級,都寫一個試試看

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NLog;

namespace NLogApp
{
    class Program
    {
        // 引用NLog
        static Logger log = LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            // 每個層級都寫一個試試看
            log.Trace("trace");
            log.Debug("debug");
            log.Info("info");
            log.Warn("warn");
            log.Error("error");
            log.Fatal("fatal");
        }
    }
}

這裡需要注意一下,如果是App專案的話,NLog.config這個檔案的屬性
複製到輸出目錄要確定是在永遠複製這個選項
這樣Run的時後執行檔和設定檔在同一個目錄才會有作用

編譯成功就執行一下,如果沒有權限問題的話,在執行檔下面就會寫出一個log檔
也會看到NLog.config複製到這裡
記得要按一下方案總管中的顯示所有檔案,才會看到不在專案中的檔案喔

打開log檔,裡面就是剛寫的那六個層級的log,使用上就是這麼簡單

下一篇:NLog Config

2012年12月25日 星期二

VS2012 Remote Debug 遠端偵錯

VS2012的遠端偵錯變的簡單多了,不再需要驗證身份就可以使用,但相對的作業系統需要更新到Server2008R2以上

首先下載Remote Tools for Visual Studio 2012

在伺服器上面安裝遠端偵錯工具

在Server上安裝好遠端偵錯工具後,打開遠端偵錯工具

設定成非驗證模式,允許任何使用者執行偵錯,和延長閒置時間

打開VS2012,附加執行緒,選擇遠端(非驗證),輸入IP和Port號,找到執行檔附加即可


2012年12月24日 星期一

StyleCop 整合SVN

安裝SVNStyleCop

1. 首先下載SVNStyleCop安裝檔
2. 解壓縮後編輯SVNStyleCop.exe.config
3. 設定SVNSettings.StyleCop裡面要檢查的規則
4. 修改SVNStyleCop.exe.config裡面的路徑範本
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="svnStyleCopConfig" type="SVNStyleCop.SvnStyleCopConfigSection, SVNStyleCop" allowDefinition="Everywhere" allowExeDefinition="MachineToApplication" restartOnExternalChanges="true" />
    </configSections>

    <svnStyleCopConfig tempFolder="Temp">
        <!-- 設定svnlook.exe執行檔位置 -->
        <svnLook location="C:\Program Files\VisualSVN Server\bin\svnlook.exe" />
        <styleCop settingsFile="SVNSettings.StyleCop" maxViolationCount="20" />

        <!-- 設定專案路徑範本 -->
        <pathPatterns>
            <clear />
            <add value="^trunk/.*\.cs$"/>
   <add value="^branches/.*\.cs$"/>
   <add value="^tags/.*\.cs$"/>
        </pathPatterns>
    </svnStyleCopConfig>

</configuration>

設定

1. 編輯壓縮檔下面的pre-commit.cmd,修改前兩行svnlook.exe和SVNStyleCop.exe的路徑
2. 把批次檔的內容複製到SVN Repos的pre-commit hook


參考資料

SVNStyleCop官網

StyleCop 整合專案設定

首先卸載專案

如果要讓沒通過規則的警告變成錯誤,可以在專案中加入StyleCopTreatErrorsAsWarnings這個屬性
<PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <ProjectGuid>{6F76C2E4-57EF-4A46-9A41-E7A9653F5EF9}</ProjectGuid>
        <OutputType>Exe</OutputType>
        <AppDesignerFolder>Properties</AppDesignerFolder>
        <RootNamespace>DemoApp</RootNamespace>
        <AssemblyName>DemoApp</AssemblyName>
        <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
        <FileAlignment>512</FileAlignment>
        <StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings>
</PropertyGroup>

如果要編譯的時後,也做規則驗證,可以在最下面加入一個StyleCop.targets
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(ProgramFiles)\MSBuild\StyleCop\v4.7\StyleCop.targets" />


參考資料

http://blogs.msdn.com/b/sourceanalysis/archive/2008/05/24/source-analysis-msbuild-integration.aspx

StyleCop 程式碼風格和常見警告訊息

每個檔案的最上面,都加一個檔頭
    // <copyright company="CompanyName" file="NameOfFile.cs">
    //     Company copyright tag.
    // </copyright>

XML註解
    建構式以Initializes a new instance of the xxx class開頭
    解構式以Finalizes an instance of the xxx class開頭
    屬性以Gets or sets開頭
    註解文字最少兩個字以上,並用空格分隔
    註解文字斷行要用para分隔
   
程式碼撰寫順序
    程式碼撰寫順序: public -&gt; internal -&gt; protected internal -&gt; protected -&gt; private
    程式碼元素撰寫順序: Fields -&gt; Constructor -&gt; Event-&gt; Property -&gt; Method

大小寫規則
    Camel Case:私有的內部變數、成員變數、參數
    Pascal Case:公開的屬性、方法、事件...
   
其他
    using 放到namespace下面
    需使用明確的存取修飾詞
    程式碼中多餘的空白行
    變數不用使用底線

常見錯誤
    SA1633 : CSharp.Documentation : The file has no header, the header Xml is invalid, or the header is not located at the top of the file.
    在第一行加入檔頭資訊
   
    SA1200 : CSharp.Ordering : All using directives must be placed inside of the namespace.
    Using 放到namespace區段下面

    SA1027 : CSharp.Spacing : Tabs are not allowed. Use spaces instead.
    工具-&gt;選項-&gt;文字編輯器-&gt;所有語言-&gt;定位點-&gt;插入空格

    SA1400 : CSharp.Maintainability : The class must have an access modifier.
    加入明確存取修飾詞

    SA1600 : CSharp.Documentation : The class must have a documentation header.
    加入XML Document註解

StyleCop 程式碼風格和一致性規則檢查工具

StyleCop是C# 程式碼風格和一致性規則檢查工具,針對原始碼來做檢查,目前已經Open Source,網址為http://stylecop.codeplex.com

首先下載msi格式的安裝檔

下載回來後一直按下一步就行了

等幾分鐘才能跑完

打開專案,在專案上面按右鍵,選單中就會出現StyleCop相關的功能,先選擇Run StyleCop

工作清單就會出現一堆不符合的警告
在警告訊息上面點兩下,就會跳到引發警告的程式碼位置

如果要了解引發警告的原因,可以在訊息上面按右鍵,選擇顯示錯誤說明

就會跳出StyleCop的說明手冊

在專案上面按右鍵,可以選擇設定

顯示的設定介面

專案下就會出現一個StyleCo的檔案,裡面就是剛設定的值


2012年12月1日 星期六

continuous integration (CI) server:TeamCity 學習筆記

1. 安裝continuous integration (CI) server:TeamCity
http://blog.developer.idv.tw/2012/11/teamcity.html

2. TeamCity Migrate To SQL Server
http://blog.developer.idv.tw/2012/11/teamcity-migrate-to-sql-server.html

3. TeamCity 設定專案
http://blog.developer.idv.tw/2012/11/teamcity_13.html

4. TeamCity 建置前先還原NuGet套件
http://blog.developer.idv.tw/2012/11/teamcity-nuget.html

5. TeamCity 建置後打包和發佈套件
http://blog.developer.idv.tw/2012/11/teamcity_6277.html

6. TeamCity 改用網域帳號LDAP登入
http://blog.developer.idv.tw/2012/11/teamcity-ldap.html

7. TeamCity 安裝BuildAgent
http://blog.developer.idv.tw/2012/11/teamcity-buildagent.html

8. TeamCity刪除特定的Nuget Package
http://blog.developer.idv.tw/2013/10/teamcity-nuget-package.html

9. TeamCity整合FxCop報表
http://blog.developer.idv.tw/2014/04/teamcityfxcop.html

10. TeamCity整合Code Coverage報表
http://blog.developer.idv.tw/2014/04/teamcitycode-coverage.html

11. TeamCity整合Source Monitor報表
http://blog.developer.idv.tw/2014/04/teamcitysource-monitor.html

12. TeamCity 整合 StyleCop
http://blog.developer.idv.tw/2014/06/teamcity-stylecop.html

13. TeamCity 安裝 Octopus Deploy Integration 套件
http://blog.developer.idv.tw/2014/09/teamcity-octopus-deploy-integration.html

14. TeamCity 打包 Octopus 部署套件
http://blog.developer.idv.tw/2014/09/teamcity-octopack.html

15. TeamCity 發行 Octopus 部署套件
http://blog.developer.idv.tw/2014/09/teamcity-octopus.html

自動化佈署工具Octopus學習筆記

1. 安裝自動佈署工具Octopus
http://blog.developer.idv.tw/2012/11/octopus.html

2. 安裝Octopus Tentacle
http://blog.developer.idv.tw/2012/11/octopus-tentacle.html

3. Octopus打包網站專案
http://blog.developer.idv.tw/2012/11/octopus_5.html

4. Octopus部署專案
http://blog.developer.idv.tw/2012/11/octopus_3840.html

5. Octopus XML設定檔轉換和替代變數
http://blog.developer.idv.tw/2012/11/octopus-xml.html

6. NuGet 套件超過30MB的問題
http://blog.developer.idv.tw/2012/11/nuget-30mb.html

7. Windows平台的軟體套件管理:Chocolatey
http://blog.developer.idv.tw/2012/11/windowschocolatey.html

8. 利用OctoPack套件打包Web專案
http://blog.developer.idv.tw/2014/09/octopackweb.html

NuGet 學習筆記


1. 安裝NuGet套件管理工具
http://blog.developer.idv.tw/2012/10/nuget.html

2. 使用NuGet安裝、移除、更新套件
http://blog.developer.idv.tw/2012/10/nuget_12.html

3. 架設Nuget.Server
http://blog.developer.idv.tw/2012/10/nugetserver.html

4. 架設SymbolSource.Server
http://blog.developer.idv.tw/2012/10/symbolsourceserver.html

5. 建立NuGet套件
http://blog.developer.idv.tw/2012/10/nuget_21.html

6. NuGet編譯後自動發佈套件
http://blog.developer.idv.tw/2012/10/nuget_5451.html

7. NuGet的Cofing設定檔和Source Code轉換
http://blog.developer.idv.tw/2012/11/nugetcofingsource-code.html

8. NuGet Spec格式
http://blog.developer.idv.tw/2012/11/nuget-spec.html

9. Nuget 版本控制
http://blog.developer.idv.tw/2012/11/nuget.html
參考資料

10. NuGet Multiple Framework 建置
http://blog.developer.idv.tw/2013/12/nuget-multiple-framework.html

NuGetPro
NuGet Gallery
NuGet Doc

2012年11月29日 星期四

TeamCity 安裝BuildAgent

首先下載BuildAgent


把安裝程式傳送到目標電腦後,一直按下一步安裝就可以了

安裝好後,到BuildAgent下面的conf資料夾,找到buildAgent.properties設定檔

確認一下ServerURL是否正確,要注意用反斜線來表示的跳脫字元
順利連線之後,約1~2分鐘,最下面就會出現authorizationToken

登入TeamCity,也會看到未授權的記錄,把剛那組授權碼輸入就行了

等待一陣子,Connected就會有剛安裝的BuildAgent了

TeamCity 改用網域帳號LDAP登入

如果開發環境中有網域管理的話,可以把登入模式改LDAP模組登入

打開C:\ProgramData\JetBrains\TeamCity\config\main-config.xml

裡面的auth-type節點中,預設會是DefaultLoginModule

<login-module class="jetbrains.buildServer.serverSide.impl.auth.DefaultLoginModule" />

將模組改成LDAPLoginModule就行了

<login-module class="jetbrains.buildServer.serverSide.impl.auth.LDAPLoginModule" />

再來是設定LDAP的環境參數,在config資料夾中,有一個ldap-config.properties.dist的範本檔

複制成ldap-config.properties這個檔案,再用文字編輯器打開來修改,主要有以下幾個項目
把example換成自已的網域名稱

#設定AD的位置
java.naming.provider.url=ldap://dc.example.com:389/DC=example,DC=com

#設定登入的時後,帳號格式不用包含\或是@
teamcity.auth.loginFilter=[^/\\\\@]+

#配合上一個設定,和AD驗證的時後,送過去的帳號,前面自動補上網域名稱
teamcity.auth.formatDN=example\\$login$

設定這三個項目,其他改用預設值,就可以用網域驗證了
登入後如果要同步帳號資料,可以再多加以下幾個選項
java.naming.security.principal=<username>
java.naming.security.credentials=<password>
teamcity.users.username=sAMAccountName
teamcity.options.users.synchronize=true
teamcity.users.filter=(objectClass=user)
teamcity.users.property.displayName=displayName
teamcity.users.property.email=mail

第一次登入的時後,會需要設定帳號成管理員

如果有問題,可以查一下log
log位置在 C:\TeamCity\logs


參考資料




上一篇:TeamCity 建置後打包和發佈套件
下一篇:TeamCity 安裝BuildAgent

2012年11月13日 星期二

TeamCity 建置後打包和發佈套件

先溫習一下NuGet打包和發佈的方式


接下來按照打包的方式來作業,新增一個Build Step為NuGetPack
選擇NuGet執行檔的版本,再選擇專案檔的路徑
Version是建置時後的版本,最後是輸出的資料夾

因為增加了套件輸出的路徑,所以回到General Settings
在Artifact paths也增加套件輸出的路徑

設定完成後再次建置,建置成功就會在Artifacts得到套件

接下來再新增一個Build Step,選擇NuGetPublish
選擇NuGet執行檔的版本,輸入NuGet Server的網址和api key
再選擇要上傳的套件,下次建置的時後,就會一起發佈出去了

TeamCity 建置前先還原NuGet套件

當專案開始使用NuGet來管理套件時,預設套件會安裝在方案檔所在目錄的packages資料夾下


一般不會把這個套件這個資料夾加入原始檔控制以節省空間,而會在Vistual Studio中啟用套件還原
在方案檔上按右鍵就會看到這個選項了

按下後會有一個提示訊息,主要是會新增一個方案資料夾的提示

按下是(Y)之前,就會多出一個.nuget的方案資料夾

還要允許NuGet在建置期間下載遺漏的套件

把.nuget這個方案資料夾加入Source Control

先在TeamCity中安裝NuGet Command Line工具

新增一個Build Step,選擇NuGet Installer
選擇NuGet的版本,和輸入NuGet的來源
如果使用的套件是從NuGet官網來的,那直接保持空白
如果會使用其他來源的套件,就要在此輸入網址
再輸入方案檔的相對路徑就行了

再來要把NuGet Install這個動作,放到編譯之前
所以按一下Reorder build steps,然後用拖曳的方式調整步驟後按Apply

再次建置就成功了

TeamCity 設定專案

接下來開始設定專案,首先建立一個專案


輸入專案名稱和說明後,按下Create就行了


接下來要開始設定Build Configuration,免費版只能建20個


第一步是設定一個名稱,這裡以Release Build為例
Build number format是自動版號的格式,除了每次建置會自動加1之外
因為接下來的版本控制會以SVN為例,所以加入了SVN的版號%build.vcs.number%
Artifact Paths是最後產出檔案的路徑,先指向到Publish這個資料夾下面的zip檔



第二步是設定一個版本控制來取得原始碼


下拉選單中有大部份Source Control的類型,這邊以SVN為例子
主要就是輸入路徑和帳號密碼就行了


Labeling Rules這邊設定的是從trunk分支到tags的動作,等下還會有更詳細的設定
Test Connection可以測試一下是否可以連線,沒問題的話就按下Save按鈕


完成了一個VCS root的設定,順便編輯一下Checkout Rules
最簡單的用法就是每次只取出trunk的內容,並當成根目錄,就不會取出trunk和branches的資料了


接下來還有更詳細的設定
Clean all files before build是用來選擇是否在每次編譯之前都先清空svn的資料,重新下載
VCS Labeling mode是用來選擇,是否要在建置之後,來執行剛設定Labeling的動作


Build Step是用來設定建置方式,這邊選擇用方案檔的方式來建置專案
因為用到了Package這個target來封裝專案,所以需要選擇專案檔而不是方案檔
希望建置後封裝的檔案可以產出在前面設定Artifact Paths的路徑中,所以額外設了一個參數
如果一開始選擇用MSBuild來建置的話,參數的設定會更靈活



到這裡已經設定好專案了,如果日後需要修改設定,可以直接按右邊的某一個步驟來調整
先按一下右上角的Run來跑跑看目前的設定正不正確,再按一下Build Configuration Home來看結果


可以看到這個專案的編譯記錄,目前編譯的版本,和SVN的送交記錄等等訊息



編譯成功,也正確產出檔案的話,在Artifacts會有檔案下載的連結




參考資料:

Continuous Integration & Build Server – TeamCity (二) 設定專案

Continuous builds with TeamCity

上一篇:TeamCity Migrate To SQL Server
下一篇:TeamCity 建置前先還原NuGet套件