Hi,

Now that syslogd handles delayed DNS lookups, I think we should
count dropped packets to UDP loghosts.  Although not every dropped
UDP packet can be detected, the message makes the admin aware that
there may be a blind spot during startup.

syslogd[26493]: dropped 8 messages to udp loghost "@udp://loghost"

Debug and log messages were improved, especially if UDP looging is
shut down permanently.  Also do not print 'last message repeated'
if the message was dropped.

ok?

bluhm

Index: usr.sbin/syslogd/syslogd.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
retrieving revision 1.278
diff -u -p -r1.278 syslogd.c
--- usr.sbin/syslogd/syslogd.c  12 Oct 2023 22:36:54 -0000      1.278
+++ usr.sbin/syslogd/syslogd.c  17 Oct 2023 23:30:05 -0000
@@ -241,6 +241,7 @@ int NoVerify = 0;           /* do not verify TLS 
 const char *ClientCertfile = NULL;
 const char *ClientKeyfile = NULL;
 const char *ServerCAfile = NULL;
+int    udpsend_dropped = 0;    /* messages dropped due to UDP not ready */
 int    tcpbuf_dropped = 0;     /* count messages dropped from TCP or TLS */
 int    file_dropped = 0;       /* messages dropped due to file system full */
 int    init_dropped = 0;       /* messages dropped during initialization */
@@ -1820,6 +1821,7 @@ logmsg(struct msg *msg, int flags, char 
                    (f->f_type != F_PIPE && f->f_type != F_FORWUDP &&
                    f->f_type != F_FORWTCP && f->f_type != F_FORWTLS))) &&
                    (flags & MARK) == 0 && msglen == f->f_prevlen &&
+                   f->f_dropped == 0 &&
                    !strcmp(msg->m_msg, f->f_prevline) &&
                    !strcmp(from, f->f_prevhost)) {
                        strlcpy(f->f_lasttime, msg->m_timestamp,
@@ -2005,14 +2007,14 @@ fprintlog(struct filed *f, int flags, ch
 
        switch (f->f_type) {
        case F_UNUSED:
-               log_debug("%s", "");
+               log_debug("");
                break;
 
        case F_FORWUDP:
-               log_debug(" %s", f->f_un.f_forw.f_loghost);
+               log_debugadd(" %s", f->f_un.f_forw.f_loghost);
                if (f->f_un.f_forw.f_addr.ss_family == AF_UNSPEC) {
-                       log_warnx("not resolved \"%s\"",
-                           f->f_un.f_forw.f_loghost);
+                       log_debug(" (dropped not resolved)");
+                       f->f_dropped++;
                        break;
                }
                l = iov[0].iov_len + iov[1].iov_len + iov[2].iov_len +
@@ -2040,14 +2042,30 @@ fprintlog(struct filed *f, int flags, ch
                        case ENETUNREACH:
                        case ENOBUFS:
                        case EWOULDBLOCK:
+                               log_debug(" (dropped send error)");
+                               f->f_dropped++;
                                /* silently dropped */
                                break;
                        default:
+                               log_debug(" (dropped permanent send error)");
+                               f->f_dropped++;
                                f->f_type = F_UNUSED;
-                               log_warn("sendmsg to \"%s\"",
+                               snprintf(ebuf, sizeof(ebuf),
+                                   "to udp loghost \"%s\"",
+                                   f->f_un.f_forw.f_loghost);
+                               dropped_warn(&f->f_dropped, ebuf);
+                               log_warn("loghost \"%s\" disabled, sendmsg",
                                    f->f_un.f_forw.f_loghost);
                                break;
                        }
+               } else {
+                       log_debug("");
+                       if (f->f_dropped > 0) {
+                               snprintf(ebuf, sizeof(ebuf),
+                                   "to udp loghost \"%s\"",
+                                   f->f_un.f_forw.f_loghost);
+                               dropped_warn(&f->f_dropped, ebuf);
+                       }
                }
                break;
 
@@ -2056,7 +2074,7 @@ fprintlog(struct filed *f, int flags, ch
                log_debugadd(" %s", f->f_un.f_forw.f_loghost);
                if (EVBUFFER_LENGTH(f->f_un.f_forw.f_bufev->output) >=
                    MAX_TCPBUF) {
-                       log_debug(" (dropped)");
+                       log_debug(" (dropped tcpbuf full)");
                        f->f_dropped++;
                        break;
                }
@@ -2077,12 +2095,12 @@ fprintlog(struct filed *f, int flags, ch
                    (char *)iov[3].iov_base, (char *)iov[4].iov_base,
                    (char *)iov[5].iov_base, (char *)iov[6].iov_base);
                if (l < 0) {
-                       log_debug(" (dropped evbuffer_add_printf)");
+                       log_debug(" (dropped evbuffer add)");
                        f->f_dropped++;
                        break;
                }
                bufferevent_enable(f->f_un.f_forw.f_bufev, EV_WRITE);
-               log_debug("%s", "");
+               log_debug("");
                break;
 
        case F_CONSOLE:
@@ -2165,7 +2183,7 @@ fprintlog(struct filed *f, int flags, ch
                } else {
                        if (flags & SYNC_FILE)
                                (void)fsync(f->f_file);
-                       if (f->f_dropped && f->f_type == F_FILE) {
+                       if (f->f_dropped > 0 && f->f_type == F_FILE) {
                                snprintf(ebuf, sizeof(ebuf), "to file \"%s\"",
                                    f->f_un.f_fname);
                                dropped_warn(&f->f_dropped, ebuf);
@@ -2175,12 +2193,12 @@ fprintlog(struct filed *f, int flags, ch
 
        case F_USERS:
        case F_WALL:
-               log_debug("%s", "");
+               log_debug("");
                wallmsg(f, iov);
                break;
 
        case F_MEMBUF:
-               log_debug("%s", "");
+               log_debug("");
                l = snprintf(line, sizeof(line),
                    "%s%s%s%s%s%s%s", (char *)iov[0].iov_base,
                    (char *)iov[1].iov_base, (char *)iov[2].iov_base,
@@ -2293,8 +2311,9 @@ init_signalcb(int signum, short event, v
        init();
        log_info(LOG_INFO, "restart");
 
-       dropped_warn(&file_dropped, "to file");
+       dropped_warn(&udpsend_dropped, "to udp loghost");
        dropped_warn(&tcpbuf_dropped, "to remote loghost");
+       dropped_warn(&file_dropped, "to file");
        log_debug("syslogd: restarted");
 }
 
@@ -2327,6 +2346,10 @@ die(int signo)
                /* flush any pending output */
                if (f->f_prevcount)
                        fprintlog(f, 0, (char *)NULL);
+               if (f->f_type == F_FORWUDP) {
+                       udpsend_dropped += f->f_dropped;
+                       f->f_dropped = 0;
+               }
                if (f->f_type == F_FORWTLS || f->f_type == F_FORWTCP) {
                        tcpbuf_dropped += f->f_dropped +
                            tcpbuf_countmsg(f->f_un.f_forw.f_bufev);
@@ -2338,8 +2361,9 @@ die(int signo)
                }
        }
        dropped_warn(&init_dropped, "during initialization");
-       dropped_warn(&file_dropped, "to file");
+       dropped_warn(&udpsend_dropped, "to udp loghost");
        dropped_warn(&tcpbuf_dropped, "to remote loghost");
+       dropped_warn(&file_dropped, "to file");
 
        if (signo)
                log_info(LOG_ERR, "exiting on signal %d", signo);
@@ -2383,6 +2407,8 @@ init(void)
                switch (f->f_type) {
                case F_FORWUDP:
                        evtimer_del(&f->f_un.f_forw.f_ev);
+                       udpsend_dropped += f->f_dropped;
+                       f->f_dropped = 0;
                        free(f->f_un.f_forw.f_ipproto);
                        free(f->f_un.f_forw.f_host);
                        free(f->f_un.f_forw.f_port);
@@ -2403,10 +2429,9 @@ init(void)
                        free(f->f_un.f_forw.f_port);
                        /* FALLTHROUGH */
                case F_FILE:
-                       if (f->f_type == F_FILE) {
+                       if (f->f_type == F_FILE)
                                file_dropped += f->f_dropped;
-                               f->f_dropped = 0;
-                       }
+                       f->f_dropped = 0;
                        /* FALLTHROUGH */
                case F_TTY:
                case F_CONSOLE:

Reply via email to