使用RSUBMIT并行执行SAS任务,如何获取远程服务器详细运行日志?
SAS并行执行获取远程任务详细日志解决方案
问题分析
当前代码中,远程SAS会话通过-nonotes参数抑制了详细日志输出,且RSUBMIT未正确配置日志存储路径,导致仅能看到任务启动/完成状态,无法获取%dataprep宏内数据步的运行细节。直接添加log=mylog报错通常是因为路径指向本地而非远程,或远程路径无读写权限。
解决步骤
移除远程SAS的日志抑制参数
将主宏中的sascmd参数修改为:options fullstimer sascmd ='!sascmd -nonews' autosignon;去掉
-nonotes,让远程SAS会话输出完整日志信息。为每个远程任务指定独立日志文件
在RSUBMIT语句中添加log参数,指定远程服务器上的有效路径(需确保该路径存在且当前用户有读写权限):rsubmit ts&num wait=no connectpersist=no inheritlib=(ACAPS central arcinp ALSCO ALSleg ALSDTLTB ALSEXTRA ALSSPLIT ALSCOMMT ALSMONTH prjlib pop) sysrputsync=yes log="/remote/logs/ts&num._&date..log";每个远程任务生成独立日志,避免日志覆盖。
强制开启宏内日志输出
在%dataprep宏内添加options notes;,确保数据步的详细信息被记录:%macro dataprep; options notes; DATA ACAPS_CONCATENATION_&date.; SET acaps.ACAPS_ASOF&def_mth_end.; DROP ACCT_NUM PROD_CD_APPRV; RUN; DATA ACAPS_LEGACY_&date.; SET acaps.ACAPS_LEGACY_DTL; RUN; %mend dataprep;(可选)将远程日志下载到本地
在endrsubmit后添加PROC DOWNLOAD,把远程日志文件同步到本地,方便查看:proc download data=none infile="/remote/logs/ts&num._&date..log" outfile="/local/logs/ts&num._&date..log" server=ts# run;
修改后的完整代码
%MACRO BAD_LEGACY(START= , END= ); options fullstimer sascmd ='!sascmd -nonews' autosignon; %DO DATE = &START %TO &END; %let num=%SYSEVALF((%SUBSTR(&DATE,1,4) -%SUBSTR(&start,1,4))*12 + (%SUBSTR(&DATE,5,2) - %SUBSTR(&start,5,2))+1 ); %IF %SUBSTR(&DATE,5,2) GE 01 AND %SUBSTR(&DATE,5,2) LE 12 %THEN %DO; signon ts&num signonwait=YES; %syslput def_mth_end = &def_mth_end; %syslput START= &start; %syslput end= &end; %syslput date= &date; %SYSLPUT _LOCAL_/REMOTE=ts# rsubmit ts&num wait=no connectpersist=no inheritlib=(ACAPS central arcinp ALSCO ALSleg ALSDTLTB ALSEXTRA ALSSPLIT ALSCOMMT ALSMONTH prjlib pop) sysrputsync=yes log="/remote/logs/ts&num._&date..log"; %INCLUDE '$SASUSER_HOME/parmfile.inc'; LIBNAME CCRD ORACLE USER=&eid_CCRD. PASSWORD =&PWD_CCRD. PATH=F3RDPROD SCHEMA='OPS$F3RDPROD'; %macro dataprep; options notes; DATA ACAPS_CONCATENATION_&date.; SET acaps.ACAPS_ASOF&def_mth_end.; DROP ACCT_NUM PROD_CD_APPRV; RUN; DATA ACAPS_LEGACY_&date.; SET acaps.ACAPS_LEGACY_DTL; RUN; %mend dataprep; %dataprep; endrsubmit; /* 可选:下载远程日志到本地 */ proc download data=none infile="/remote/logs/ts&num._&date..log" outfile="/local/logs/ts&num._&date..log" server=ts# run; %END; %END; waitfor _all_ ; signoff _all_ ; %MEND;
内容的提问来源于stack exchange,提问作者Wdy LL
相关产品推荐
相关产品推荐

