Annotation of 43BSDReno/contrib/isode-beta/doc/manual/logging.tex, revision 1.1.1.1

1.1       root        1: % run this through LaTeX with the appropriate wrapper
                      2: 
                      3: \chapter      {The ISODE Logging Facility}\label{logging}
                      4: Although not a database mechanisms, per se, the ISODE logging facility 
                      5: is used to manipulate general logs:
                      6: used by both the ISODE and programs which use the ISODE.
                      7: 
                      8: \subsection    {Data-Structures}
                      9: There is one primary data-structure, the \verb"LLog":
                     10: \begin{quote}\index{LLog}\small\begin{verbatim}
                     11: typedef struct  ll_struct {
                     12:     char   *ll_file;
                     13: 
                     14:     char   *ll_hdr;
                     15:     char   *ll_dhdr;
                     16: 
                     17:     int            ll_events;
                     18: #define        LLOG_NONE       0
                     19: #define        LLOG_FATAL      0x01
                     20: #define        LLOG_EXCEPTIONS 0x02
                     21: #define        LLOG_NOTICE     0x04
                     22: #define        LLOG_PDUS       0x08
                     23: #define        LLOG_TRACE      0x10
                     24: #define        LLOG_DEBUG      0x20
                     25: #define        LLOG_ALL        0xff
                     26: #define        LLOG_MASK \
                     27:     "\020\01FATAL\02EXCEPTIONS\03NOTICE\04PDUS\05TRACE\06DEBUG"
                     28: 
                     29:     int            ll_syslog;
                     30: 
                     31:     int     ll_msize;
                     32: 
                     33:     int     ll_stat;
                     34: #define        LLOGNIL         0x00
                     35: #define        LLOGCLS         0x01
                     36: #define        LLOGCRT         0x02
                     37: #define        LLOGZER         0x04
                     38: #define        LLOGERR         0x08
                     39: #define        LLOGTTY         0x10
                     40: #define        LLOGHDR         0x20
                     41: #define        LLOGDHR         0x40
                     42: 
                     43:     int     ll_fd;
                     44: } LLog;
                     45: \end{verbatim}\end{quote}
                     46: The elements of this structure are:
                     47: \begin{describe}
                     48: \item[\verb"ll\_file":] the name of the file to use for the log,
                     49: unless an absolute pathname (e.g., \file{/usr/tmp/logfile})
                     50: or an anchored pathname (e.g., \file{./logfile}),
                     51: the name is interpreted relative to the the \verb"logpath" directory
                     52: in the ISODE tailoring file (see Chapter~\ref{isotailor});
                     53: 
                     54: \item[\verb"ll\_hdr":] the logging header which
                     55: is usually set by one of the utility routines described below;
                     56: 
                     57: \item[\verb"ll\_hdr"/\verb"ll\_dhdr":] the so-called dynamic header;
                     58: 
                     59: \item[\verb"ll\_events"/\verb"ll\_syslog":] a bitmask describing the logging
                     60: events which are interesting to this log, any combination of:
                     61: \[\begin{tabular}{|l|l|}
                     62: \hline
                     63:     \multicolumn{1}{|c|}{\bf Value}&
                     64:                \multicolumn{1}{c|}{\bf Meaning}\\
                     65: \hline
                     66:     \tt LLOG\_FATAL&           fatal errors\\
                     67:     \tt LLOG\_EXCEPTIONS&      exceptional events\\
                     68:     \tt LLOG\_NOTICE&          informational notices\\
                     69:     \tt LLOG\_PDUS&            PDU printing\\
                     70:     \tt LLOG\_TRACE&           program tracing\\
                     71:     \tt LLOG\_DEBUG&           full debugging\\
                     72: \hline
                     73: \end{tabular}\]
                     74: In addition, the values \verb"LLOG_NONE" by itself refers to no events
                     75: and \verb"LLOG_ALL" refers to all events being of interest.
                     76: For those systems with a \man syslog(3) routine,
                     77: the \verb"ll_syslog" element indicates if the event should be given to 
                     78: \man syslog(8) as well;
                     79: 
                     80: \item[\verb"ll\_msize":] the maximum size of the log, in units of Kbytes
                     81: (a non-positive number indicates no limit);
                     82: 
                     83: \item[\verb"ll\_stat":] assorted switches, any combination of:
                     84: \[\begin{tabular}{|l|l|}
                     85: \hline
                     86:     \multicolumn{1}{|c|}{\bf Value}&
                     87:        \multicolumn{1}{c|}{\bf Meaning}\\
                     88: \hline
                     89:     \tt LOGCLS&                keep log closed, except when writing\\
                     90:     \tt LOGCRT&                create log if necessary\\
                     91:     \tt LOGZER&                truncate log when limits reached\\
                     92:     \tt LOGERR&                log closed due to (soft) error\\
                     93:     \tt LOGTTY&                also log to stderr\\
                     94:     \tt LOGHDR&                static header allocated\\
                     95:     \tt LOGDHR&                dynamic header allcoated\\
                     96: \hline
                     97: \end{tabular}\]
                     98: 
                     99: \item[\verb"ll\_fd":] the file-descriptor corresponding to the log.
                    100: \end{describe}
                    101: 
                    102: \section      {Accessing the Log}
                    103: Typically,
                    104: logs are not opened or closed directly~---~when an entry is made to a log,
                    105: the log is opened (if necessary), the entry is written, and (usually) the log
                    106: is then closed.
                    107: 
                    108: To open a log associated with a \verb"LLog" structure,
                    109: the routine \verb"ll_open" is used:
                    110: \begin{quote}\index{ll\_open}\small\begin{verbatim}
                    111: int     ll_open (lp)
                    112: LLog   *lp;
                    113: \end{verbatim}\end{quote}
                    114: The parameter to this routine is:
                    115: \begin{describe}
                    116: \item[\verb"lp":] a pointer to a \verb"LLog" structure.
                    117: \end{describe}
                    118: The \verb"ll_open" routine will open the log,
                    119: creating the corresponding file (if necessary).
                    120: Logs are created mode \verb"0666".
                    121: If the name of the file to use for the log is ``\verb"-"'',
                    122: then the \verb"LLOGTTY" option is enabled and no file is actually opened.
                    123: When determining the actual name of the file to use,
                    124: a ``\verb"%d"'' in the name will be replaced by the process-id of the program
                    125: opening the log.
                    126: On failure, the manifest constant \verb"NOTOK" is returned.
                    127: Otherwise, the log is opened
                    128: (and left open, regardless of the presence of the \verb"LLOGCLS" option),
                    129: and the manifest constant \verb"OK" is returned.
                    130: 
                    131: To close a log, the routine \verb"ll_close" is used:
                    132: \begin{quote}\index{ll\_close}\small\begin{verbatim}
                    133: int     ll_close (lp)
                    134: LLog   *lp;
                    135: \end{verbatim}\end{quote}
                    136: The parameter to this routine is:
                    137: \begin{describe}
                    138: \item[\verb"lp":] a pointer to a \verb"LLog" structure.
                    139: \end{describe}
                    140: This routine returns the manifest constant \verb"OK" on success
                    141: (even if the log was already closed),
                    142: or \verb"NOTOK" otherwise.
                    143: 
                    144: \subsection    {Timestamps}
                    145: One of the characteristics of a log is that it contains an informational
                    146: timestamp for each entry.
                    147: This timestamp contains the date and time of the log and also two ``header''
                    148: strings, a static header and a dynamic header.
                    149: Normally, these strings are constructed from the name of the program or
                    150: subsystem using the log.
                    151: The routine \verb"ll_hdinit" is used to initialize the static header:
                    152: \begin{quote}\index{ll\_hdinit}\small\begin{verbatim}
                    153: void   ll_hdinit (lp, prefix)
                    154: LLog   *lp;
                    155: char   *prefix;
                    156: \end{verbatim}\end{quote}
                    157: The parameters to this routine are:
                    158: \begin{describe}
                    159: \item[\verb"lp":] a pointer to a \verb"LLog" structure; and,
                    160: 
                    161: \item[\verb"prefix":] the name of the program or subsystem using the log.
                    162: \end{describe}
                    163: This routine will form a header consisting of the program name,
                    164: the process-id, and the user-name.
                    165: 
                    166: The routine \verb"ll_dbinit" is similar, but also enables debugging features:
                    167: \begin{quote}\index{ll\_dbinit}\small\begin{verbatim}
                    168: void   ll_dbinit (lp, prefix)
                    169: LLog   *lp;
                    170: char   *prefix;
                    171: \end{verbatim}\end{quote}
                    172: The parameters to this routine are:
                    173: \begin{describe}
                    174: \item[\verb"lp":] a pointer to a \verb"LLog" structure; and,
                    175: 
                    176: \item[\verb"prefix":] the name of the program or subsystem using the log.
                    177: \end{describe}
                    178: This routine will form a header identical to the one formed by
                    179: \verb"ll_hdinit".
                    180: It will then set the name of the file associated with the log to be relative
                    181: to the current working directory.
                    182: Finally, it turns on all event logging and logging to the user's terminal.
                    183: 
                    184: \subsection    {Making Log Entries}
                    185: At the lowest level, the \verb"ll_log" routine is used to append an entry to a
                    186: log: 
                    187: \begin{quote}\index{ll\_log}\small\begin{verbatim}
                    188: int     ll_log (lp, event, what, fmt, args ...)
                    189: LLog   *lp;
                    190: int     event;
                    191: char   *what,
                    192:        *fmt;
                    193: \end{verbatim}
                    194: \end{quote}
                    195: The parameters to this routine are:
                    196: \begin{describe}
                    197: \item[\verb"lp":] a pointer to a \verb"LLog" structure;
                    198: 
                    199: \item[\verb"event":] the event type being logged (e.g., \verb"LLOG_NOTICE");
                    200: 
                    201: \item[\verb"what":] some text associated with a system call error
                    202: (use the manifest constant \verb"NULLCP" if the entry is not associated with
                    203: an error in a system call); and,
                    204: 
                    205: \item[\verb"fmt"/\verb"args":] an argument list to \man printf(3s).
                    206: \end{describe}
                    207: The entry is only made if the log is enabled
                    208: (in the \verb"ll_events" field of the \verb"LLog" structure)
                    209: for the event listed as a parameter to \verb"ll_log".
                    210: If there was a problem in writing to the log,
                    211: \verb"ll_log" returns the manifest constant \verb"NOTOK".
                    212: Otherwise, \verb"OK" is returned.
                    213: 
                    214: The \verb"ll_log" routine is actually a simple wrapper around the
                    215: \verb"_ll_log" routine:
                    216: \begin{quote}\index{\_ll\_log}\small\begin{verbatim}
                    217: int     _ll_log (lp, event, ap)
                    218: LLog   *lp;
                    219: int     event;
                    220: va_list ap;
                    221: \end{verbatim}
                    222: \end{quote}
                    223: The parameters to this routine are:
                    224: \begin{describe}
                    225: \item[\verb"lp":] a pointer to a \verb"LLog" structure;
                    226: 
                    227: \item[\verb"event":] the event type being logged; and,
                    228: 
                    229: \item[\verb"ap":] an argument pointer to a variable-length argument list
                    230: as described in \man varargs(3).
                    231: \end{describe}
                    232: 
                    233: It may be necessary to have multi-line log entries.
                    234: In this case, the first line of the entry should be made with \verb"ll_log".
                    235: The remaining lines should be made with the \verb"ll_printf" routine:
                    236: \begin{quote}\index{ll\_printf}\small\begin{verbatim}
                    237: int     ll_printf (lp, fmt, args ...)
                    238: LLog   *lp;
                    239: char   *fmt;
                    240: \end{verbatim}
                    241: \end{quote}
                    242: The parameters to this routine are:
                    243: \begin{describe}
                    244: \item[\verb"lp":] a pointer to a \verb"LLog" structure; and,
                    245: 
                    246: \item[\verb"fmt"/\verb"args ...":] an argument list to \man printf(3s).
                    247: \end{describe}
                    248: As with \verb"ll_log", this routine returns either \verb"OK" on success or
                    249: \verb"NOTOK" on error.
                    250: Unlink \verb"ll_log" however,
                    251: \verb"ll_printf" will ignore the setting of the \verb"LLOGCLS" option).
                    252: As such, when the last line of a multi-line entry has been made,
                    253: the routine \verb"ll_sync" should always be called to synchronize the log:
                    254: \begin{quote}\index{ll\_sync}\small\begin{verbatim}
                    255: int     ll_sync (lp)
                    256: LLog   *lp;
                    257: \end{verbatim}
                    258: \end{quote}
                    259: The parameter to this routine is:
                    260: \begin{describe}
                    261: \item[\verb"lp":] a pointer to a \verb"LLog" structure.
                    262: \end{describe}
                    263: 
                    264: \subsection    {More About Making Log Entries}
                    265: Although the \verb"ll_log" routine has a basic functionality,
                    266: programmers often prefer a slightly simpler interface.
                    267: A few macros have been defined for this purpose.
                    268: 
                    269: The \verb"SLOG" macro is the most commonly used:
                    270: \begin{quote}\index{SLOG}\small\begin{verbatim}
                    271: SLOG (lp, event, what, args)
                    272: \end{verbatim}\end{quote}
                    273: The parameters to this macro are:
                    274: \begin{describe}
                    275: \item[\verb"lp":] a pointer to a \verb"LLog" structure;
                    276: 
                    277: \item[\verb"event":] the event type being logged;
                    278: 
                    279: \item[\verb"what":] some text associated with a system call error
                    280: (use the manifest constant \verb"NULLCP" if the entry is not associated with
                    281: an error in a system call); and,
                    282: 
                    283: \item[\verb"args":] a parenthesized argument list for \man printf(3s).
                    284: \end{describe}
                    285: The \verb"SLOG" macro compares the event enabled for a log to the event being
                    286: logged to see if \verb"ll_log" should be called.
                    287: 
                    288: Since, the need for a \verb"what" parameter is not common in many
                    289: applications,
                    290: the \verb"LLOG" macro has been supplied.
                    291: It is essentially the \verb"SLOG" macro but with a value of \verb"NULLCP"
                    292: supplied for the \verb"what" parameter of \verb"ll_log":
                    293: \begin{quote}\index{LLOG}\small\begin{verbatim}
                    294: LLOG (lp, what, args)
                    295: \end{verbatim}\end{quote}
                    296: 
                    297: Further,
                    298: even though logging is contingent on an event type being enabled,
                    299: a programmer may still wish that calls to logging package still be
                    300: conditionally compiled.
                    301: The \verb"DLOG" macro has been supplied for this purpose.
                    302: If the pre-processor symbol \verb"DEBUG" is defined,
                    303: then \verb"DLOG" is equivalent to \verb"LLOG" otherwise it compiles no code
                    304: whatsoever:
                    305: \begin{quote}\index{DLOG}\small\begin{verbatim}
                    306: DLOG (lp, what, args)
                    307: \end{verbatim}\end{quote}
                    308: 
                    309: Finally, it may be useful to log PDUs (protocol data units), again under
                    310: conditional compilation.
                    311: The \verb"PLOG" macro takes the address of a pretty-printer function generated
                    312: by \man pepy(1)
                    313: (see Section~\ref{pepy:pretty} on page~\pageref{pepy:pretty} in \volfour/)
                    314: along with a presentation element
                    315: (as described in Chapter~\ref{libpsap} in \volone/)
                    316: and a brief textual title, and directs the pretty-printer to output to the log:
                    317: \begin{quote}\index{PLOG}\small\begin{verbatim}
                    318: PLOG (lp, fnx, pe, text, rw)
                    319: \end{verbatim}\end{quote}
                    320: The \verb"rw" parameter is an integer saying wheter the PDU was read from the
                    321: network (non-zero) or written to the network (zero-valued).
                    322: As with the \verb"DLOG" macro,
                    323: if the \verb"DDEBUG" symbol is not defined,
                    324: then no code is generated.
                    325: 
                    326: \subsection    {Miscellaneous Routines}
                    327: In order to support some of the more esoteric log capabilities,
                    328: there are a few utility routines.
                    329: 
                    330: The routine \verb"ll_preset" evaluates a \man printf(3s) argument list
                    331: and returns a pointer to static buffer containing the result:
                    332: \begin{quote}\index{ll\_preset}\small\begin{verbatim}
                    333: char   *ll_preset (fmt, args ...)
                    334: char   *fmt;
                    335: \end{verbatim}
                    336: \end{quote}
                    337: 
                    338: The routine \verb"ll_check" determines if a log has exceeded its size,
                    339: and if so, if a correction can be made:
                    340: \begin{quote}\index{ll\_check}\small\begin{verbatim}
                    341: int     ll_check (lp)
                    342: LLog   *lp;
                    343: \end{verbatim}
                    344: \end{quote}
                    345: This routine returns \verb"OK" if the log is within its bounds.
                    346: 
                    347: \section      {Use of Logging in Programs}
                    348: From the perspective of applications programmers,
                    349: there are three kinds of styles for using the logging package,
                    350: depending on the kind of program being written.
                    351: 
                    352: In all three cases,
                    353: \verb"LLog" structures are usually declared statically in the main module of a
                    354: program and a pointer to the structure is made available for general use:
                    355: \begin{quote}\small\begin{verbatim}
                    356: static LLog _pgm_log = {
                    357:     "myname.log", NULLCP, NULLCP,
                    358:     LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE,
                    359:     -1,
                    360:     LLOGCLS | LLOGCRT | LLOGZER,
                    361:     NOTOK
                    362: };
                    363: 
                    364: LLog *pgm_log = &_pgm_log;
                    365: \end{verbatim}\end{quote}
                    366: Where the \verb"myname" in ``\verb"myname.log"'' is replaced with the name of
                    367: the program.
                    368: 
                    369: Note that in all cases,
                    370: in order to ensure consistent logging it is {\bf critical\/} that the call to
                    371: \verb"isodetailor" be the first call made to {\em any \/} of the ISODE
                    372: routines.
                    373: 
                    374: For static responders,
                    375: two routines are called in the initialization code:
                    376: \begin{quote}\small\begin{verbatim}
                    377: isodetailor (argv[0], 0);
                    378: ll_hdinit (pgm_log, argv[0]);
                    379: \end{verbatim}\end{quote}
                    380: Later on, after argument parsing, if a debug option is enabled, then
                    381: \begin{quote}\small\begin{verbatim}
                    382: ll_dbinit (pgm_log, argv[0]);
                    383: \end{verbatim}\end{quote}
                    384: is called.
                    385: 
                    386: For dynamic responders,
                    387: a similiar code sequence is used:
                    388: \begin{quote}\small\begin{verbatim}
                    389: isodetailor (argv[0], 0);
                    390: if (debug = isatty (fileno (stderr)))
                    391:     ll_hdinit (pgm_log, argv[0]);
                    392: else
                    393:     ll_dbinit (pgm_log, argv[0]);
                    394: \end{verbatim}\end{quote}
                    395: 
                    396: For user-interfaces, the code is simply:
                    397: \begin{quote}\small\begin{verbatim}
                    398: isodetailor (argv[0], 1);
                    399: ll_hdinit (pgm_log, argv[0]);
                    400: \end{verbatim}\end{quote}
                    401: which will ask the tailoing system to read both the standard tailoring file
                    402: and a user-specific tailoring file and then to initialize the program log.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.