[PATCH] syslogd: make "reopen log file every second" logic work for multiple logs
Joshua Judson Rosen
jrosen at harvestai.com
Wed May 21 18:40:51 UTC 2014
Move last_log_time from a single global to *each logFile_t*
so that we can actually apply the logic to every log-file
in multi-file configurations, rather than working only
for the first file written in each 1-second interval
and then leaving the others connected to possibly wrong files.
Signed-off-by: Joshua Judson Rosen <jrosen at harvestai.com>
---
sysklogd/syslogd.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index a6a4ff2..a935192 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -110,6 +110,7 @@ typedef struct {
typedef struct logFile_t {
const char *path;
int fd;
+ time_t last_log_time;
#if ENABLE_FEATURE_ROTATE_LOGFILE
unsigned size;
uint8_t isRegular;
@@ -165,7 +166,6 @@ struct globals {
#if ENABLE_FEATURE_IPC_SYSLOG
struct shbuf_ds *shbuf;
#endif
- time_t last_log_time;
/* localhost's name. We print only first 64 chars */
char *hostname;
@@ -184,6 +184,7 @@ static const struct init_globals init_data = {
.logFile = {
.path = "/var/log/messages",
.fd = -1,
+ .last_log_time = 0,
},
#ifdef SYSLOGD_MARK
.markInterval = 20 * 60,
@@ -424,6 +425,7 @@ static void parse_syslogdcfg(const char *file)
}
cur_rule->file = xzalloc(sizeof(*cur_rule->file));
cur_rule->file->fd = -1;
+ cur_rule->file->last_log_time = 0;
cur_rule->file->path = xstrdup(tok[1]);
found:
pp_rule = &cur_rule->next;
@@ -586,15 +588,16 @@ static void log_locally(time_t now, char *msg, logFile_t *log_file)
int len = strlen(msg);
if (log_file->fd >= 0) {
- /* Reopen log file every second. This allows admin
- * to delete the file and not worry about restarting us.
+ /* Reopen log files every second. This allows admin
+ * to delete the files and not worry about restarting us.
* This costs almost nothing since it happens
- * _at most_ once a second.
+ * _at most_ once a second for each file, and happens
+ * only when each file is actually written.
*/
if (!now)
now = time(NULL);
- if (G.last_log_time != now) {
- G.last_log_time = now;
+ if (log_file->last_log_time != now) {
+ log_file->last_log_time = now;
close(log_file->fd);
goto reopen;
}
--
1.7.10.4
More information about the busybox
mailing list