diff options
author | dwmalone <dwmalone@FreeBSD.org> | 2004-05-30 10:04:03 +0000 |
---|---|---|
committer | dwmalone <dwmalone@FreeBSD.org> | 2004-05-30 10:04:03 +0000 |
commit | 21f82f995bfaa3cea3aeb4f282a686d71c359e33 (patch) | |
tree | ffa6fc06a3ed125ed44b1ae1276c540f6577a600 /usr.sbin/syslogd | |
parent | 46d384e689b20d4fa11d4c6051b9fc07ed51f6a7 (diff) | |
download | FreeBSD-src-21f82f995bfaa3cea3aeb4f282a686d71c359e33.zip FreeBSD-src-21f82f995bfaa3cea3aeb4f282a686d71c359e33.tar.gz |
A log file name may now be prefixed by a '-' if it should not be
explicitly fsynced after kernel messages are logged. This option
should be syntax compatible with a similar option in Linux syslogd.
I've made some small changes to Pekka's patch, hoepfully I haven't
goofed anything.
PR: 66790
Submitted by: Pekka Savola <pekkas@netcore.fi>
Obtained from: Martin Schulze's syslogd
MFC after: 1 month
Diffstat (limited to 'usr.sbin/syslogd')
-rw-r--r-- | usr.sbin/syslogd/syslog.conf.5 | 20 | ||||
-rw-r--r-- | usr.sbin/syslogd/syslogd.c | 14 |
2 files changed, 32 insertions, 2 deletions
diff --git a/usr.sbin/syslogd/syslog.conf.5 b/usr.sbin/syslogd/syslog.conf.5 index f13f1bf..789d63f 100644 --- a/usr.sbin/syslogd/syslog.conf.5 +++ b/usr.sbin/syslogd/syslog.conf.5 @@ -318,6 +318,22 @@ There are five forms: .It A pathname (beginning with a leading slash). Selected messages are appended to the file. +.Pp +To ensure that kernel messages are written to disk promptly, +.Nm +calls +.Xr fsync 2 +after writing messages from the kernel. +Other messages are not synced explicitly. +You may prefix a pathname with the minus sign, +.Dq - , +to forego syncing the specified file after every kernel message. +Note that you might lose information if the system crashes +immediately following a write attempt. +Nevertheless, using the +.Dq - +option may improve performance, +especially if the kernel is logging many messages. .It A hostname (preceded by an at .Pq Dq @ @@ -422,6 +438,10 @@ security.* /var/log/security # Log all writes to /dev/console to a separate file. console.* /var/log/console.log + +# Log ipfw messages without syncing after every message. +!ipfw +*.* -/var/log/ipfw .Ed .Sh IMPLEMENTATION NOTES The diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c index a6b3e42..44b8795 100644 --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -186,6 +186,8 @@ struct filed { int f_prevlen; /* length of f_prevline */ int f_prevcount; /* repetition cnt of prevline */ u_int f_repeatcount; /* number of "repeated" msgs */ + int f_flags; /* file-specific flags */ +#define FFLAG_SYNC 0x01 }; /* @@ -1150,7 +1152,7 @@ fprintlog(struct filed *f, int flags, const char *msg) f->f_type = F_UNUSED; errno = e; logerror(f->f_un.f_fname); - } else if (flags & SYNC_FILE) + } else if ((flags & SYNC_FILE) && (f->f_flags & FFLAG_SYNC)) (void)fsync(f->f_file); break; @@ -1635,7 +1637,7 @@ static void cfline(const char *line, struct filed *f, const char *prog, const char *host) { struct addrinfo hints, *res; - int error, i, pri; + int error, i, pri, syncfile; const char *p, *q; char *bp; char buf[MAXLINE], ebuf[100]; @@ -1783,6 +1785,12 @@ cfline(const char *line, struct filed *f, const char *prog, const char *host) while (*p == '\t' || *p == ' ') p++; + if (*p == '-') { + syncfile = 0; + p++; + } else + syncfile = 1; + switch (*p) { case '@': (void)strlcpy(f->f_un.f_forw.f_hname, ++p, @@ -1806,6 +1814,8 @@ cfline(const char *line, struct filed *f, const char *prog, const char *host) logerror(p); break; } + if (syncfile) + f->f_flags |= FFLAG_SYNC; if (isatty(f->f_file)) { if (strcmp(p, ctty) == 0) f->f_type = F_CONSOLE; |