在SAS中跟踪失败的作业
我希望改进跟踪使用SAS从多个数据库收集信息的服务器的方法,这里的挑战是,这是一家公司在没有任何治理的情况下使用了一段时间的服务器之一,到处都是文件夹,没有实际的文件夹结构,任何人都可以随心所欲地使用它。你知道该怎么做 我现在找到的选项是在失败的作业上放置一个宏来跟踪日志,如果它发现错误,那么它应该向通讯组列表发送一封电子邮件 但是这个解决方案不是一个很好的软件体系结构,每次在crontab中安排一个新的作业时,我都需要在那里拍打宏,如果这些东西移动到另一个目录,它就会停止工作,所有这些,大量的手工工作就会层叠而下 我正在寻找的一个解决方案是找到可以从目录列表中读取所有日志的东西(这将是它当时需要的最大的手动更新,但仅此而已,而且因为我没有移动文件夹的权限),获取有错误的日志,并将其输出到网页,因此,我们只能检查该网页。了解集中化信息(计划时间、上次运行时间等)在SAS中跟踪失败的作业,sas,Sas,我希望改进跟踪使用SAS从多个数据库收集信息的服务器的方法,这里的挑战是,这是一家公司在没有任何治理的情况下使用了一段时间的服务器之一,到处都是文件夹,没有实际的文件夹结构,任何人都可以随心所欲地使用它。你知道该怎么做 我现在找到的选项是在失败的作业上放置一个宏来跟踪日志,如果它发现错误,那么它应该向通讯组列表发送一封电子邮件 但是这个解决方案不是一个很好的软件体系结构,每次在crontab中安排一个新的作业时,我都需要在那里拍打宏,如果这些东西移动到另一个目录,它就会停止工作,所有这些,大量的
有没有人对如何做到这一点有什么建议?我曾想过运行一个
SAS
脚本,只输出一个txt
文件,我可以从某个地方获取该文件,然后在网页上用Javascript
读取该文件,但在如何循环遍历所有文件夹方面遇到了一些困难,而且因为这种脚本语言在这方面并不是很好。但我现在没有主意了。建议?如果您使用节点服务器端交付web内容,您可以编写一个函数,扫描控制文件中列出的文件夹,查找包含错误:
消息的日志文件,并报告这些消息
例如:
日志文件夹.txt(控制文件)
节点应用程序(测试版本)
const express=require('express');
常量app=express();
常数端口=8081;
应用程序
.get('/sas/logs/errors',(req,res)=>{
res.setHeader('Content-Type','text/html');
处理文件夹(res);
res.end();
})
;
app.listen(端口,()=>console.log(`Listening on port${port}');
常数fs=要求('fs');
const readline=require('readline');
const path=require('path');
const listOfFoldersFile='log folders.txt';
函数processFolders(res){
var level1计数=0;
var level2Count=0;
var level3Count=0;
var含量;
试一试{
content=fs.readFileSync(listOfFoldersFile,'UTF-8');
}
捕捉(错误){
log(err.toString());
res.write(“进程文件夹中的配置错误。”);
返回;
}
const folders=content.split(/\r?\n/);
用于(让文件夹成为文件夹中的文件夹){
扫描日志(文件夹);
}
如果(level1Count==0){
res.write(“在SAS日志中未找到错误消息。”);
返回;
}
返回;
函数scanForLogs(文件夹){
//log(`scan folder${folder}`);
var日志文件;
试一试{
logfiles=fs.readdirSync(folder.filter)(文件名=>filename.match(/\.log$/);
}
捕捉(错误){
log(err.toString());
res.write(“扫描日志文件夹时出现问题。”);
返回;
}
level2Count=0;
for(让日志文件成为日志文件的一部分){
parseSASLog(文件夹、日志文件);
}
}
函数parseSASLog(文件夹,文件名){
//log(`parse log${path.join(文件夹,文件名)}`);
var含量;
试一试{
content=fs.readFileSync(path.join(文件夹,文件名),'UTF-8');
}
捕捉(错误){
log(err.toString());
res.write(`读取文件${filename}时出现问题`);
返回;
}
常量行=content.split(/\r?\n/);
level3Count=0;
var-linenum=0;
用于(行的常量行){
linenum++;
if(line.match(/^ERROR:/)){
reportErrorMessage(文件夹、文件名、行、行数);
}
}
如果(3级计数){
res.write(“”);
}
}
函数reportErrorMessage(文件夹、文件名、行、行数){
//log(`reportErrorMessage`);
level1Count++;
level2Count++;
level3Count++;
如果(level1Count==1){
res.write(“SAS错误”);
}
如果(level2Count==1){
res.write(`folder:${folder}`);
}
如果(level3Count==1){
res.write(`file:${filename}`);
}
res.write(`${linenum}:${line}\n`);
}
}
报告的错误(示例)
其他办法可包括:
- 异步服务器端扫描通过信号器将输出分段传送到客户端
- 将错误报告作为json数据交付,客户端使用json数据呈现报告
.log
的所有文件?是否尝试使用find
命令?是否使用Node?客户端JavaScript将无法读取服务器端日志文件。您提到了crontab,所以我怀疑Linux/Unix,您可以使用计划间歇运行的服务器端脚本(如bash shell),或者设置为“观察者”,处理新的或更新的日志文件以查找错误。。我知道日志在哪里,@Tom。@Richard,是的,正在开发中,我要寻找的是另一种读取服务器上文件的方法。我将把所有这些脚本的反馈集中在一个文件中,我的愿望是将输出获取到前端。对于该节点,正确的方法是什么?
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`);
}
}