On Sun, Jan 04, 2015 at 07:16:19PM -0700, Theo de Raadt wrote:
> >On Sat, Jan 3, 2015 at 8:38 AM, Alexander Bluhm <[email protected]> 
> >wrote:
> >> My goal is to make logging via syslog reliable.  At least I want
> >> to see when a message gets lost.
> >>
> >> So my idea is to write a kernel log message if sendsyslog(2) cannot
> >> deliver a message.  Then you see the problem on the console and in
> >> the dmesg buffer.  If syslogd comes back later, you will also get
> >> the error into the log files via /dev/klog.
> >>
> >> comments? ok?
> >
> >Idea makes sense, but I wonder whether rate limiting is the best way
> >to handle logging of the failures.  My first instinct would be to log
> >the first failure, and then just count failures until a success
> >occurs, at which point the count of the intervening failures should be
> >reported.

Yes, that sounds better than rate limiting.  Updated diff.

> I had a discussion with Alexander where I expressed concern about the
> syncronous nature of console output, and that rate limiting may not be
> enough.  On slow console devices, this can have significant
> performance effects even with the rate limiting.

Would it reduce your concerns when I change it to something that
logs only to dmesg buffer and not to console?

I have to admit, that you may get this log line also on reboot.

> To me this code block fundamentally feels like it is using the dmesg
> buffer as a debug scaffold, because the idea is that syslogd should
> not fail.  I know what he wants, but I am wary of the kernel having
> this heavy cost to a system call which was designed to be so simple
> and clean.

I do not use it as a debugging aid.  We have the security requirement
that no log message may get lost unnoticed.  The syslogd process
may die, in that case you get a line in dmesg buffer from the kernel.
That can be checked later.

bluhm

Index: kern/subr_log.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/subr_log.c,v
retrieving revision 1.25
diff -u -p -r1.25 subr_log.c
--- kern/subr_log.c     13 Dec 2014 21:05:33 -0000      1.25
+++ kern/subr_log.c     5 Jan 2015 16:58:14 -0000
@@ -352,9 +352,14 @@ sys_sendsyslog(struct proc *p, void *v, 
        struct file *f;
        size_t len;
        int error;
+#ifndef SMALL_KERNEL
+       static unsigned int failed;
+#endif
 
-       if (syslogf == NULL)
-               return (ENOTCONN);
+       if (syslogf == NULL) {
+               error = ENOTCONN;
+               goto out;
+       }
        f = syslogf;
        FREF(f);
 
@@ -390,5 +395,19 @@ sys_sendsyslog(struct proc *p, void *v, 
        }
 #endif
        FRELE(f, p);
-       return error;
+
+ out:
+#ifndef SMALL_KERNEL
+       if (error) {
+               if (failed == 0)
+                       log(LOG_ERR, "send message to syslog failed\n");
+               failed++;
+       } else {
+               if (failed > 1)
+                       log(LOG_ERR, "send message to syslog failed "
+                           "%u more times\n", failed - 1);
+               failed = 0;
+       }
+#endif
+       return (error);
 }

Reply via email to