【问题标题】:Exporting the SAS Project Log file导出 SAS 项目日志文件
【发布时间】:2021-04-15 09:49:14
【问题描述】:

我曾经每天运行 3 个 SAS EG 项目。几天后,我们有了一个“SAS 调度程序”,它基本上在夜间运行后者(第一个在 00:00 AM,第二个在 01:00 AM,第三个在 03:00 AM)。每个 SAS 项目都有多个 SAS 程序。

总而言之,这是个好消息,但这也意味着我不能再直接查看日志了。

为了跟踪夜间工作,我正在尝试找出为每个项目导出日志文件的最佳方式。我最近发现了 SAS 项目日志,它基本上总结了 SAS 项目中所有程序的日志。

我在 SAS 社区论坛上发现了 CaseySmith 的答案,基本上调整了 .vbs 脚本以使用以下代码将 SAS 项目日志文件保存为 .txt:

Set objProjectLog = objProject.ProjectLog
objProjectLog.Clear()

objProjectLog.Enabled = True
'strProjectLog = objProjectLog.Text
objProjectLog.SaveAs "c:\temp\projectLog.txt"

但是,1) 它是一个 .txt 文件而不是日志文件,并且 2) 我不知道在我当前的 .vbs 脚本中添加它的位置:

Option Explicit
Dim app

Call dowork

'shut down the app
If not (app Is Nothing) Then
    app.Quit
    Set app = Nothing
End If


Sub dowork()
    On Error Resume Next
    '----
    ' Start up Enterprise Guide using the project name
    '----
    Dim prjName
    Dim prjObject

    prjName = "C:\Users\kermit\Desktop\Project.egp"    'Project Name
      
    Set app = CreateObject("SASEGObjectModel.Application.8.1")
    If Checkerror("CreateObject") = True Then
        Exit Sub
    End If
    
    '-----
    ' open the project
    '-----
    Set prjObject = app.Open(prjName,"")
    If Checkerror("app.Open") = True Then
        Exit Sub
    End If
    
        
    '-----
    ' run the project
    '-----
    prjObject.run
    If Checkerror("Project.run") = True Then
        Exit Sub
    End If
    
            
    '-----
    ' Save the new project
    '-----
    prjObject.Save
    If Checkerror("Project.Save") = True Then
        Exit Sub
    End If
    
    '-----
    ' Close the project
    '-----
    prjObject.Close
    If Checkerror("Project.Close") = True Then
        Exit Sub
    End If
       
End Sub

Function Checkerror(fnName)
    Checkerror = False
    
    Dim strmsg
    Dim errNum
    
    If Err.Number <> 0 Then
        strmsg = "Error #" & Hex(Err.Number) & vbCrLf & "In Function " & fnName & vbCrLf & Err.Description
        'MsgBox strmsg  'Uncomment this line if you want to be notified via MessageBox of Errors in the script.
        Checkerror = True
    End If
         
End Function

最后,我希望在早上运行一个程序,扫描 3 个项目日志文件中的注释、警告和错误,然后向自己发送一封包含结果的电子邮件。因此,有没有办法将 SAS 项目日志(而不是手动)导出到文件夹中?

【问题讨论】:

  • 带有程序输出的文本文件是日志文件。如果您想更轻松地跟踪它们,可以为其添加 .log 扩展名。
  • 我不知道 VBS 代码在做什么,但从 cmets 你可能想把它放在 RUN 和 SAVE 之间。除了将文件扩展名从 .txt 更改为 .log 之外,您可能还希望在文件名中包含一个时间戳,这样您就可以为同一个项目拥有多个日志。
  • @Tom .vbs 代码是您在 SAS EG 中安排作业时创建的。我想要的是将 SAS 项目日志文件输出到外部文件夹,以便在第二天早上扫描它以查找潜在的警告/错误。

标签: vbscript sas monitoring


【解决方案1】:

那么,首先,这段代码在做什么?

Set objProjectLog = objProject.ProjectLog
objProjectLog.Clear()

这会清除项目日志。这需要在您的项目运行之前完成 - 否则日志包含过去运行的数据。所以把它放在 prjOBject.Run() 之前。

objProjectLog.Enabled = True
'strProjectLog = objProjectLog.Text
objProjectLog.SaveAs "c:\temp\projectLog.txt"

然后将项目日志导出到文本文件。您当然可以随意调用该文本文件。您需要此代码出现在您的程序运行之后,以及在它关闭之前的某个位置。在 PrjObject.Run() 之后可能没问题。

您需要更新名称以匹配您的 vbs 文件的名称 - 它们使用 objproject 而您的 vbs 使用 prjObject,但它们是相同的,只需匹配名称即可。

第二 - 你还能做什么?如果您不喜欢 VBS,那么您还有很多其他方法可以做到这一点。

  • 将您的 EG 项目导出为 .sas 文件,然后使用正常输出选项在基本 SAS 中安排此文件。这也可以通过调度界面实现。
  • 使用 PROC PRINTTO 在 SAS 代码中重定向日志。
  • 将您的 EG 项目复制到您可以看到的位置。 EG 项目确实包含所有运行的日志 - 所以你没有理由不能打开 .egp 并查看它,只要确保你没有对生产文件执行此操作,因为你可能会忘记关闭出去。

我的偏好不是安排 EG 项目,而是安排 .sas 程序;使用EG作为开发环境,然后导出为.sas。这为您提供了更大的灵活性。但是有很多不同的方法可以给这只猫剥皮。

【讨论】:

  • 我一直在使用生成的 VBS 代码安排 EG 程序的环境中。 VBS 代码运行良好,并且能够直观地看到您的流程连接在一起并能够一眼识别出失败的精确程序,这当然是值得一提的。但它也有缺点,不如调用 sas 可执行文件灵活。添加诸如 SAS 调用选项之类的东西更加困难,而且非常大的流程变得很麻烦。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多