Annotation of embedaddon/libpdel/sys/alog.3, revision 1.1.1.1

1.1       misho       1: .\" Copyright (c) 2001-2002 Packet Design, LLC.
                      2: .\" All rights reserved.
                      3: .\" 
                      4: .\" Subject to the following obligations and disclaimer of warranty,
                      5: .\" use and redistribution of this software, in source or object code
                      6: .\" forms, with or without modifications are expressly permitted by
                      7: .\" Packet Design; provided, however, that:
                      8: .\" 
                      9: .\"    (i)  Any and all reproductions of the source or object code
                     10: .\"         must include the copyright notice above and the following
                     11: .\"         disclaimer of warranties; and
                     12: .\"    (ii) No rights are granted, in any manner or form, to use
                     13: .\"         Packet Design trademarks, including the mark "PACKET DESIGN"
                     14: .\"         on advertising, endorsements, or otherwise except as such
                     15: .\"         appears in the above copyright notice or in the software.
                     16: .\" 
                     17: .\" THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
                     18: .\" TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
                     19: .\" REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
                     20: .\" THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
                     21: .\" WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
                     22: .\" OR NON-INFRINGEMENT.  PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
                     23: .\" OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
                     24: .\" OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
                     25: .\" RELIABILITY OR OTHERWISE.  IN NO EVENT SHALL PACKET DESIGN BE
                     26: .\" LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
                     27: .\" OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
                     28: .\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
                     29: .\" DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
                     30: .\" USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
                     31: .\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     32: .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
                     33: .\" THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
                     34: .\" THE POSSIBILITY OF SUCH DAMAGE.
                     35: .\"
                     36: .\" Author: Archie Cobbs <archie@freebsd.org>
                     37: .\"
                     38: .\" $Id: alog.3,v 1.15 2004/06/02 17:24:38 archie Exp $
                     39: .\"
                     40: .Dd April 22, 2002
                     41: .Dt ALOG 3
                     42: .Os
                     43: .Sh NAME
                     44: .Nm alog
                     45: .Nd logging library
                     46: .Sh LIBRARY
                     47: PDEL Library (libpdel, \-lpdel)
                     48: .Sh SYNOPSIS
                     49: .In sys/types.h
                     50: .In netinet/in.h
                     51: .In pdel/structs/structs.h
                     52: .In pdel/structs/type/array.h
                     53: .In pdel/sys/alog.h
                     54: .Ft int
                     55: .Fn alog_configure "int channel" "const struct alog_config *conf"
                     56: .Ft int
                     57: .Fn alog_shutdown "int channel"
                     58: .Ft int
                     59: .Fn alog_set_channel "int channel"
                     60: .Ft void
                     61: .Fn alog "int sev" "const char *fmt" "..."
                     62: .Ft void
                     63: .Fn valog "int sev" "const char *fmt" "va_list args"
                     64: .Ft int
                     65: .Fn alog_get_history "int channel" "int min_severity" "int max_entries" "time_t max_age" "const regex_t *preg" "struct alog_history *list"
                     66: .Ft int
                     67: .Fn alog_clear_history "int channel"
                     68: .Ft int
                     69: .Fn alog_facility "const char *name"
                     70: .Ft "const char *"
                     71: .Fn alog_facility_name "int facility"
                     72: .Ft int
                     73: .Fn alog_severity "const char *name"
                     74: .Ft "const char *"
                     75: .Fn alog_severity_name "int severity"
                     76: .Ft void
                     77: .Fn alog_set_debug "int channel" "int enabled"
                     78: .Ft void
                     79: .Fn alog_expand "const char *fmt" "int errnum" "char *buf" "size_t bufsize"
                     80: .Vt extern const struct structs_type alog_facility_type ;
                     81: .Vt extern const struct structs_type alog_severity_type ;
                     82: .Vt extern const struct structs_type alog_config_type ;
                     83: .Vt extern const struct structs_type alog_history_type ;
                     84: .Sh DESCRIPTION
                     85: These functions provide support for storing and retrieving log messages.
                     86: Up to
                     87: .Dv ALOG_MAX_CHANNELS
                     88: independent log channels are supported.
                     89: Log entries may be printed to standard error, stored in a searchable
                     90: circular log history file, and sent to a local or remote
                     91: .Xr syslog 3
                     92: server.
                     93: .Pp
                     94: .Fn alog_configure
                     95: configures a log channel;
                     96: .Fa channel
                     97: must be between zero and
                     98: .Dv "ALOG_MAX_CHANNELS - 1" ,
                     99: inclusive.
                    100: The channel's configuration is pointed to by
                    101: .Fa conf ,
                    102: which is a pointer to a
                    103: .Li "struct alog_config" :
                    104: .Pp
                    105: .Bd -literal -compact -offset 3n
                    106: struct alog_config {
                    107:     const char     *path;         /* logfile filename, or NULL */
                    108:     const char     *name;         /* syslog id, or NULL to disable */
                    109:     const char     *facility;     /* syslog facility, NULL=stderr */
                    110:     struct in_addr remote_server; /* remote server, or 0.0.0.0 local */
                    111:     int            min_severity;  /* min severity to actually log */
                    112:     int            histlen;       /* how much history to save */
                    113: };
                    114: .Ed
                    115: .Pp
                    116: If
                    117: .Fa path
                    118: is not
                    119: .Dv NULL
                    120: it specifies the pathname of a circular
                    121: .Xr logfile 3
                    122: used to store log entries, and
                    123: .Fa histlen
                    124: specifies the maximum number of entries to store in the file.
                    125: .Pp
                    126: If
                    127: .Fa facility
                    128: is
                    129: .Dv NULL ,
                    130: log messages will be sent to standard error.
                    131: Otherwise, if
                    132: .Fa name
                    133: is not
                    134: .Dv NULL ,
                    135: .Xr syslog 3
                    136: logging is performed:
                    137: .Fa name
                    138: is the
                    139: .Xr syslog 3
                    140: identifier,
                    141: .Fa remote_server
                    142: specifies the IP address of a remote
                    143: .Xr syslog 3
                    144: server to send log entries to (or
                    145: .Li "0.0.0.0"
                    146: for the local
                    147: .Xr syslogd 8
                    148: listening on
                    149: .Pa "/var/run/log)" ,
                    150: and
                    151: .Fa facility
                    152: specifies a
                    153: .Xr syslog 3
                    154: facility, which must be a valid facility name as returned by
                    155: .Fn alog_facility_name
                    156: (see below), e.g., "daemon".
                    157: If
                    158: .Fa name
                    159: is
                    160: .Dv NULL ,
                    161: log messages are not output at all (but will still be stored in the log file).
                    162: .Pp
                    163: .Fa min_severity
                    164: specifies a minimum
                    165: .Xr syslog 3
                    166: severity level (actually a maximum, numerically speaking) for
                    167: logged entries; less severe entries are filtered out.
                    168: .Pp
                    169: After a channel has been configured successfully via
                    170: .Fn alog_configure ,
                    171: access to that channel via
                    172: .Fn alog ,
                    173: .Fn valog ,
                    174: .Fn alog_get_history ,
                    175: and
                    176: .Fn alog_clear_history
                    177: by multiple threads is safe.
                    178: .Pp
                    179: .Fn alog_shutdown
                    180: shuts down an
                    181: .Fa alog
                    182: channel, returning it to its uninitialized, thread-unsafe state.
                    183: Logging to an uninitialized channel is permitted; the output is
                    184: written to standard error.
                    185: This allows applications to log errors before they've configured
                    186: .Nm alog .
                    187: .Pp
                    188: .Fn alog_set_channel
                    189: sets the log channel for newly logged messages.
                    190: This setting persists until another call to
                    191: .Fn alog_set_channel .
                    192: A separate "current channel" variable is kept for each thread.
                    193: .Pp
                    194: .Fn alog
                    195: and
                    196: .Fn valog
                    197: log a message.
                    198: .Fa sev
                    199: is a
                    200: .Xr syslog 3
                    201: severity level such as
                    202: .Dv LOG_ERROR .
                    203: The message is formatted using
                    204: .Fa fmt
                    205: as a
                    206: .Xr printf 3
                    207: like format string.
                    208: As a special case, "%m" is replaced with
                    209: .Fn strerror errno .
                    210: The value of
                    211: .Va errno
                    212: is not modified by these functions.
                    213: Note that when a channel is configured to log to syslog or standard error,
                    214: these functions become thread cancellation points.
                    215: .Pp
                    216: .Fn alog_get_history
                    217: retrieves previously logged entries from the circular log file
                    218: associated with channel
                    219: .Fa channel .
                    220: Only entries with severity greater than
                    221: .Fa min_severity
                    222: are returned;
                    223: only entries logged no earlier than
                    224: .Fa max_age
                    225: seconds ago are returned;
                    226: if
                    227: .Fa preg
                    228: is not
                    229: .Dv NULL ,
                    230: log entries not matching the regular expression are filtered out;
                    231: and finally, at most
                    232: .Fa max_entries
                    233: total entries are returned.
                    234: .Pp
                    235: The returned entries are described by an array of pointers to
                    236: .Li "struct alog_entry" :
                    237: .Pp
                    238: .Bd -literal -compact -offset 3n
                    239: struct alog_entry {
                    240:     time_t  when;           /* when event was logged */
                    241:     int     sev;            /* entry log severity */
                    242:     char    msg[0];         /* entry contents (including '\\0') */
                    243: };
                    244: 
                    245: DEFINE_STRUCTS_ARRAY(alog_history, struct alog_entry *);
                    246: .Ed
                    247: .Pp
                    248: This array is stored in
                    249: .Fa "*list" ,
                    250: which will then contain a data structure with
                    251: .Xr structs 3
                    252: type
                    253: .Fa alog_history_type
                    254: and which must eventually be freed by the caller via
                    255: .Xr structs_free 3 .
                    256: .Pp
                    257: .Fn alog_clear_history
                    258: resets a log history file to empty.
                    259: .Pp
                    260: .Fn alog_facility
                    261: takes a
                    262: .Xr syslog 3
                    263: facility name and returns its numeric value.
                    264: .Pp
                    265: .Fn alog_facility_name
                    266: returns the
                    267: .Xr syslog 3
                    268: facility name for
                    269: .Fa facility .
                    270: .Pp
                    271: .Fn alog_severity
                    272: takes a
                    273: .Xr syslog 3
                    274: severity name and returns its numeric value.
                    275: .Pp
                    276: .Fn alog_severity_name
                    277: returns the
                    278: .Xr syslog 3
                    279: severity name for
                    280: .Fa severity .
                    281: .Pp
                    282: .Fn alog_expand
                    283: expands the last occurence of "%m" (if any) in the string
                    284: .Fa fmt
                    285: into
                    286: .Fn strerror errnum
                    287: and writes the result into the buffer pointed to by
                    288: .Fa buf ,
                    289: which has size
                    290: .Fa bufsize .
                    291: .Pp
                    292: .Fn alog_set_debug
                    293: causes the next call to
                    294: .Fn alog_configure
                    295: to act as if
                    296: .Fa facility
                    297: were equal to
                    298: .Dv NULL .
                    299: .Pp
                    300: The following
                    301: .Xr structs 3
                    302: types are pre-defined:
                    303: .Pp
                    304: .Bl -hang -width 2n -offset 3n
                    305: .It Va alog_facility_type
                    306: .Pp
                    307: Same as
                    308: .Xr structs_type_string 3
                    309: but may only take values that are valid
                    310: .Xr syslog 3
                    311: facility names.
                    312: The default value is
                    313: .Dq daemon.
                    314: .It Va alog_severity_type
                    315: .Pp
                    316: Same as
                    317: .Xr structs_type_int 3
                    318: but the ASCII representation is the severity name from
                    319: .Fn alog_severity_name
                    320: instead of a number.
                    321: .It Va alog_config_type
                    322: .Pp
                    323: Describes a
                    324: .Li "struct alog_config" .
                    325: .It Va alog_history_type
                    326: .Pp
                    327: Describes a
                    328: .Li "struct alog_history" ,
                    329: which is a
                    330: .Xr structs 3
                    331: array of
                    332: .Li "struct alog_entry *"
                    333: pointers.
                    334: This type is used for accessing and freeing the log history returned by
                    335: .Fn alog_get_history .
                    336: .El
                    337: .Sh RETURN VALUES
                    338: The above functions return -1 or
                    339: .Dv NULL
                    340: to indicate an error, setting
                    341: .Va errno
                    342: accordingly.
                    343: .Sh SEE ALSO
                    344: .Xr libpdel 3 ,
                    345: .Xr regex 3 ,
                    346: .Xr structs 3 ,
                    347: .Xr structs_type_array 3 ,
                    348: .Xr syslog 3 ,
                    349: .Xr typed_mem 3
                    350: .Sh HISTORY
                    351: The PDEL library was developed at Packet Design, LLC.
                    352: .Dv "http://www.packetdesign.com/"
                    353: .Sh AUTHORS
                    354: .An Archie Cobbs Aq archie@freebsd.org
                    355: .Sh BUGS
                    356: If multiple channels are configured to write to local syslog,
                    357: messages can get written with the wrong identifier or facility.
                    358: This is an unavoidable consequence of the implementation of
                    359: .Xr openlog 3
                    360: and
                    361: .Xr syslog 3 ,
                    362: which doesn't support threading.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>