X

昨日の日付を取得するバッチファイルを作らずに昨日日付のログを処理する。


昨日の日付を取得するバッチファイル

psyslogのログを毎日圧縮するスクリプト
powershell
windows バッチファイル
タスクスケジューラー

今日の日付を取得するバッチファイルは簡単に作れる。
巷に溢れているけども一応記載しておくとこうだ。

echo %date:~0,4%-%date:~5,2%-%date:~8,2%
2020-02-08

では昨日の日付を取得するスクリプトは?

powershellでは簡単にできるようだが、windowsバッチファイルで実現するためには何十行かのコードを書かなければならない。
月替わり、年替わりを考慮すると相当力技のコードになる。

powershellでは下記の通り。

PS C:\Users\root> (Get-Date).AddDays(-1)

2020年2月7日 12:21:29

しかし、逆転の発想でわざわざ昨日の日付を計算して取得せずに良い方法はないかを考えた。

当日の日付を吐き出すスクリプトは比較的容易に実現できるので、
前日に当日の日付を吐き出して保存して、翌日それを呼び出して使えばいいのである。

あったまイイ!

大まかなロジックはこう。

1.D:\pSysLog109\logs\yesterday.txt に昨日の日付の入った処理対象のログファイル名を書いて保存しておく。
2.ログは0:00にローテーションされて当日のものが作成される。(YYYY-MM-DD-syslog.log)
3.夜中の3時にバッチを走らせて、昨日分のログファイルをzipで圧縮して保存。元のファイルは削除する。
4.バッチが正常完了したらその日のログファイル名をD:\pSysLog109\logs\yesterday.txt に上書きで書き出す。(これが明日の処理では昨日日付のファイル名となる)
5.(2に戻る)

古典的なwindowsバッチファイルで実現するスクリプトを作ってみたので運用に活用していただければと思う。

サンプルコードでは、フリーのsyslogサーバであるpsyslog()の日ごとのログファイルを1日1回zip圧縮して元のログデータを削除するという処理を記述している。
様々に応用可能と思うので参考にされたい。

Special Thanks to :

超簡単! Powershellでファイルの圧縮/解凍
https://qiita.com/n-nabe/items/4f5f6f5178205a2cbc50
→結局1.2GBを超えるファイルをPowerShellのzip圧縮でやろうとするとエラーが出てしまうので、7zip.exeのコマンドライン版(7za.exe)を使うことにした。
一部構文等を参考にさせていただきました。

psyslog フリーのsyslogサーバ
http://akisoftware.com/freesoft.html
http://akisoftware.com/cgi-bin/wc.exe?akilib

7zip コマンドライン版
https://sevenzip.osdn.jp/download.html


ZIPLOG.bat

@echo off

REM 各種パスの指定。Powershellは結局使わないのでいらない。
REM 7za.exeはD:\pSysLog109に配置しておく。

set base_path=D:\pSysLog109\logs
set powershell_exe="C:\Users\(Adminアカウントのプロファイル)\AppData\Roami
ng\Microsoft\Windows\Start Menu\Programs\Windows
PowerShell\Windows PowerShell.lnk"

set destination_path=D:\pSysLog109\logs
set zippath="D:\pSysLog109"

rem 処理する昨日のファイル名をfnameにセットする。
REM この処理に先立って、最初の昨日の日付を含むテキストファイルだけは手作業で作成しておく


for /f %%a in (%base_path%\yesterday.txt) do set FNAME=%%a

REM フォルダ存在判定
if not exist %base_path% (
eventcreate /T ERROR /SO ZIPLOG.bat /ID 997 /D "ログフォ
ルダが見つかりません" /L APPLICATION
exit /b 1
)
@echo on

REM もともとPowershellで実装しようとしていた部分。1.2GB以上のファイルでエラーになったのであきらめた。
REM %powershell_exe% Compress-Archive -Path %base_path%\%FNAME% -DestinationPath %destination_path%\%FNAME%.zip -Force
%zippath%\7za.exe a %destination_path%\%FNAME%.zip %base_path%\%FNAME%


if %ERRORLEVEL% == 0 (
echo %date:~0,4%-%date:~5,2%-%date:~8,2%-syslog.log > %base_path%\yesterday.txt
@echo off

REM 600秒待つ、待った後にログ本体を削除
timeout /t 600 /nobreak >nul
del /F /Q %base_path%\%FNAME%
eventcreate /T SUCCESS /SO ZIPLOG.bat /ID 990 /D "ZIPLOGは正常に圧縮・削除を行いました"
exit /b 0
)
eventcreate /T ERROR /SO ZIPLOG.bat /ID 998 /D "圧縮バッチジョブは失敗しました" /L APPLICATION
exit /b 1

ログの圧縮と削除を日々実行するために、Windowsタスクスケジューラにバッチファイルを登録します。

1.スタートメニュー → タスクスケジューラでタスクスケジューラを起動。
2.タスクスケジューラライブラリ→新しいタスクの作成 を選択。

3.「名前」に適当な名前をつけて、”ユーザーがログオンしているかどうかにかかわらず実行する”を選択。

4.「トリガー」から「新規」を選んで”毎日”、”03:00”に開始を選択。OKで閉じる。

5.「操作」から「新規」を選んでプログラムスクリプトのフルパスを指定。

6.この後タスクを保存する際に、実行するAdministrator権限のパスワードを聞かれるので入力して保存。

ログ削除のところは慎重に実施してください。エラーハンドリングがうまくいかないと間違って圧縮できてないのに削除しちゃうことも考えられます。
使用は自己責任にてお願いします。
※本プログラムが引き起こした障害、ログの誤削除などについて筆者は一切の責任を持ちません。

テストするなら、しばらくは

del /F /Q %base_path%\%FNAME%

ren %base_path%\%FNAME% bkup_%FNAME%

としてうまく圧縮ファイルが出来上がって、リネームされるかを確認して本番に移行してください。


ryo49:
Related Post