Ok, here's some rough code I drafted that works in my environment. Main thing is to add a value for your log path. If you're going to scrape batch logs too, then you'll need to comment out the end of the first DATA step (i.e. IF FIND(LOG,'Workspace')). I'm running in Linux environment so I think this should all be compatible. You may also want to gather other metrics, but this is basically just looking at lines in the logs where it says how many observations were read from a table, and then getting the number of records read and then library/table from which they were read. ODS LISTING CLOSE;
ODS RESULTS OFF;
/*Enter your logs path here*/
%let LogsPath=/*Enter your logs path here. Example: /sas/config/compute/Lev1/Logs */;
/*Enter a temporary location and file name to which you can copy each log file when attempting to parse*/
%LET TempLogLoc= /tmp/WorkspaceLog.log;
/*Get listing of all workspace logs*/
FILENAME XCMD PIPE "ls -l &LogsPath.";
/*Create dataset of output from X command*/
DATA LOGS;
INFILE XCMD DSD TRUNCOVER;
LENGTH TEXT LOG FILEPATH $512.;
INPUT @1 TEXT;
LOG = SCAN(TEXT,-1,' ');
FILEPATH = "&LogsPath./"||STRIP(LOG);
/*Ensuring that only root directory is included in output*/
OWNER = SCAN(TEXT,3,' ');
GROUP = SCAN(TEXT,4,' ');
IF FIND(LOG,'Workspace');
DROP TEXT;
RUN;
PROC SQL NOPRINT;
SELECT COUNT(*) INTO: LOG_COUNT
FROM LOGS;
QUIT;
PROC SQL;
DROP TABLE LIB_DATA_FINAL;
QUIT;
%MACRO ReadLogs;
%DO I=1 %TO &LOG_COUNT.;
DATA _NULL_;
SET LOGS;
IF _N_ = &I. THEN DO;
CALL SYMPUTX('LOG',FILEPATH);
CALL SYMPUTX('USER',OWNER);
CALL SYMPUTX('GROUP',GROUP);
END;
RUN;
/*Creating temporary copy of log file to avoid write-locks*/
%SYSEXEC cp &LOG. &TempLogLoc.;
DATA WORKSPACE_LOGS;
LENGTH LOG $512. USER GROUP $12. ;
LOG = "&LOG.";
USER = "&USER.";
GROUP = "&GROUP.";
RUN;
DATA WORK.LIB_DATA;
INFILE "&TempLogLoc" TRUNCOVER DLM='~';
LENGTH TEXT LOG $512.
TABLE $32. RECORDS 8.;
INPUT @1 TEXT;
LOG = "&LOG.";
IF FIND(TEXT,'observations read') THEN DO;
TABLE=SCAN(TEXT,-1,' ');
RECORDS=INPUT(SCAN(TEXT,-8,' '),BEST12.);
RETAIN TABLE RECORDS;
OUTPUT;
END;
/*
IF FIND(TEXT,'created, with') THEN DO;
LIBREF=SCAN(TEXT,-8,' ');
RECORDS=INPUT(SCAN(TEXT,-5,' '),BEST12.);
RETAIN LIBREF RECORDS;
OUTPUT;
END;
*/
KEEP /*TEXT LOG*/ TABLE RECORDS;
RUN;
PROC APPEND DATA=WORK.LIB_DATA BASE=LIB_DATA_FINAL FORCE;
RUN;
%END;
/*Removing temporary log file*/
%SYSEXEC rm /gsasadm/Logs/WorkspaceLog.log;
%MEND;
%ReadLogs;
... View more