static void rotate_log() { time_t rawtime; struct tm * timeinfo; time(&rawtime); timeinfo = localtime(&rawtime); // rotate log next day at 00:00:00 timeinfo->tm_hour = timeinfo->tm_min = timeinfo->tm_sec = 0; log_rotate_time = mktime(timeinfo); log_rotate_time += 60 * 60 * 24; // +24h // change filename char filename[256]; strftime(filename, arrayof(filename), LOG_FILENAME, timeinfo); logger_file_open(filename); assert(log_file != NULL); }
int logger_open( log_level_t level, const char *type, const char *ident, int option, const char *facility, const char *logfile) { int error = 0; char *dup_logfile = NULL; ASSERT(g_logger != NULL); ASSERT(type != NULL); if (strcasecmp(type, "file") == 0 && (logfile == NULL || logfile[0] == '\0')) { errno = EINVAL; return 1; } if (logfile && logfile != '\0') { dup_logfile = strdup(logfile); if (dup_logfile == NULL) { return 1; } } if (g_logger->log_state == LOG_ST_OPENED) { if (g_logger->log_type == LOG_TYPE_VALUE_FILE) { if (g_logger->log == NULL) { fprintf(stderr, "did not opened log file %s.", g_logger->logfilename); } else { fclose(g_logger->log); g_logger->log = NULL; } free(g_logger->logfilename); g_logger->logfilename = NULL; } else if (g_logger->log_type == LOG_TYPE_VALUE_SYSLOG) { closelog(); } g_logger->log_state = LOG_ST_CLOSED; g_logger->log_type = LOG_TYPE_VALUE_STDERR; } if (strcasecmp(type, LOG_TYPE_FILE) == 0) { if (logger_file_open(dup_logfile)) { g_logger->log_type = LOG_TYPE_VALUE_STDERR; } else { g_logger->log_type = LOG_TYPE_VALUE_FILE; g_logger->logfilename = dup_logfile; } } else if (strcasecmp(type, LOG_TYPE_SYSLOG) == 0) { logger_syslog_open(ident, option, facility); g_logger->log_type = LOG_TYPE_VALUE_SYSLOG; } else if (strcasecmp(type, LOG_TYPE_STDOUT) == 0) { g_logger->log_type = LOG_TYPE_VALUE_STDOUT; } else { g_logger->log_type = LOG_TYPE_VALUE_STDERR; } g_logger->log_state = LOG_ST_OPENED; if (g_logger->log_type != LOG_TYPE_VALUE_FILE) { free(dup_logfile); } if (level > LOG_LV_MIN && level < LOG_LV_MAX) { g_logger->verbose_level = level; } else { g_logger->verbose_level = DEFAULT_VERBOSE_LEVEL; } g_logger->pid = getpid(); if (error) { free(dup_logfile); } else { if (g_logger->verbose_level >= LOG_LV_DEBUG) { LOG(LOG_LV_DEBUG, "logging info: type = %d, level %d, state %d, pid %d", g_logger->log_type, g_logger->verbose_level, g_logger->log_state, g_logger->pid); } } return error; }