2013-03-20 74 views
1

试图在日志文件中创建包含日志文件名和对应错误的数据集,其中包含'ERROR:' .Log文件位于UNIX上,我想要访问SAS上的该unix路径并搜索'ERROR:'字符串并创建一个包含日志文件名和错误的数据集。 我没有线索如何实现....任何帮助?如何在SAS文件夹中的每个日志文件中检查'ERROR:'?日志文件在UNIX上

在此先感谢, 山姆。

这是我正在寻找的一个例子。假设我在UNIX上的/ tcrsk/dev/Logs文件夹下有a.log,b.log,c.log,... n.log文件。尝试对于一个程序,循环通过所有的日志文件,并创建一个数据集与这样的2个变量LOg_Name ERROR_Message a.log ERROR:Missing b.log ERROR:No data set c.log ERROR:A lock is not avialable我想这个例子给出了更多的细节....

+0

需要更多信息。 SAS是unix还是windows?你如何正常访问unix位置? – Joe 2013-03-20 19:10:45

+0

@Joe,是的SAS在UNIX上运行。文件夹结构是/ tcrsk/dev/Logs .. – 2013-03-21 12:54:58

回答

3

不知道更多关于您的文件夹结构我不能评论问题的第一部分。一旦您的日志文件的名称已知,但您可以使用类似以下内容的名称。

下面的代码创建2个数据集。第一个就是完整的日志,日志中每行有一个观察值。第二个数据集只包含那些被识别为'错误'的行。请注意,我认为一定的警告和注意事项声明为错误,因为它们可能隐藏错别字或其它语法和语义问题的代码:

%let logfile = myfile.log; 

** 
** 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 =: "ERROR: A lock is not available for" 
    or line =: "ERROR: Errors printed on page" 
) 
    then do; 
    problem = 1; 
    output problems; 
    end; 
    output log; 
run; 
0
/*Creating a dat file with the list of .log files and ERROR: in their body*/  
X 'ls -1 /fbrms01/dev/Logs/*.log | xargs grep -l "ERROR:" 
               > /fbrms01/dev/Logs/log_error.dat'; 
    data log_list; **Accessing dat fil from UNIX and creating dataset on SAS; 
    infile '/fbrms01/dev/Logs/log_error.dat' dsd dlm='|' lrecl=1024; 
    input Lname :$75.; 
    run; 
    options symbolgen mprint mlogic; 
    %macro logfile(DS); 
    %let dsid = %sysfunc(open(&DS)); 
    /*%let obs = %sysfunc(attrn(&dsid,nobs));**To get number of observations in log_list;*/ 
    Proc datasets; 
    Delete All_Errors; 
    %do %while (%sysfunc(fetch(&dsid)) = 0);/*To run the loop thru log_list till the end of obs*/ 
    %let logfile = %sysfunc(getvarc(&dsid,1));/*To get value */ 
      data problems ; 
       length line $1000 logfile $100; 
       infile "&logfile"; 
       input; 
       logfile = "&logfile"; 
       line_no = _n_; 
       line = _infile_; 

       if line =: "ERROR:" then do; 
       output problems; 
       end; 
      run; 
      Proc Append Base=All_Errors data=Problems force; 
      Run; 
     %end; 
    %MEND; 
    %logfile(log_list); 

让我知道是否需要任何附加....谢谢,山姆。