So here’s a fun situation. An interface that works perfectly in the test environment but which randomly falls over in production. Better still, it’s part of the overnight batch processing so it tends to fall over at around 9:30 in the evening.
I need to be able to determine what the program is doing when it fails, specifically, in this case, what the data being processed looks like, but I don’t want to stay up half the night in order to do so.
Fortunately, there’s Qp0zLprintf (Print Formatted Job Log Data).
The Qp0zLprintf() function prints user data specified by format-string as an information message type to the job log.
If a second parameter, argument-list, is provided, Qp0zLprintf() converts each entry in the argument-list and writes the entry to the job log according to the corresponding format specification in format-string. If there are more entries in argument-list than format specifications in format-string, the extra argument-list entries are evaluated and then ignored. If there are less entries in argument-list than format specifications in format-string, the job log output for those entries is
undefined, and the Qp0zLprintf() function may return an error.
What this means, is that I can write out to the joblog at various points within the program so that I can pinpoint exactly what the program was doing and what data was being processed when it failed.
So here’s a simplified sample of what I mean
**Free // Simple program to demonstrate writing to the job log // Written by Paul Pritchard ctl-opt dftactgrp(*no) actgrp(*new) main(Main); dcl-pr WriteJobLog int(10) extproc('Qp0zLprintf'); *n pointer value options(*string); end-pr; dcl-proc Main; dcl-pi *n end-pi; dcl-s Message varchar(512); dcl-c CRLF x'0d25'; // The easy way to put a message in the joblog // Is to construct the text, then print it Message = 'Hello World' + CRLF; WriteJobLog(Message); // And exit return; end-proc;
That CRLF is the hex codes for Carriage Return and Line Feed. You need to ensure that it’s tacked onto the end of each message to ensure the messages all remain readably laid out.
And this is what the output looks like
*NONE Information 17-10-11 14:36:17.490255 QP0ZCPA QSYS *STMT QP0ZCPA QSYS *STMT From module . . . . . . . . : QP0ZUDBG From procedure . . . . . . : Qp0zVLprintf Statement . . . . . . . . . : 64 To module . . . . . . . . . : QP0ZUDBG To procedure . . . . . . . : Qp0zVLprintf Statement . . . . . . . . . : 64 Message . . . . : Hello World
Hi Paul. How do I log to be printed?
The job log is a job log, so when the job ends you should have a spool file.
If the job log is not being generated, you need to look at the parameters when the job is submitted.