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
This commit is contained in:
David Malone 2004-05-30 10:04:03 +00:00
parent 8b5cd5a662
commit 0f2ffc4e31
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=129865
2 changed files with 32 additions and 2 deletions

View File

@ -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

View File

@ -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;