/* syslog_async is Copyright (c) 2007 Simon Kelley This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991, or (at your option) version 3 dated 29 June, 2007. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _SYSLOG_ASYNC_H #define _SYSLOG_ASYNC_H 1 #include #include /* Syslog_async is a non-blocking replacement for the POSIX-standard syslog() system call. Instead of blocking, log-lines are buffered in memory. The buffer size is limited and if the buffer overflows log lines are lost. When lines are lost this fact is logged with a message of the form: async_syslog overflow: 5 log entries lost In order to limit the probability of buffer overflow short delays are added to syslog_async() calls when the queue is getting full. The delay added is strictly bounded and tunable. The API is very close to the standard syslog(), with an additional call the tune buffer parameters and a couple of calls into the event loop. The code has been tested under Linux and BSD, and with both the syslog and syslog-ng log daemons. */ /* openlog_async(), closelog_async() and setlogmask_async() are identical to the POSIX equivalents. */ void openlog_async(const char *ident, int option, int facility); void closelog_async(void); int setlogmask_async(int mask); /* syslog_async() and vsyslog_async() are identical to syslog() and vsyslog() except for their blocking behaviour. The formatting is done using printf(), so the additional format operator %m is available only if the system printf() provides it. (GNU printf() does.) */ void syslog_async(int priority, const char *format, ...); void vsyslog_async(int priority, const char *format, va_list ap); /* log_fd_async() and log_write_async() are the interface between the library and the daemon event loop. log_fd_async() returns a file descriptor which the library needs to write, or -1 if no write is queued. log_write_async() does the write. The result of log_fd_async() is only valid until [v]syslog_async() or log_write_async() is called, so it should be called each time around the event loop, just before the call to select() or poll(). A typical event loop looks like this: while (1) { int log_fd; fd_set read_set, write_set; FD_ZERO(&read_set); FD_ZERO(&write_set); ...other stuff.. if ((log_fd = log_fd_async()) != -1) FD_SET(log_fd, &write_set); select(..., &read_set, &write_set, ...); if (log_fd != -1 && FD_ISSET(log_fd, &write)) log_write_async(); ...other stuff.... } */ int log_fd_async(void); void log_write_async(void); /* tunelog_async() tunes the log-line buffer. Backlog is the limit on the number of queued log-lines. These are stored in malloc'ed memory and each line is stored in a fixed-size buffer which is just over 1K bytes. The library maintains a buffer pool to avoid heap fragmentation. Delay is the upper bound on the time taken to run syslog_async, in milliseconds. This delay is added when syslog is busy in order to reduce the probability of buffer overflow. Backlog is constrained between 1 and 99 and delay between 1 millisecond and 1000 millisconds. The default for backlog is 5 and for delay 1000. Note that delay is calculated from queue size as 2^queue_size (in milliseconds) therefore the maximum delay for the default queue size is 64ms. Setting delay to zero is allowed, and inhibits the delay completely. */ void tunelog_async(int backlog, int delay); #endif