概要
Logチェックって、要するにgrepですよね。
Power Shellを利用してみます。
SASのログウィンドウでErrorやWarningはログの文字色が変わるので目視でも見つけやすいです。しかしながらログの文字色が変わらないNOTE系(BY値を繰り返す、初期化されていません、変換しました、など)は見つけるのが困難な場合もあります。
どんなチームでもログチェックをするバッチなりSASプログラムなりは用意されていますが、そのほとんどが全実行時のものです。対話式で開発中にも開発者レベルで比較的簡単にログチェックをする方法をメモしておきます。
準備
![](https://ymddttm.com/wp-content/uploads/2020/06/2020-0629_02-2.png)
ログウィンドウに出力されたログを「ファイル→名前をつけて保存」で適当なフォルダに保存します(拡張子は.log)。上記ファイルは適当に作りました。
PowerShellが許可されている場合
logcheck.ps1
(PowerShellの拡張子はps1です。)
$ary = @(
"error",
"warning",
"BY値"
)
$date = get-date -UFormat %m%d-%H%M
$logfile = "*.log"
foreach($dat in $ary){
sls $dat $logfile -Encoding default >> log_$date.txt
}
$ary
検索ワードを配列で準備しています。
$date
実行結果のファイルに日時をつけるための変数を設定。
$logfile
検索されるファイルを指定。
foreach
配列$aryの内容を1つずつ$datに入れてループ内を実行しています。
sls
grepをし、結果をlog_$date.txtとして出力しています。
-Encoding defaultをつけることで日本語も適切な文字コードで認識させています。
@echo off pause powershell .\logcheck.ps1 pause
PowerShellを起動するためのバッチです。
上の2つのコードとログファイルを同じフォルダに保存してバッチをダブルクリックすれば実行されます。
本来はPowerShell単体でも動きますが、拡張子ps1はセキュリティ対策のためメモ帳に関連付けされているために、単体で起動するにはPowerShellウィンドウからプログラムを実行する必要があります。それだと面倒なのでバッチ起動にしてあります。バッチは歴史があるため社内資産やネットでの情報も多いのですが、文法がわかりにくく融通も利かないため、できるだけ利用したくありません。とは言え、仕方ない場合もあります。
![](https://ymddttm.com/wp-content/uploads/2020/06/2020-0629_03.png)
配列内で指定したワードをファイル名とともに抽出できています。
PowerShellが許可されていない場合
ほとんどの社内環境でPowerShellは
「このシステムではスクリプトの実行が無効になっているため***を読み込むことができません。」
と赤字で言われて実行できません。真っ赤な文字で長文を表示されるとまるで自分が不正行為を疑われているような錯覚に陥り非常に嫌な感じです。わざわざ管理者に実行できるようにしてもらうのも面倒なのでセキュリティレベルを変更せずに実行する方法もメモしておきます。
コードを貼り付けて実行します。
原始的ですが、単純でわかりやすく確実です。
sls "error" "C:\Users\test*.log" -Encoding default sls "warning" "C:\Users\test*.log" -Encoding default sls "BY値" "C:\Users\test*.log" -Encoding default
上記のps1プログラムをバラしただけです(ファイル出力は省略)。上記をテキストファイルとして保存しておきます。
ログを準備したら、PowerShell ISEを立ち上げて、保存していたファイルを開きます。
![](https://ymddttm.com/wp-content/uploads/2020/06/2020-0629_04.png)
上部ペインで開かれているコードをコピーし、下部ペインに貼り付けます。
(Enterで実行)
![](https://ymddttm.com/wp-content/uploads/2020/06/2020-0629_05.png)
結果が画面に出力されました。
![](https://ymddttm.com/wp-content/uploads/2020/06/2020-0629_06-1024x726.png)
ログファイルを準備する手間はかかってしまいますが、対話式で簡単にログチェックをする方法としては良いのではないかと思います。
追記
直近ではこんな感じにカスタマイズして使っています。
Geg-Date -format "yyyy/MM/dd HH:mm"
"■■■■error■■■■"; sls "^error" "C:Users\test\*.log" -Encoding default
"■■■■warning■■■■"; sls "^warning" "C:Users\test\*.log" -Encoding default
"■■■■BY値■■■■"; sls "BY値" "C:Users\test\*.log" -Encoding default
"■■■■0による除算■■■■"; sls "0による除算" "C:Users\test\*.log" -Encoding default
"■■■■欠損値■■■■"; sls "欠損値" "C:Users\test\*.log" -Encoding default
"■■■■初期化■■■■"; sls "初期化" "C:Users\test\*.log" -Encoding default
"■■■■変換しました■■■■"; sls "変換しました" "C:Users\test\*.log" -Encoding default
"■■■■単位の指定が■■■■"; sls "単位の指定が" "C:Users\test\*.log" -Encoding default
簡単に解説
どのコードからの出力か見やすくするために検索文字列を出力しています。
セミコロンで2つのコードを1行にまとめています。
文頭のerror,warningにhitさせるために正規表現を利用しています。
コメント