iT邦幫忙

DAY 25
3

進程。Processing系列 第 25

[進程。Processing] 25.日誌(Log)

James 趁著這一次的事件,告訴小艾該怎麼進行 Runtime Debug。
James 打開 Visual Studio 為小艾解釋著如何加入 log4net 來記錄 Runtime 的過程。

「首先先加入 log4net 的參考」James 從 Apache log4net 下載了最新版的 log4net DLL,並將他加入方案的參考當中。(圖1)

圖1:log4net Reference

「接下來,在 AssemblyInfo.VB 中加入這一行設定」

< Assembly: log4net.Config. XMLConfigurator (ConfigFile:="Web.config" , Watch:= True)>

AssemblyInfo.VB

Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices

' 組件的一般資訊是由下列的屬性集
' 控制。變更這些屬性值可修改與組件關聯的
' 資訊。

' 檢閱組件屬性的值
<Assembly: AssemblyTitle("ERP" )>
<Assembly: AssemblyDescription("" )>
<Assembly: AssemblyCompany("" )>
<Assembly: AssemblyProduct("ERP" )>
<Assembly: AssemblyCopyright("Copyright ©  2012" )>
<Assembly: AssemblyTrademark("" )>

<Assembly: ComVisible(False )>

'下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID
<Assembly: Guid("8f5824e4-c8d9-4605-8c69-4e320150bc76" )>

' 組件的版本資訊是由下列四項值構成:
'
'      主要版本
'      次要版本
'      組建編號
'      修訂編號
'
' 您可以指定所有的值,也可以依照以下的方式,使用 '*' 將組建和修訂編號
' 指定為預設值:
' <Assembly: AssemblyVersion("1.0.*")>

<Assembly: AssemblyVersion("1.0.0.0" )>
<Assembly: AssemblyFileVersion("1.0.0.0" )>
<Assembly: log4net.Config. XMLConfigurator(ConfigFile:="Web.config" , Watch:=True)>

「同時 Web.Config 也要加入相關的設定參數。」James 將 Web Config 打開,並解說著相關設定的地方。

「在 configSections 中,加入這一段。」

<section name = "log4net " type = "log4net.Config.Log4NetConfigurationSectionHandler, log4net " />

「然後要加入 log4net 的 Config 區塊,log4net 提供了很多樣的 log 記錄型態(註1),我研究了一下大概有兩個比較好用的設定,RollingFileAppender 和 SmtpAppender 這兩種。」

James 解釋著這兩種 Appender 的使用方式,並將其相關設定大致說明。「這些 log4net 的 Project 中都有詳細的說明,而且網路上也可以找到很多教學文件,對 Runtime Debug 來說,非常有用。」

Web.Config

<section name = "log4net" type = "log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

<configSections>
    <sectionGroup name ="applicationSettings " type ="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name ="ERP.My.MySettings " type ="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission= "false" />
    </sectionGroup>
    <section name ="log4net " type ="log4net.Config.Log4NetConfigurationSectionHandler, log4net "/>
  </configSections>

  <log4net>
    <root>
      <level value ="WARN "/>
      <appender-ref ref ="RollingFileAppender "/>
      <appender-ref ref ="SmtpAppender "/>
    </root>
    <logger name ="ERP.Logging ">
      <level value ="DEBUG "/>
    </logger>
    <appender name ="RollingFileAppender " type ="log4net.Appender.RollingFileAppender ">
      <file value ="log\ERP.log "/>
      <appendToFile value ="true "/>
      <rollingStyle value ="Date "/>
      <datePattern value ="yyyyMMdd "/>
      <layout type ="log4net.Layout.PatternLayout">
        <conversionPattern value ="%date %-5level - %message%newline "/>
      </layout>
    </appender>
    <appender name ="SmtpAppender" type ="log4net.Appender.SmtpAppender,log4net ">
      <to value ="XXXXX@abc.com.tw "/>
      <from value ="XXXXX@abc.com.tw "/>
      <subject value ="[ERP Web App]--Log Information "/>
      <smtpHost value ="10.2.32.168 "/>
      <bufferSize value ="512 "/>
      <lossy value ="true "/>
      <evaluator type ="log4net.Core.LevelEvaluator,log4net ">
        <threshold value ="WARN "/>
      </evaluator>
      <layout type ="log4net.Layout.PatternLayout,log4net">
        <conversionPattern value ="%newline%date %-5level - %message%newline%newline%newline "/>
      </layout>
    </appender>
  </log4net>

「設定完之後,只是讓程式具備有 log 的功能,要輸出資訊,還需要在程式中寫一些 Code。」

「好複雜喔!」小艾聽到這邊,已經忍不出插上一句。

James 笑了笑,「複雜的在剛剛設定的那一部分都講完了,程式中只要知道怎麼用就好了。剩下一點點,別急。」

James 在原先 qryPO_parts.aspx.vb 中加入 log4net 的 Imports。

Imports log4net
Imports log4net.Config

並透過 LogMnager.GetLogger 產生一個 log 的 Instance,

Public Class qryPO_Parts
  Inherits System.Web.UI. Page
  Private log As ILog = LogManager.GetLogger( "ERP.Logging")

「在程式的區塊中,可以透過 log.Info、log.Debug、log.Error 來記錄輸出的 Information,這樣看 Log 的時候,可以很清楚的知道這些資訊代表的意義。」

log.Info
log.Debug
log.Error

James 最後開啟執行的 log 檔以及測試一個錯誤,讓系統發出 log 警示的 email。(註1)(圖2)(圖3)

圖2:ERP.log

圖3:Log email

「這樣真的蠻有用的,也不用花太多心思去設計 log 架構。」小艾看到成果,也覺得這樣的設計方式計省事,又可以達到 Runtime Debug 的需求。

「喔!差點漏掉最重要的部份。在 Web 執行的環境中,要特別為 IIS_IUSERS設定 log 目錄寫入的權限,不然 log 是不會生效的。」(圖4)

圖4:IIS 資料夾權限設定

註1:log4net 發出的 email 通知,mimetype 並沒有指定為 HTML,顯示的資訊並不容易閱讀,這部份還待研究。

Prev Next

本篇全系列文章


上一篇
[進程。Processing] 24.鎖定(Lock)
下一篇
[進程。Processing] 26.相容(Compatibility)
系列文
進程。Processing31

2 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2012-10-25 09:20:26

我只用過 log4j
講起來也算是同門的

用了log4net之後
就不必
開發測試時顯示一堆訊息
測完又得 comment 掉
除錯時又得加進來

log4net 真的是好物
拍手拍手拍手

jamesjan iT邦高手 1 級 ‧ 2012-10-25 12:44:00 檢舉

對 幾乎忘了他的存在 但無時無刻不在 讚

0
ted99tw
iT邦高手 1 級 ‧ 2012-10-25 11:02:46

拍手拍手拍手

跟著海綿寶寶拍手準沒錯~~~

我要留言

立即登入留言