Logging 如何在SAS中记录当前步骤?

Logging 如何在SAS中记录当前步骤?,logging,sas,monitoring,sas-macro,Logging,Sas,Monitoring,Sas Macro,我正在尝试监视一个长SAS脚本的进程。开始时,我使用了类似于: DATA work.dataset1; SYSECHO "Currently working on: work.dataset1"; /* DO STUFF*/ END; PROC SORT DATA=work.dataset1 OUT = work.work.dataset2; SYSECHO "Currently working on: work.dataset2"; /* DO STUFF*/

我正在尝试监视一个长SAS脚本的进程。开始时,我使用了类似于:

DATA work.dataset1;
    SYSECHO "Currently working on: work.dataset1";
    /* DO STUFF*/
END;

PROC SORT DATA=work.dataset1 OUT = work.work.dataset2;
    SYSECHO "Currently working on: work.dataset2";
    /* DO STUFF*/
END;
  .....
DATA work.datasetn;
    SYSECHO "Currently working on: work.datasetn";
    /* DO STUFF*/
END;
但是,这很难维护,而且非常冗长。因此,我尝试创建一个宏,该宏将自动获取步骤名称或步骤数据集(或让我知道当前正在运行哪个步骤的任何信息),并将其传递给
SYSECHO

%macro nstep;
SYSECHO "Finished Processing &SYSLAST";
%mend;


DATA work.dataset1;
    %nstep;
    /* DO STUFF*/
END;
但是,这实际上是打印最后一个受影响的数据集,而不是当前数据集。因此,在执行第一步时,该行为特别有问题,第一次使用
%nstep
会显示上一次执行的数据集的名称


我正在寻找一种方法来查找当前数据/proc语句名称或任何独特的人类可读信息。

SAS中没有用于监督级源代码处理、step语句收集时间(预编译)或step编译时间的显式自省或回调机制

但是,您可以实现并使用(采用)一个名称指定框架来执行所需的操作

概念:

  • 创建一个宏,
    E
    ,它接受要报告的名称
  • 关于使用
    SYSECHO
    通过
    DOSUBL
  • 名称作为源代码发出
  • 当您希望将名称消息发送回IOM客户端时,请使用
    %E()
代码中的框架:

%* part of autoexec, autocall, or specified macro library;
%macro E(name);
  &name
  %local rc;
  %let rc = %sysfunc(DOSUBL(%nrstr(
    %put NOTE: SYSECHOing &name;  /* The put NOTE: can be removed if you want */
    SYSECHO "Working on &name";
  )));
%mend;


DATA %E(work.dataset1);
    /* DO STUFF*/
RUN;

PROC SORT DATA=work.dataset1 OUT = %E(work.dataset2);
    /* DO STUFF*/
RUN;
… 
DATA %E(work.dataset27);
    /* DO STUFF*/
END;

不是自动的,但没有那么详细。

尝试使用您的宏,如果将
&name
放在
%local
之前,它就会工作:
%macro E(name)&名称%LocalRC您好,谢谢您的解决方案!但它确实需要@AlexeySigida的修复才能正常工作。请更新答案,我会接受它,因为它解决了问题>TBH,我不敢相信你需要如此牵强的东西来实现合理的标准日志。答案按评论固定。Side info
DOSUBL
返回0或不返回0--
%let
会“吃掉”返回值,这样宏处理器就不会将其发送到源代码流中。@Théphilepace只需等待,直到您想做一些错误处理=/