From ea9bc5326117d80855bd083e77130e3263b6ed5d Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Sun, 12 Jun 2016 13:40:23 +0800 Subject: [PATCH] reopen log file when recv signal HUP --- service-src/service_logger.c | 28 ++++++++++++++++++++++------ skynet-src/skynet_start.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/service-src/service_logger.c b/service-src/service_logger.c index 122cc77f..e73300e3 100644 --- a/service-src/service_logger.c +++ b/service-src/service_logger.c @@ -3,9 +3,11 @@ #include #include #include +#include struct logger { FILE * handle; + char * filename; int close; }; @@ -14,6 +16,8 @@ logger_create(void) { struct logger * inst = skynet_malloc(sizeof(*inst)); inst->handle = NULL; inst->close = 0; + inst->filename = NULL; + return inst; } @@ -22,16 +26,26 @@ logger_release(struct logger * inst) { if (inst->close) { fclose(inst->handle); } + skynet_free(inst->filename); skynet_free(inst); } static int -_logger(struct skynet_context * context, void *ud, int type, int session, uint32_t source, const void * msg, size_t sz) { +logger_cb(struct skynet_context * context, void *ud, int type, int session, uint32_t source, const void * msg, size_t sz) { struct logger * inst = ud; - fprintf(inst->handle, "[:%08x] ",source); - fwrite(msg, sz , 1, inst->handle); - fprintf(inst->handle, "\n"); - fflush(inst->handle); + switch (type) { + case PTYPE_SYSTEM: + if (inst->filename) { + inst->handle = freopen(inst->filename, "a", inst->handle); + } + break; + case PTYPE_TEXT: + fprintf(inst->handle, "[:%08x] ",source); + fwrite(msg, sz , 1, inst->handle); + fprintf(inst->handle, "\n"); + fflush(inst->handle); + break; + } return 0; } @@ -43,12 +57,14 @@ logger_init(struct logger * inst, struct skynet_context *ctx, const char * parm) if (inst->handle == NULL) { return 1; } + inst->filename = skynet_malloc(strlen(parm)+1); + strcpy(inst->filename, parm); inst->close = 1; } else { inst->handle = stdout; } if (inst->handle) { - skynet_callback(ctx, inst, _logger); + skynet_callback(ctx, inst, logger_cb); skynet_command(ctx, "REG", ".logger"); return 0; } diff --git a/skynet-src/skynet_start.c b/skynet-src/skynet_start.c index 5345c76c..a7b1d70b 100644 --- a/skynet-src/skynet_start.c +++ b/skynet-src/skynet_start.c @@ -16,6 +16,7 @@ #include #include #include +#include struct monitor { int count; @@ -32,6 +33,15 @@ struct worker_parm { int weight; }; +static int SIG = 0; + +static void +handle_hup(int signal) { + if (signal == SIGHUP) { + SIG = 1; + } +} + #define CHECK_ABORT if (skynet_context_total()==0) break; static void @@ -100,6 +110,21 @@ thread_monitor(void *p) { return NULL; } +static void +signal_hup() { + // make log file reopen + + struct skynet_message smsg; + smsg.source = 0; + smsg.session = 0; + smsg.data = NULL; + smsg.sz = (size_t)PTYPE_SYSTEM << MESSAGE_TYPE_SHIFT; + uint32_t logger = skynet_handle_findname("logger"); + if (logger) { + skynet_context_push(logger, &smsg); + } +} + static void * thread_timer(void *p) { struct monitor * m = p; @@ -109,6 +134,10 @@ thread_timer(void *p) { CHECK_ABORT wakeup(m,m->count-1); usleep(2500); + if (SIG) { + signal_hup(); + SIG = 0; + } } // wakeup socket thread skynet_socket_exit(); @@ -216,6 +245,13 @@ bootstrap(struct skynet_context * logger, const char * cmdline) { void skynet_start(struct skynet_config * config) { + // register SIGHUP for log file reopen + struct sigaction sa; + sa.sa_handler = &handle_hup; + sa.sa_flags = SA_RESTART; + sigfillset(&sa.sa_mask); + sigaction(SIGHUP, &sa, NULL); + if (config->daemon) { if (daemon_init(config->daemon)) { exit(1);