iserieslog2json converts information from IBM iSeries (AS/400) log files to a JSON format that is more understandable and easy to process on most computers and systems. In this version it only works with audit and job logs. In the future, you will be able to work with more types of log files.
Check has the following dependencies:
- GCC (required)
- GNU Make (optional, can be compiled manually)
- Check (optional, for testing)
- Gcovr (optional, to generate code coverage reports)
- Valgrind (optional, to detect many memory-related errors)
On a GNU/Linux system you can build and install iserieslog2json with the usual sudo make install procedure.
~$ sudo make installThis way you will have the binary available in /usr/local/bin/iserieslog2json to run it from any directory on your computer.
To uninstall:
~$ sudo make uninstallIf you just want to compile the code and get a binary in the current directory you must run make build without sudo.
~$ make buildThe resulting iserieslog2json binary file can then be placed and run anywhere on your computer of your choice.
~$ ./iserieslog2json -h
USAGE
iserieslog2json [-f filename] [-t audit|job] [-l en|es] [-h] [-v]
DESCRIPTION
Converts information from IBM iSeries (AS/400) log files to a JSON format that
is more understandable and easy to process on most computers and systems.
OPTIONS
-f, --file Log file with input data.
-l, --language Logs language. In this version only the values "en" and "es"
are valid.
-t, --type Type log data. In this version only the values "audit" and
"job" are valid.
-v, --version Print the program version.
-h, --help Print this help.
LICENSE
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
For example:
~$ ./iserieslog2json -f AUDIT_HOSTNAME_YYYYMMDD.txt -t audit -l enor
~$ ./iserieslog2json -f JOB_HOSTNAME_YYYYMMDD.txt -t job -l en QUERY NAME . . QSECCD
LIBRARY NAME . . QSYS
FILE LIBRARY MEMBER FORMAT
QASYCDJ4 QTEMP QASYCDJ4 QASYCDJ4
DATE . . . . . . . 14/04/20
TIME . . . . . . . 01:03:07
14/04/20 01:03:07 PAGE 1
ENTRY USER OBJECT LIBRARY PROG JOB JOB JOB INDICATION
TYPE PROFILE NAME NAME CL NAME USER NUMBER HOUR
SERIAL
COMMAND
CD C MIMIXOWN CHKOBJ QSYS E RCV_RUNCMD MIMIXOWN 481053 2020-04-14-00.00.00.045045
CHKOBJ OBJ(MIMIX/H1SPCLVL) OBJTYPE(*DTAARA)
CD C MIMIXOWN CHKOBJ QSYS E RCV_RUNCMD MIMIXOWN 481053 2020-04-14-00.00.00.045637
CHKOBJ OBJ(MIMIX/HTSPCLVL) OBJTYPE(*DTAARA)
CD C MIMIXOWN CALL QSYS E RCV_RUNCMD MIMIXOWN 481053 2020-04-14-00.00.00.104765
CALL PGM(MXTHRUPUT) PARM('SOURCE')
...
...
Several million lines ...
...
...
CD X QSECOFR QSH QSYS B BFI_HW QSECOFR 481054 2020-04-14-00.00.00.113517
CD C QBRMS PING QSYS E QBRMSYNC QBRMS 481054 2020-04-14-00.00.00.115229
QSYS/PING RMTSYS(BRMSG5) MSGMODE(*QUIET *ESCAPE) NBRPKT(1)
CD C IOPTOWNER CHGDTARA QSYS Y IDDIRPRC IOPTOWNER 481339 2020-04-14-00.00.00.692237
CD C IOPTOWNER RCLRSC QSYS Y IDDIRPRC IOPTOWNER 481339 2020-04-14-00.00.00.692317
CD C IOPTOWNER SETAPGRP QSYS E IDDIRPRC IOPTOWNER 481339 2020-04-14-00.00.00.704525
SETASPGRP ASPGRP(*NONE)
CD C ADMSSRA1 CHKOBJ QSYS E RMTSYSTEM CNDINST 481347 2020-04-14-00.00.00.813819
CHKOBJ OBJ(CDUQ886459) OBJTYPE(*USRQ)
CD C MDOWNER DLYJOB QSYS Y MDPUSH1 MDOWNER 481357 2020-04-14-00.00.00.951833
DLYJOB DLY(5)
* * * E N D O F R E P O R T * * *
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "C", "userProfile": "MIMIXOWN", "objectName": "CHKOBJ", "libraryName": "QSYS", "progCL": "E", "jobName": "RCV_RUNCMD", "jobUser": "MIMIXOWN", "jobNumber": "481053", "dateTime": "2020-04-14-00.00.00.045045", "commandLine": " CHKOBJ OBJ(MIMIX/H1SPCLVL) OBJTYPE(*DTAARA)", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "C", "userProfile": "MIMIXOWN", "objectName": "CHKOBJ", "libraryName": "QSYS", "progCL": "E", "jobName": "RCV_RUNCMD", "jobUser": "MIMIXOWN", "jobNumber": "481053", "dateTime": "2020-04-14-00.00.00.045637", "commandLine": " CHKOBJ OBJ(MIMIX/HTSPCLVL) OBJTYPE(*DTAARA)", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "C", "userProfile": "MIMIXOWN", "objectName": "CALL", "libraryName": "QSYS", "progCL": "E", "jobName": "RCV_RUNCMD", "jobUser": "MIMIXOWN", "jobNumber": "481053", "dateTime": "2020-04-14-00.00.00.104765", "commandLine": " CALL PGM(MXTHRUPUT) PARM('SOURCE')", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "X", "userProfile": "QSECOFR", "objectName": "QSH", "libraryName": "QSYS", "progCL": "B", "jobName": "BFI_HW", "jobUser": "QSECOFR", "jobNumber": "481054", "dateTime": "2020-04-14-00.00.00.113517", "commandLine": "", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "C", "userProfile": "QBRMS", "objectName": "PING", "libraryName": "QSYS", "progCL": "E", "jobName": "QBRMSYNC", "jobUser": "QBRMS", "jobNumber": "481054", "dateTime": "2020-04-14-00.00.00.115229", "commandLine": " QSYS/PING RMTSYS(BRMSG5) MSGMODE(*QUIET *ESCAPE) NBRPKT(1)", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "C", "userProfile": "IOPTOWNER", "objectName": "CHGDTARA", "libraryName": "QSYS", "progCL": "Y", "jobName": "IDDIRPRC", "jobUser": "IOPTOWNER", "jobNumber": "481339", "dateTime": "2020-04-14-00.00.00.692237", "commandLine": "", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "C", "userProfile": "IOPTOWNER", "objectName": "RCLRSC", "libraryName": "QSYS", "progCL": "Y", "jobName": "IDDIRPRC", "jobUser": "IOPTOWNER", "jobNumber": "481339", "dateTime": "2020-04-14-00.00.00.692317", "commandLine": "", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "C", "userProfile": "IOPTOWNER", "objectName": "SETAPGRP", "libraryName": "QSYS", "progCL": "E", "jobName": "IDDIRPRC", "jobUser": "IOPTOWNER", "jobNumber": "481339", "dateTime": "2020-04-14-00.00.00.704525", "commandLine": " SETASPGRP ASPGRP(*NONE)", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "C", "userProfile": "ADMSSRA1", "objectName": "CHKOBJ", "libraryName": "QSYS", "progCL": "E", "jobName": "RMTSYSTEM", "jobUser": "CNDINST", "jobNumber": "886460", "dateTime": "2020-10-28-23.59.57.624928", "commandLine": " CHKOBJ OBJ(CDUQ886459) OBJTYPE(*USRQ)", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}
{"headerQueryName": "QSECCD", "headerLibraryName": "QSYS", "headerFile": "QASYCDJ4", "headerLibrary": "QTEMP", "headerMember": "QASYCDJ4", "headerFormat": "QASYCDJ4", "headerDate": "14/04/20", "headerTime": "01:03:07", "typeInput": "CD", "mode": "C", "userProfile": "MDOWNER", "objectName": "DLYJOB", "libraryName": "QSYS", "progCL": "Y", "jobName": "MDPUSH1", "jobUser": "MDOWNER", "jobNumber": "674561", "dateTime": "2020-10-28-23.59.59.052944", "commandLine": " DLYJOB DLY(5)", "fileName": "AUDIT_HOSTNAME_YYYYMMDD.txt", "serverName": "HOSTNAME"}Where serverName field is substring HOSTNAME from AUDIT_HOSTNAME_YYYYMMDD.txt file.
To testing use Check, a unit testing framework for C. To run a test suite you can run make test as follows:
~$ make testThis program uses gcovr in conjunction with GCC to generate code coverage reports. To install it:
~$ sudo apt-get update
~$ sudo apt-get install gcovrTo generate HTML code coverage reports:
~$ make coverage_report.htmlThis make option will first execute the tests and finally generate the code coverage report in HTML format. You can find it in the current directory as *.html files.
The Valgrind tool suite provides a number of debugging and profiling tools that help you make your programs faster and more correct. The most popular of these tools is called Memcheck. It can detect many memory-related errors that are common in C and C++ programs and that can lead to crashes and unpredictable behaviour.
~$ make valgrind FILE=AUDIT_HOSTNAME_YYYYMMDD.txt TYPE=auditIf everything is ok the output is:
==27052== All heap blocks were freed -- no leaks are possible
==27052==
==27052== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==27052== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
If you have questions, please email inquiries to JavDomGom@protonmail.com.
If you don't understand the documentation, please tell us, so we can explain it better. The general idea is: if you need to ask for help, then something needs to be fixed so you (and others) don't need to ask for help. Asking questions helps us to know what needs to be documented, described, and/or fixed.
