我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

SASのログを保存しつつ、目視チェックする

ちょっと本業が忙しくてなかなか記事更新ができないのですが、暇つぶしにやってる某掲示板の書き込みでも転載しておきます。
日本語での情報も需要があるかもしれませんので。

SASのログ、だいたい皆さん保存していると思いますが、実行時に同時に確認したいケースもあると思います。
バッチ実行ではログは特定のファイルとして出力され、通常の実行ではproc printlogをつかってログをファイルに出力すると、ログウィンドウに表示されませんよね。

そんなときの対策3つです。




1. X コマンドでログファイルを開く

%let logref=C:\Temp\sas.log;
proc printto log="&logref";
run;

data _null_;
  set sashelp.class;
  put _all_;
run;

proc printto log=log;
run;
options noxsync;
x "notepad &logref";

キモはnoxsyncですね。
これがないと、ログファイルを閉じないとそのsubmitセッションが終了できなくなります。(バッチ実行ではSASセッション自体が終わらない)

  • メリット
    • バッチ実行でも動きます。
  • デメリット
    • proc printto ステートメントでリダイレクトを開始した時点からのログになります。(SAS起動時に表示されるバージョン等が入らない)
    • 色がつかない可能性がある(設定したエディタなら可能ですが)

なお、

GETOPTION(LOG)

でバッチ実行時のログファイルを指定できるため、

X "notepad %sysfunc(GETOPTION(LOG))";

とすれば、バッチ実行のログファイルも開くことができます。
なお、通常実行時はログファイル名が空になりますから、新規のメモ帳が開くだけになります。


2. DMステートメントで保存する

%let logref=C:\Temp\sas.log;

data _null_;
  set sashelp.class;
  put _all_;
run;

DM "LOG; FILE ""&logref"" ";

これは、ログに出力された内容をDMステートメントで保存する、という方法です。
バッチ実行時はログの確認が不要、という場合はこれでも良さそうです。

  • メリット
    • SASのログがそのまま保存されます。
  • デメリット
    • バッチ実行では動きません。
    • SAS on Demand等では動きません。(BaseSASのDMSだけ)


3. ログを読み込む

%let logref=C:\Temp\sas.log;

proc printto log="&logref" new;
run;
filename f "&logref";

data _null_;
  set sashelp.class;
  put _all_;
run;

proc printto log=log;
run;

data _null_;
  infile f;
  input;
  putlog _infile_;
run;
filename f;

proc printtoでリダイレクトしたログを再度ログウィンドウに表示する方法です。

  • メリット
    • バッチ実行でも動きます。(リダイレクトしたログにも、バッチ実行ログにも記録されます。)
  • デメリット
    • 若干冗長かな、という気がします。


メリット・デメリットは、単なるメリット・デメリットではなく、使い分けの目安になると思います。(デメリットがメリットにもなりうる)