00001 ' Attribute VB_Name = "Logger"
00002 Option Explicit
00003 '----------------------------------------------
00004 '! @brief ログ書き込みのためのクラス。
00005 '! @code
00006 '! Set logger = New XLogger
00007 '! logger.write(msg)
00008 '! @endcode
00009 '! @description ' ログファイル名を指定していなければスクリプトのあるディレクトリに出力する。
00010 '! このときのログファイル名は<スクリプト基本名>-yyyyMMdd.log<br />
00011 '! *ログファイルを作成できない or 誰かがロックしている 等の場合、10回再試行して使えなければスクリプトを終了させる
00012 Class XLogger
00013
00014 Private mLogFileName ' As String '* ログファイルの名前。
00015 Private mLogLevel ' As Integer '* ログ出力レベル
00016
00017 '----------------------------------------------
00018 '* @brief ログファイルの設定
00019 '----------------------------------------------
00020 Public Sub setFileName(filename)
00021 Dim fn
00022 fn = replaceDateSymbols(filename)
00023
00024 mLogFileName = fn
00025 End Sub
00026
00027 '----------------------------------------------
00028 '* @brief ログの書き出し
00029 '* @param msg 書き出す文字列
00030 '----------------------------------------------
00031 Public Sub write(msg)
00032 On Error Resume Next
00033 If mLogLevel = LOGLEVEL_NONE Then Exit Sub
00034
00035 dim fso
00036 dim fo
00037 Set fso = CreateObject("Scripting.FileSystemObject")
00038
00039 Set fo = openLogFile(fso)
00040 If(Err.Number <> 0) Then
00041 WScript.Echo "open file failed " & mLogFileName & vbCrLf & Err.Description
00042 End If
00043 fo.WriteLine FormatDate(Now(),"yyyy/MM/dd HH:mm:ss") & " " & msg
00044 If(Err.Number <> 0) Then
00045 WScript.Echo Err.Description
00046 End If
00047 fo.Close
00048 Set fo = Nothing
00049 Set fso = Nothing
00050 end sub
00051 '----------------------------------------------
00052 '* @brief ログファイルを開く
00053 '----------------------------------------------
00054 Function openLogFile(fso)
00055 On Error Resume Next
00056 Dim fo
00057 Dim retry
00058
00059 Set fo = Nothing
00060 retry = 0
00061 Do While (fo is Nothing)
00062 Set fo = fso.OpenTextFile(mLogFileName,ForAppending, True)
00063 Select Case Err.Number
00064 Case 0 '開けた
00065 Exit Do
00066 Case 76 ' パスが見つからない(設定ミス)
00067 WScript.Echo "open file failed " & mLogFileName & vbCrLf & Err.Number & ":" & Err.Description
00068 WScript.Quit -1
00069 Case 70 ' 書き込めない(ROか、誰かがロックしている)
00070 retry = retry + 1
00071 If retry >= 10 Then
00072 '10回も試してダメならもう何も出来ない。秀丸で開くバカなんか知らない
00073 WScript.Echo "open file failed " & mLogFileName & vbCrLf & Err.Number & ":" & Err.Description
00074 WScript.Quit -1
00075 End If
00076 WScript.Sleep 100
00077 Case Else
00078 WScript.Echo "open file failed " & mLogFileName & vbCrLf & Err.Number & ":" & Err.Description
00079 WScript.Quit -1
00080 End Select
00081 Loop
00082
00083 Set openLogFile = fo
00084 Err.Clear
00085 End Function
00086
00087 '----------------------------------------------
00088 '* @brief デバッグメッセージ出力
00089 '----------------------------------------------
00090 Public Sub Debug(msg)
00091 If mLogLevel > 1 Then Exit Sub
00092
00093 write "DEBUG:" & msg
00094 End Sub
00095 '----------------------------------------------
00096 '* @brief 情報メッセージ出力
00097 '----------------------------------------------
00098 Public Sub Info(msg)
00099 If mLogLevel > LOGLEVEL_INFO Then Exit Sub
00100
00101 write "INFO:" & msg
00102 End Sub
00103 '----------------------------------------------
00104 '* @brief 警告メッセージ出力
00105 '----------------------------------------------
00106 Public Sub Warning(msg)
00107 If mLogLevel > LOGLEVEL_WARNING Then Exit Sub
00108
00109 write "WARNING:" & msg
00110 End Sub
00111 '----------------------------------------------
00112 '* @brief エラーメッセージ出力
00113 '----------------------------------------------
00114 Public Sub Error(msg)
00115 If mLogLevel > LOGLEVEL_ERROR Then Exit Sub
00116
00117 write "ERROR:" & msg
00118 End Sub
00119
00120 Public Sub Class_Initialize()
00121 'デフォルト=スクリプト基本名+yyyyMMdd+.log
00122 Dim basePath
00123 Dim fileNameFormat
00124 basePath = ScriptProperties.Item("LogFile.Path")
00125 If(basePath = "") Then
00126 basePath = getScriptPath
00127 End IF
00128
00129 Dim filePrefix
00130 filePrefix = ScriptProperties.Item("LogFile.Prefix")
00131 If(filePrefix = "") Then
00132 filePrefix = getScriptBaseName
00133 End IF
00134
00135 mLogFileName = combinPath(basePath,replaceDateSymbols(filePrefix & "_%y%M%d.log"))
00136
00137 mLogLevel = CInt( ScriptProperties.Item("LogFile.LogLevel") )
00138 End Sub
00139
00140 '* @brief 書式指定文字に従って文字列を編集。
00141 '* @note bash::date -s の動作に従う。
00142 Private Function replaceDateSymbols(str)
00143 Dim fn
00144 Dim dt
00145 dt = Now
00146
00147 fn = Replace(str,"%y",Right("0000" & Year(dt) ,4) )
00148 fn = Replace(fn,"%M",Right("00" & Month(dt) ,2) )
00149 fn = Replace(fn,"%d",Right("00" & Day(dt) ,2) )
00150 fn = Replace(fn,"%H",Right("00" & Hour(dt) ,2) )
00151 fn = Replace(fn,"%m",Right("00" & Minute(dt) ,2) )
00152 fn = Replace(fn,"%s",Right("00" & Second(dt) ,2) )
00153
00154 replaceDateSymbols = fn
00155 End Function
00156 End Class
00157 '----------------------------------------------
00158 '* デフォルトのロガー
00159 '----------------------------------------------
00160 Dim Logger
00161 Set Logger = new XLogger