Control system log.
#include <syslog.h> #include <stdarg.h> void syslog(int priority, const char *message, ...); void vsyslog(int priority, const char *message, va_list args); void openlog(const char *ident, int logopt, int facility); void closelog(void); int setlogmask(int maskpri);
syslog writes message to the system message logger. The message is then written to the system console, log files, logged-in users, or forwarded to other machines as appropriate.
The message is identical to a printf format string, except that '%m' is replaced by the current error message. (As denoted by the global variable errno,; see strerror().) A trailing newline is added if none is present.
vsyslog is an alternate form in which arguments are already captured using the variable-length argument facilities of stdarg.
The message is tagged with priority. Priorities are encoded as a facility and a level. The facility describes the part of the system generating the message. The level is selected from the following ordered (high to low) list:
| LOG_EMERG | A panic condition. This is normally broadcast to all users. |
| LOG_ALERT | A condition that needs immediate correction, such as a corrupted system database. |
| LOG_CRIT | Critical conditions, e.g., hard device errors. |
| LOG_ERR | Errors. |
| LOG_WARNING | Warning messages. |
| LOG_NOTICE | Conditions that are not error conditions, but should possibly be handled specially. |
| LOG_INFO | Informational messages. |
| LOG_DEBUG | Messages that contain information normally of use only when debugging a program. |
openlog() provides for more specialized processing of the messages sent by syslog and vsyslog. The ident argument is a string prepended to every message. The logopt argument is a bit field that specifies logging options, which is formed by OR'ing one or more of the following values:
| LOG_CONS | If syslog cannot pass the message to the system logger it tries to write the message to the console. |
| LOG_NDELAY | Immediately opens a connection to the system logger. |
| LOG_PERROR | Writes the message to standard error output as well to the system log. |
| LOG_PID | Logs the process ID with each message. Useful for identifying instantiations of daemons. |
The facility argument encodes a default facility to be assigned to all messages that do not have an explicit facility encoded:
| LOG_AUTH | The authorization system. |
| LOG_AUTHPRIV | The same as LOG_AUTH, but logged to a file readable only by selected individuals. |
| LOG_CONSOLE | Messages written to the console by the kernel console output driver. |
| LOG_CRON | The cron daemon. |
| LOG_DAEMON | System daemons that other facilities do not explicitly provide for. |
| LOG_FTP | The file transfer protocol daemons. |
| LOG_KERN | Messages generated by the kernel. User processes cannot generate these. |
| LOG_LPR | The line printer spooling system. |
| LOG_MAIL | The mail system. |
| LOG_NEWS | The network news system. |
| LOG_NTP | The network time protocol system |
| LOG_SECURITY | Security subsystems, such as ipfw. |
| LOG_SYSLOG | Messages internally generated by the system logger. |
| LOG_USER | Messages generated by random user processes. If none is specified, this is the default facility identifier. |
| LOG_UUCP | The uucp system. |
| LOG_LOCAL0 | Reserved for local use. Similarly for LOG_LOCAL1 through LOG_LOCAL7. |
You can use closelog to close the log file.
setlogmask sets the log priority mask to maskpri and returns the previous mask. Calls to syslog with a priority not set in maskpri are rejected. The mask for an individual priority pri is calculated by the macro LOG_MASK(pri); the mask for all priorities up to and including toppri is given by the macro LOG_UPTO(toppri);. The default allows all priorities to be logged.
syslog(LOG_ALERT, "who: internal error 23");
openlog("ftpd", LOG_PID | LOG_NDELAY, LOG_FTP);
setlogmask(LOG_UPTO(LOG_ERR));
syslog(LOG_INFO, "Connection from host %d", CallingHost);
syslog(LOG_INFO|LOG_LOCAL2, "foobar error: %m");
Never pass a string with user-supplied data as a format without using '%s'. An attacker can put format specifiers in the string to mangle your stack, leading to a possible security hole. This holds true even if the string was built using a function like snprintf, as the resulting string may still contain user-supplied conversion specifiers for later interpolation by syslog.
Always use the proper secure idiom: syslog(LOG_INFO, "%s", string);
closelog, openlog, syslog and vsyslog return no value.
setlogmask always returns the previous log mask level.
| Versions | Link to |
|---|---|
| INtime 4.2 | clib.lib |