MINOR: log: report the number of dropped logs in the stats

It's easy to detect when logs on some paths are lost as sendmsg() will
return EAGAIN. This is particularly true when sending to /dev/log, which
often doesn't support a big logging capacity. Let's keep track of these
and report the total number of dropped messages in "show info".
diff --git a/include/proto/log.h b/include/proto/log.h
index b994470..30d4dce 100644
--- a/include/proto/log.h
+++ b/include/proto/log.h
@@ -46,6 +46,8 @@
 
 extern char default_rfc5424_sd_log_format[];
 
+extern unsigned int dropped_logs;
+
 extern THREAD_LOCAL char *logheader;
 extern THREAD_LOCAL char *logheader_rfc5424;
 extern THREAD_LOCAL char *logline;
diff --git a/include/types/stats.h b/include/types/stats.h
index 2cb23bf..7525044 100644
--- a/include/types/stats.h
+++ b/include/types/stats.h
@@ -293,6 +293,7 @@
 	INF_LISTENERS,
 	INF_ACTIVE_PEERS,
 	INF_CONNECTED_PEERS,
+	INF_DROPPED_LOGS,
 
 	/* must always be the last one */
 	INF_TOTAL_FIELDS
diff --git a/src/log.c b/src/log.c
index 24e4c3f..3434550 100644
--- a/src/log.c
+++ b/src/log.c
@@ -210,6 +210,9 @@
  */
 char default_rfc5424_sd_log_format[] = "- ";
 
+/* total number of dropped logs */
+unsigned int dropped_logs = 0;
+
 /* This is a global syslog header, common to all outgoing messages in
  * RFC3164 format. It begins with time-based part and is updated by
  * update_log_hdr().
@@ -1478,7 +1481,9 @@
 		if (sent < 0) {
 			static char once;
 
-			if (!once) {
+			if (errno == EAGAIN)
+				HA_ATOMIC_ADD(&dropped_logs, 1);
+			else if (!once) {
 				once = 1; /* note: no need for atomic ops here */
 				ha_alert("sendmsg() failed in logger #%d: %s (errno=%d)\n",
 				         nblogger, strerror(errno), errno);
diff --git a/src/stats.c b/src/stats.c
index 78342cd..07a5ef7 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -135,6 +135,7 @@
 	[INF_LISTENERS]                      = "Listeners",
 	[INF_ACTIVE_PEERS]                   = "ActivePeers",
 	[INF_CONNECTED_PEERS]                = "ConnectedPeers",
+	[INF_DROPPED_LOGS]                   = "DroppedLogs",
 };
 
 const char *stat_field_names[ST_F_TOTAL_FIELDS] = {
@@ -3302,6 +3303,7 @@
 	info[INF_LISTENERS]                      = mkf_u32(0, listeners);
 	info[INF_ACTIVE_PEERS]                   = mkf_u32(0, active_peers);
 	info[INF_CONNECTED_PEERS]                = mkf_u32(0, connected_peers);
+	info[INF_DROPPED_LOGS]                   = mkf_u32(0, dropped_logs);
 
 	return 1;
 }