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セッション自体が終わらない)
- メリット
- バッチ実行でも動きます。
- デメリット
なお、
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ステートメントで保存する、という方法です。
バッチ実行時はログの確認が不要、という場合はこれでも良さそうです。
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でリダイレクトしたログを再度ログウィンドウに表示する方法です。
- メリット
- バッチ実行でも動きます。(リダイレクトしたログにも、バッチ実行ログにも記録されます。)
- デメリット
- 若干冗長かな、という気がします。
メリット・デメリットは、単なるメリット・デメリットではなく、使い分けの目安になると思います。(デメリットがメリットにもなりうる)