NonSoft

ログファイルを出力するサンプル(VB.NET)

 サンプルソース
自力でログファイルを出力するサンプルを作ってみました。今まではlog4netを使用していましたが、
毎回、log4netを使用するための手続きをするのが面倒だったので自作した方が良いと思いました。

log4netを使用したサンプルも載せて置きます。log4netを使用したサンプルは以下の手続きが必要です。
1.log4net.dllをダウンロードする(Webで検索すればすぐに見つかると思います)
2.log4net.dllを参照設定で追加する。
3.アセンブリ情報ファイル(AssemblyInfo.vb)に次の行を追加する。
  <Assembly: log4net.Config.XmlConfigurator(Watch:=True)>
4.アプリケーション構成ファイル(app.config)をプロジェクトに追加して編集する。
  サンプルソース参照。
5.log4netの宣言をする。
  Private Shared ReadOnly Logger As log4net.ILog = _
   log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

★フォームモジュール(Form1.vb) − log4netを使用しないサンプル
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim stt As StackTrace = New StackTrace(False)
        Dim cls As String = stt.GetFrame(0).GetMethod().ReflectedType.FullName
        Dim mth As String = stt.GetFrame(0).GetMethod().Name

        Try
            WriteTraceLog(cls & "." & mth & "開始")
            ' ゼロ割り算Exceptionを発生させる
            Dim a As Integer = 0
            a = a / 0
            WriteTraceLog(cls & "." & mth & "終了")
        Catch ex As Exception
            WriteTraceLog(cls & "." & mth & "でエラーが発生しました", ex)
        End Try
    End Sub

    ''' <summary>
    ''' ログ出力
    ''' </summary>
    ''' <param name="msg">メッセージ</param>
    ''' <param name="ex">Exception(無指定の場合はメッセージのみ出力)</param>
    ''' <remarks></remarks>
    Private Shared Sub WriteTraceLog(ByVal msg As String, Optional ByVal ex As Exception = Nothing)
        Try
            ' ログフォルダ名作成
            Dim dt As DateTime = Now
            Dim logFolder As String = System.AppDomain.CurrentDomain.BaseDirectory & "Log"

            ' ログフォルダ名作成
            System.IO.Directory.CreateDirectory(logFolder)

            ' ログファイル名作成
            Dim logFile As String = logFolder & "\TraceLog" & dt.ToString("dd") & ".log"

            ' 翌日分のログファイル削除(1ヶ月分のログファイルしか保存しないようにするため)
            Dim logNext As String = logFolder & "\TraceLog" & dt.AddDays(1).ToString("dd") & ".log"
            System.IO.File.Delete(logNext)

            ' ログ出力文字列作成
            Dim logStr As String
            logStr = dt.ToString("yyyy/MM/dd HH:mm:ss") & vbTab & msg
            If ex Is Nothing = False Then
                logStr = logStr & vbCrLf & ex.ToString
            End If

            ' Shift-JISでログ出力
            Dim sw As IO.StreamWriter = Nothing
            Try
                sw = New IO.StreamWriter(logFile, True, System.Text.Encoding.GetEncoding("Shift-JIS"))
                sw.WriteLine(logStr)
            Catch ex2 As Exception
            Finally
                If sw Is Nothing = False Then sw.Close()
            End Try
        Catch ex2 As Exception
        End Try
    End Sub

End Class

★フォームモジュール(Form1.vb) − log4netを使用したサンプル
Public Class Form1

    ''' <summary>
    ''' ログ出力
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared ReadOnly Logger As log4net.ILog = _
        log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim stt As StackTrace = New StackTrace(False)
        Dim cls As String = stt.GetFrame(0).GetMethod().ReflectedType.FullName
        Dim mth As String = stt.GetFrame(0).GetMethod().Name

        Try
            Logger.Info(cls & "." & mth & "開始")
            ' ゼロ割り算Exceptionを発生させる
            Dim a As Integer = 0
            a = a / 0
            Logger.Info(cls & "." & mth & "終了")
        Catch ex As Exception
            Logger.Fatal(cls & "." & mth & "でエラーが発生しました", ex)
        End Try
    End Sub

End Class
★アセンブリ情報ファイル(AssemblyInfo.vb)
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices

' アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 
' アセンブリに関連付けられている情報を変更するには、
' これらの属性値を変更してください。

' アセンブリ属性の値を確認します。

<Assembly: AssemblyTitle("Etc")> 
<Assembly: AssemblyDescription("")> 
<Assembly: AssemblyCompany("")> 
<Assembly: AssemblyProduct("Etc")> 
<Assembly: AssemblyCopyright("Copyright (C)  2009")> 
<Assembly: AssemblyTrademark("")> 

<Assembly: ComVisible(False)>

'このプロジェクトが COM に公開される場合、次の GUID がタイプ ライブラリの ID になります。
<Assembly: Guid("d6f86f73-4c97-4481-9afe-5faa7f6be214")> 

' アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
'
'      Major Version
'      Minor Version 
'      Build Number
'      Revision
'
' すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を 
' 既定値にすることができます:
' <Assembly: AssemblyVersion("1.0.*")> 

<Assembly: AssemblyVersion("1.0.0.0")> 
<Assembly: AssemblyFileVersion("1.0.0.0")> 
<Assembly: log4net.Config.XmlConfigurator(Watch:=True)> 
★アプリケーション構成ファイル(app.config)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net"
        type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="RollingLogFileAppender" 
      type="log4net.Appender.RollingFileAppender">
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="3" />
      <param name="MaximumFileSize" value="10KB" />
      <param name="RollingStyle" value="date" />
      <param name="StaticLogFileName" value="false" />
      <param name="File" value="Log/Log4Net" />
      <param name="DatePattern" value='"_"dd".log"' />
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header]&#13;&#10;" />
        <param name="Footer" value="[Footer]&#13;&#10;" />
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>

    <root>
      <level value="INFO" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
  </log4net>
</configuration>