【问题标题】:SAS Email If Errors Occur发生错误时的 SAS 电子邮件
【发布时间】:2012-03-02 15:26:34
【问题描述】:

是否有任何代码/宏可以合并到我的 sas 程序中,一旦我的 sas 代码在运行时出现错误,我会立即向我发送电子邮件?

这封电子邮件是否也可能包含发生的错误?

【问题讨论】:

  • 这段代码会以批处理模式执行吗?什么环境(Windows、Unix、z/OS)?会是一系列节目还是一个节目?您是否对程序进行了编码以在出现错误后停止运行?
  • 是的,它将处于批处理模式。在 Windows 7 上运行。它将是一系列 6 个程序,依次运行。没有对它们进行编码以在出现错误时停止。

标签: sas


【解决方案1】:

是的……没有……

这是可能的 - 但没有很好的方法来做到这一点。您必须在每个过程之后检查是否发生错误。基本上,您会插入一行代码,在整个代码中执行数十次(或数百次)测试。

我经常发现在整个程序运行后执行测试就足够了。如果中途确实发生了错误,那么 SAS 通常会进入语法检查模式,因此它不会在错误之后执行任何代码。

这种方法也有它自己独立的一组问题。从包含错误信息的 SYS 宏变量开始,只存储最近错误的信息。我们可以检查日志,但这样做的问题是日志仍在被我们当前运行的程序使用,并检查导致我们无法使用 SAS 打开它来读取它。

我解决这个问题的方法是调用 SAS 两次。第一次运行程序并将日志保存到指定文件。第二次运行一个程序,该程序将检查刚刚创建的日志文件,并在满足特定条件时发送电子邮件(例如以ERROR:开头的行。

一些细节...当您第二次启动 sas 时,您可以使用SYSPARM 参数传入您要检查的日志文件的名称。您可以使用类似这样的代码解析日志文件(我建议您根据自己的情况自定义条件):

**
** READ IN LOGFILE. CHECK FOR PROBLEMS
*;

data problems log;
  length line $1000;

  infile "&logfile";
  input;

  logfile = "&logfile";
  line_no = _n_;
  line    = _infile_;
  problem = 0;

  if 
  (
     line =: "ERROR:"
  or line =: "WARNING:"
  or line =: "NOTE: Numeric values have been converted to character values"
  or line =: "NOTE: Character values have been converted to numeric values"
  or line =: "NOTE: Missing values were generated as a result of performing an operation on missing values"
  or line =: "NOTE: MERGE statement has more than one data set with repeats of BY values"
  or line =: "NOTE: Invalid (or missing) arguments to the INTNX function have caused the function to return"
  or line =: "INFO: Character variables have defaulted to a length of 200"
  or line =: "NOTE: Invalid"
  )
  and not
  (
      line =: "WARNING: Your system is scheduled to expire"
  or  line =: "WARNING: The Base Product product with which Session Manager is associated"
  or  line =: "WARNING: will be expiring soon, and is currently in warning mode to indicate"
  or  line =: "WARNING: this upcoming expiration. Please run PROC SETINIT to obtain more"
  or  line =: "WARNING: information on your warning period."
  or  line =: "WARNING: This CREATE TABLE statement recursively references the target table. A consequence"
  or  line =: "WARNING: Unable to copy SASUSER registry to WORK registry. Because of this, you will not see registry customizations during this"
  or  line =: "WARNING: Estimates did not improve after a ridge was encountered in the objective function."
  or  line =: "WARNING: Estimates may not have converged."
  or  line =: "ERROR: A lock is not available for"
  or  line =: "ERROR: Errors printed on page"
  or (line =: "WARNING: Apparent symbolic reference TODT not resolved." and "%upcase(&jobname)" eq "DIAL800.REPORTING_API")
  )
  then do;
    problem = 1;
    output problems;
  end;
  output log;
run;

filename mymail email content_type="text/html"
                      to=( test@test.test )
                      from=("myemail@test.test")
                      subject="mysubject"
                      attach="&logfile";

data _null_;
  length divider $200;

  file mymail;

  set problems end=eof;

  divider = repeat('=',80);

  if _n_ eq 1 then do;
    put '<font style="font-family:courier new;font-size:9pt"><br>';
    put divider "<br>";
    put "SUMMARY OF PROBLEMS: &logfile <br>";
    put divider "<br><br>";
  end;

  put line_no 5. ": " line "<br>";

  if eof then do;
    put divider "<br>";
    put "END OF SUMMARY     <br>";
    put divider "<br><br>";
  end;

run;

从您的问题中不清楚您是否知道如何在 SAS 中发送电子邮件,但如果不知道,我建议您先用谷歌搜索它,如果您仍然无法使其正常工作,然后再回来发布一个单独的问题。

编辑:您可以在调用 SAS 时使用-LOG "myfile.log" 参数指定 SAS 应将日志文件保存到的位置。

【讨论】:

  • 在提供的代码中如何指定日志的位置?另外,如果您的代码返回正面,您如何发送电子邮件?
  • 编辑了答案。发送电子邮件的代码未经测试,但您应该明白这一点。基本上,它会在电子邮件正文中打印错误列表,打印日志的位置,并附上日志。
【解决方案2】:

这篇简洁的文章提供了简单的 SAS 代码,展示了如何检查错误并在错误条件下发送电子邮件。正如 Rob 已经提到的,您应该在每个过程之后检查错误代码。

https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/

此代码不发送日志,但您可以通过定义一个带有简短描述的宏变量(如“查询 SQL 数据库失败”)来发送一般错误。在我们的组织中,我们在批处理作业中运行大约 50-100 (?) 个 SAS 程序,并且我们使用日期标记保存每个日志,例如 2012-03-05 13:05 daily job.log

【讨论】:

    猜你喜欢
    • 2015-04-16
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多