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