在SAS中跟踪失败的作业

时间:2019-12-20 20:06:58

标签: sas

我正在寻找一种改进的方式来跟踪使用SAS从多个数据库中收集信息的服务器,这里的挑战在于,这是公司使用一段时间的那些服务器之一,没有任何治理,文件夹无处不在,没有实际的文件夹结构,任何人都在做他们喜欢的事情。你知道练习。

我现在发现的选项是在失败的作业上放置一个宏,该宏将跟踪日志,如果发现错误,则应该向通讯组列表发送电子邮件。

但是这种解决方案不是一个很好的软件体系结构,每次在crontab中安排一个新作业时,我都需要在该宏上拍一下宏,如果事情移到另一个目录,它就会停止工作,所有这些,很多手工工作接连不断。

我正在寻找的解决方案是找到可以从目录列表中读取所有日志的东西(这将是当时所需的最大手动更新,但仅此而已,并且仅因为我没有授权以移动文件夹),提取有错误的文件夹并将其输出到网页,因此我们只能检查该网页。了解集中信息(计划时间,上次运行时间等)。

有没有机会在此提出任何建议呢?我想到了运行一个SAS脚本来输出一个我可以在某个地方获取的txt文件,然后用Javascript在网页上阅读该文件的方法,但是在如何操作上遇到了一些困难。遍历所有文件夹,并且由于这种脚本语言没有落下,为此真的感觉很棒。但是我暂时没有想法。建议?

1 个答案:

答案 0 :(得分:0)

如果您正在使用节点服务器端来交付Web内容,则可以编写一个功能,该功能可以扫描控制文件中列出的文件夹以查找包含ERROR:消息的日志文件并进行报告。

例如:

日志folder.txt (控制文件)

d:\temp\logs\job-1
d:\temp\logs\tuesday jobs
d:\jobs\wednesday\job set 1
d:\jobs\wednesday\job set 2\prod

节点应用(测试版)

const express = require('express');

const app = express();
const port = 8081;

app
  .get('/sas/logs/errors', (req, res) => {
    res.setHeader('Content-Type', 'text/html');
    processFolders(res);
    res.end();
  })
;

app.listen(port, () => console.log(`Listening on port ${port}`));

const fs = require('fs');
const readline = require('readline');
const path = require('path');

const listOfFoldersFile = 'log folders.txt';

function processFolders(res) {
  var level1Count = 0;
  var level2Count = 0;
  var level3Count = 0;

  var content;

  try {
    content = fs.readFileSync(listOfFoldersFile, 'UTF-8');
  }
  catch (err) {
    console.log(err.toString());
    res.write('<p>Configuration error in processFolders.</p>');
    return;
  }

  const folders = content.split(/\r?\n/);

  for (let folder of folders) {
    scanForLogs(folder);
  }

  if (level1Count == 0) {
    res.write('<p>No error messages found in SAS logs.</p>');
    return;
  }

  return;

  function scanForLogs(folder) {
    //console.log(`scan folder  ${folder}`);

    var logfiles;

    try {
      logfiles = fs.readdirSync (folder).filter(filename => filename.match(/\.log$/));
    }
    catch (err) {
      console.log(err.toString());
      res.write('<p>Problem scanning a log folder.</p>');
      return;
    }

    level2Count = 0;

    for (let logfile of logfiles) {
      parseSASLog(folder, logfile);
    }
  }

  function parseSASLog(folder, filename) {
    //console.log(`parse log    ${path.join(folder,filename)}`);

    var content;

    try {
      content = fs.readFileSync(path.join(folder,filename), 'UTF-8');
    }
    catch (err) {
      console.log(err.toString());
      res.write(`<p>Problem reading file ${filename}</p>`);
      return;
    }

    const lines = content.split(/\r?\n/);

    level3Count = 0;

    var linenum = 0;
    for (const line of lines) {
      linenum++;
      if (line.match (/^ERROR:/)) {
        reportErrorMessage(folder, filename, line, linenum);
      }
    }

    if (level3Count) {
      res.write('</pre>');
    }
  }

  function reportErrorMessage(folder, filename, line, linenum) {
    //console.log(`reportErrorMessage`);

    level1Count++;
    level2Count++;
    level3Count++;

    if (level1Count == 1) {
      res.write('<h1>SAS errors</h1>');
    }

    if (level2Count == 1) {
      res.write(`<h2>folder: ${folder}<h2>`);
    }

    if (level3Count ==1) {
      res.write(`<h3>file: ${filename}</h3><pre>`);
    }

    res.write(`${linenum}: ${line}\n`);
  }
}

报告的错误(示例)

enter image description here

其他方法可能包括

  • 异步服务器端扫描通过signalR将输出分段发送到客户端
  • 将错误报告作为json数据提供,供客户端用来呈现报告