commit 1b7855b: [Minor] Improve logging reopening

Vsevolod Stakhov vsevolod at highsecure.ru
Mon Oct 7 15:35:07 UTC 2019


Author: Vsevolod Stakhov
Date: 2019-10-07 16:18:11 +0100
URL: https://github.com/rspamd/rspamd/commit/1b7855b977da0fced44d3b4cedaeb2d56b6d7513

[Minor] Improve logging reopening

---
 src/libserver/worker_util.c |   3 ++
 src/libutil/logger.c        | 114 ++++++++++++++++++++++++++++++++------------
 src/rspamd.c                |   1 +
 3 files changed, 87 insertions(+), 31 deletions(-)

diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c
index 154da021f..cdae2cfd2 100644
--- a/src/libserver/worker_util.c
+++ b/src/libserver/worker_util.c
@@ -200,7 +200,10 @@ rspamd_worker_usr2_handler (struct rspamd_worker_signal_handler *sigh, void *arg
 static gboolean
 rspamd_worker_usr1_handler (struct rspamd_worker_signal_handler *sigh, void *arg)
 {
+	struct rspamd_main *rspamd_main = sigh->worker->srv;
+
 	rspamd_log_reopen (sigh->worker->srv->logger);
+	msg_info_main ("logging reinitialised");
 
 	/* Get more signals */
 	return TRUE;
diff --git a/src/libutil/logger.c b/src/libutil/logger.c
index 1a60b9e3f..08cc15294 100644
--- a/src/libutil/logger.c
+++ b/src/libutil/logger.c
@@ -251,6 +251,35 @@ rspamd_escape_log_string (gchar *str)
 	}
 }
 
+gint
+rspamd_try_open_log_fd (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid)
+{
+	gint fd;
+
+	fd = open (rspamd_log->log_file,
+			O_CREAT | O_WRONLY | O_APPEND,
+			S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
+	if (fd == -1) {
+		fprintf (stderr,
+				"open_log: cannot open desired log file: %s, %s\n",
+				rspamd_log->log_file, strerror (errno));
+		return -1;
+	}
+
+	if (uid != -1 || gid != -1) {
+		if (fchown (fd, uid, gid) == -1) {
+			fprintf (stderr,
+					"open_log: cannot chown desired log file: %s, %s\n",
+					rspamd_log->log_file, strerror (errno));
+			close (fd);
+
+			return -1;
+		}
+	}
+
+	return fd;
+}
+
 /* Logging utility functions */
 gint
 rspamd_log_open_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid)
@@ -268,20 +297,9 @@ rspamd_log_open_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid)
 #endif
 			break;
 		case RSPAMD_LOG_FILE:
-			rspamd_log->fd = open (rspamd_log->log_file,
-					O_CREAT | O_WRONLY | O_APPEND,
-					S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
+			rspamd_log->fd = rspamd_try_open_log_fd (rspamd_log, uid, gid);
+
 			if (rspamd_log->fd == -1) {
-				fprintf (stderr,
-						"open_log: cannot open desired log file: %s, %s\n",
-						rspamd_log->log_file, strerror (errno));
-				return -1;
-			}
-			if (fchown (rspamd_log->fd, uid, gid) == -1) {
-				fprintf (stderr,
-						"open_log: cannot chown desired log file: %s, %s\n",
-						rspamd_log->log_file, strerror (errno));
-				close (rspamd_log->fd);
 				return -1;
 			}
 			break;
@@ -296,23 +314,12 @@ rspamd_log_open_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid)
 	return 0;
 }
 
-void
-rspamd_log_close_priv (rspamd_logger_t *rspamd_log, gboolean termination, uid_t uid, gid_t gid)
+static void
+rspamd_log_reset_repeated (rspamd_logger_t *rspamd_log)
 {
 	gchar tmpbuf[256];
-	rspamd_log_flush (rspamd_log);
-
 	if (rspamd_log->opened) {
-		switch (rspamd_log->type) {
-		case RSPAMD_LOG_CONSOLE:
-			/* Do nothing special */
-			break;
-		case RSPAMD_LOG_SYSLOG:
-#ifdef HAVE_SYSLOG_H
-			closelog ();
-#endif
-			break;
-		case RSPAMD_LOG_FILE:
+		if (rspamd_log->type == RSPAMD_LOG_FILE) {
 			if (rspamd_log->repeats > REPEATS_MIN) {
 				rspamd_snprintf (tmpbuf,
 						sizeof (tmpbuf),
@@ -343,11 +350,38 @@ rspamd_log_close_priv (rspamd_logger_t *rspamd_log, gboolean termination, uid_t
 						tmpbuf,
 						rspamd_log);
 			}
+		}
+	}
+}
+
+void
+rspamd_log_close_priv (rspamd_logger_t *rspamd_log, gboolean termination, uid_t uid, gid_t gid)
+{
+
+	rspamd_log_flush (rspamd_log);
+	rspamd_log_reset_repeated (rspamd_log);
 
+	if (rspamd_log->opened) {
+		switch (rspamd_log->type) {
+		case RSPAMD_LOG_CONSOLE:
+			/* Do nothing special */
+			break;
+		case RSPAMD_LOG_SYSLOG:
+#ifdef HAVE_SYSLOG_H
+			closelog ();
+#endif
+			break;
+		case RSPAMD_LOG_FILE:
 			if (rspamd_log->fd != -1) {
+#if _POSIX_SYNCHRONIZED_IO > 0
+				if (fdatasync (rspamd_log->fd) == -1) {
+					msg_err ("error syncing log file: %s", strerror (errno));
+				}
+#else
 				if (fsync (rspamd_log->fd) == -1) {
 					msg_err ("error syncing log file: %s", strerror (errno));
 				}
+#endif
 				close (rspamd_log->fd);
 			}
 			break;
@@ -367,11 +401,29 @@ rspamd_log_close_priv (rspamd_logger_t *rspamd_log, gboolean termination, uid_t
 gint
 rspamd_log_reopen_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid)
 {
-	rspamd_log_close_priv (rspamd_log, FALSE, uid, gid);
+	if (rspamd_log->type == RSPAMD_LOG_FILE) {
+		rspamd_log_flush (rspamd_log);
+		rspamd_log_reset_repeated (rspamd_log);
 
-	if (rspamd_log_open_priv (rspamd_log, uid, gid) == 0) {
-		msg_info ("log file reopened");
-		return 0;
+		gint newfd = rspamd_try_open_log_fd (rspamd_log, uid, gid);
+
+		if (newfd != -1) {
+			rspamd_log_close_priv (rspamd_log, FALSE, uid, gid);
+			rspamd_log->fd = newfd;
+
+			rspamd_log->opened = TRUE;
+			rspamd_log->enabled = TRUE;
+		}
+
+		/* Do nothing, use old settings */
+	}
+	else {
+		/* Straightforward */
+		rspamd_log_close_priv (rspamd_log, FALSE, uid, gid);
+
+		if (rspamd_log_open_priv (rspamd_log, uid, gid) == 0) {
+			return 0;
+		}
 	}
 
 	return -1;
diff --git a/src/rspamd.c b/src/rspamd.c
index c3057b800..5f0e89414 100644
--- a/src/rspamd.c
+++ b/src/rspamd.c
@@ -990,6 +990,7 @@ rspamd_usr1_handler (struct ev_loop *loop, ev_signal *w, int revents)
 		rspamd_log_reopen_priv (rspamd_main->logger,
 				rspamd_main->workers_uid,
 				rspamd_main->workers_gid);
+		msg_info_main ("logging reinitialised");
 		g_hash_table_foreach (rspamd_main->workers, reopen_log_handler,
 				NULL);
 	}


More information about the Commits mailing list