syslogd: make "reopen log file every second" logic work for multiple logs
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@harvestai.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
e46047aa87
commit
ae57fcad5d
@ -110,6 +110,7 @@ typedef struct {
|
|||||||
typedef struct logFile_t {
|
typedef struct logFile_t {
|
||||||
const char *path;
|
const char *path;
|
||||||
int fd;
|
int fd;
|
||||||
|
time_t last_log_time;
|
||||||
#if ENABLE_FEATURE_ROTATE_LOGFILE
|
#if ENABLE_FEATURE_ROTATE_LOGFILE
|
||||||
unsigned size;
|
unsigned size;
|
||||||
uint8_t isRegular;
|
uint8_t isRegular;
|
||||||
@ -165,7 +166,6 @@ struct globals {
|
|||||||
#if ENABLE_FEATURE_IPC_SYSLOG
|
#if ENABLE_FEATURE_IPC_SYSLOG
|
||||||
struct shbuf_ds *shbuf;
|
struct shbuf_ds *shbuf;
|
||||||
#endif
|
#endif
|
||||||
time_t last_log_time;
|
|
||||||
/* localhost's name. We print only first 64 chars */
|
/* localhost's name. We print only first 64 chars */
|
||||||
char *hostname;
|
char *hostname;
|
||||||
|
|
||||||
@ -588,15 +588,16 @@ static void log_locally(time_t now, char *msg, logFile_t *log_file)
|
|||||||
/* fd can't be 0 (we connect fd 0 to /dev/log socket) */
|
/* fd can't be 0 (we connect fd 0 to /dev/log socket) */
|
||||||
/* fd is 1 if "-O -" is in use */
|
/* fd is 1 if "-O -" is in use */
|
||||||
if (log_file->fd > 1) {
|
if (log_file->fd > 1) {
|
||||||
/* Reopen log file every second. This allows admin
|
/* Reopen log files every second. This allows admin
|
||||||
* to delete the file and not worry about restarting us.
|
* to delete the files and not worry about restarting us.
|
||||||
* This costs almost nothing since it happens
|
* 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)
|
if (!now)
|
||||||
now = time(NULL);
|
now = time(NULL);
|
||||||
if (G.last_log_time != now) {
|
if (log_file->last_log_time != now) {
|
||||||
G.last_log_time = now;
|
log_file->last_log_time = now;
|
||||||
close(log_file->fd);
|
close(log_file->fd);
|
||||||
goto reopen;
|
goto reopen;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user