2014年10月1日水曜日

[他]複数のWebサーバからログをコピーする

負荷分散などでWebサーバが複数台あるシステムがあります。で、トラブル発生→ログ収集だ。となった時、いちいちファイルログファイルをコピーするのは非常に面倒です。ということで、Windowsマシンなら大体動作するVBScriptで、複数のサーバからログをコピーするスクリプトを作ってみました。 ログのコピーと言っても、大量になっちゃうので、当日を含む過去4日に更新されたタイムスタンプのもの。という縛りをつけてみました。

'-------------------------------------------------
' c:\temp\>cscript logcopy.vbs
'-------------------------------------------------
Option Explicit

'-------------------------------------------------
'ログ保存場所
Const COPY_DIR = ".\logs\"

'過去何日分か(過去3日分)
Dim TARGET_DATE: TARGET_DATE = DateAdd("d", -3, Date)

'-------------------------------------------------
'対象
'-------------------------------------------------
Dim WEB_SERVERS: WEB_SERVERS = Array( _
"192.168.1.1", _
"192.168.1.2", _
"192.168.1.3", _
"192.168.1.4", _
"192.168.1.5", _
"192.168.1.6")
Dim LOG_PATH: LOG_PATH = "\d$\mysystem\WebLog"


'-------------------------------------------------
'処理
'-------------------------------------------------
Call InitDir(COPY_DIR)

Dim server

' V5サーバのログコピー
For Each server In WEB_SERVERS
    Call CopyFiles(server, COPY_DIR & server, LOG_PATH)
Next


'-----------------
'ファイルコピー
'指定ディレクトリのファイルをコピーする
'-----------------
Sub CopyFiles(server, dest, targetPath)
    Dim path: path = "\\" & server & targetPath
    WScript.Echo "CopyFiles  path= " & path
    Call InitDir(dest)

    Dim objFso:Set objFso = CreateObject("Scripting.FileSystemObject")

    Dim objShell: Set objShell = CreateObject("Shell.Application")
    Dim objFolder : Set objFolder = objShell.Namespace(path)
    Dim objFolderItems: Set objFolderItems = objFolder.Items()
    Dim objItem
    Dim idx


    For idx = 0 To objFolderItems.Count - 1
        Set objItem = objFolderItems.Item(idx)

        If objItem.IsFolder = True Then
            Call CopyFiles(server, objFso.BuildPath(dest, objItem.Name), objFso.BuildPath(targetPath, objItem.Name))
        Else
           If IsCopyFile(objItem) = True Then
             Call objFso.CopyFile(objItem.path, objFso.BuildPath(dest, objItem.Name))
           End If
        End If

    Next

End Sub

'-----------------
'ファイルコピー判定
'過去N日分のファイルをコピーする
'-----------------
Function IsCopyFile(fileObj)

    If fileObj.ModifyDate >= TARGET_DATE Then
        IsCopyFile = True
    Else
        IsCopyFile = False
    End If

End Function


'-----------------
'ディレクトリがなければ作成
'-----------------
Sub InitDir(target)
    Dim objFso:Set objFso = CreateObject("Scripting.FileSystemObject")

    If objFso.FolderExists(target) = False Then
        objFso.Createfolder (target)
    End If

End Sub