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

标签 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*/
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 显示上一次执行的数据集名称。

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

最佳答案

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

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

概念:

  • 创建宏, E ,接受举报姓名
  • 关于姓名的消息,使用 SYSECHO通过DOSUBL
  • 名称作为源代码发出
  • 使用%E(<name>) (在实际源代码的上下文中)当您想要将名称消息发送回 IOM 客户端时

代码中的框架:

%* 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;

不是自动的,但也不那么冗长。

关于logging - 如何在SAS中记录当前步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59967821/

相关文章:

c# - 使用 async/await 堆栈跟踪

python - 有没有办法在Python中为日志记录模块配置缓冲区

SAS - 在宏条件之前分配库

dataset - 删除 SAS 数据集

java - 如何从 Java 代码获取 Ganglia 指标

node.js - 如何在 NestJs 中使用 Fastify 忽略特定的路由日志记录?

logging - FluentD 日志不可读。它被排除在外,下次会检查

SAS:如何检查导入的Excel工作表中的列是否包含字符串?

service - 在 kubernetes 命名空间中监控 prometheus 上的自定义服务时出现问题

azure - 如何将 Azure Scaleset 添加到 Log Analytics