|
|
@@ -13,11 +13,7 @@ static char s_logfile[256] = DEFAULT_LOG_FILE;
|
|
|
static int s_loglevel = DEFAULT_LOG_LEVEL;
|
|
|
static bool s_logcolor = false;
|
|
|
static int s_remain_days = DEFAULT_LOG_REMAIN_DAYS;
|
|
|
-
|
|
|
-static FILE* s_logfp = NULL;
|
|
|
static char s_logbuf[LOG_BUFSIZE];
|
|
|
-static char s_cur_logfile[256] = {0};
|
|
|
-static time_t s_last_logfile_ts = 0;
|
|
|
static std::mutex s_mutex;
|
|
|
|
|
|
static void ts_logfile(time_t ts, char* buf, int len) {
|
|
|
@@ -30,29 +26,33 @@ static void ts_logfile(time_t ts, char* buf, int len) {
|
|
|
}
|
|
|
|
|
|
static FILE* shift_logfile() {
|
|
|
- if (s_logfp == NULL) {
|
|
|
- hlog_set_file(s_logfile);
|
|
|
- }
|
|
|
+ static FILE* s_logfp = NULL;
|
|
|
+ static char s_cur_logfile[256] = {0};
|
|
|
+ static time_t s_last_logfile_ts = time(NULL);
|
|
|
+
|
|
|
time_t ts_now = time(NULL);
|
|
|
- if (ts_now / SECONDS_PER_DAY - s_last_logfile_ts / SECONDS_PER_DAY) {
|
|
|
- // shift every day
|
|
|
- ts_logfile(ts_now, s_cur_logfile, sizeof(s_cur_logfile));
|
|
|
+ int interval_days = ts_now / SECONDS_PER_DAY - s_last_logfile_ts / SECONDS_PER_DAY;
|
|
|
+ if (s_logfp == NULL || interval_days > 0) {
|
|
|
if (s_logfp) {
|
|
|
fclose(s_logfp);
|
|
|
s_logfp = NULL;
|
|
|
}
|
|
|
- s_logfp = fopen(s_cur_logfile, "a");
|
|
|
- s_last_logfile_ts = ts_now;
|
|
|
- // remove logfile before s_remain_days
|
|
|
- if (s_remain_days > 0) {
|
|
|
- time_t ts_rm = ts_now - s_remain_days * SECONDS_PER_DAY;
|
|
|
+ // remove [today-interval_days, today-s_remain_days] logfile
|
|
|
+ if (interval_days >= s_remain_days) {
|
|
|
char rm_logfile[256] = {0};
|
|
|
- ts_logfile(ts_rm, rm_logfile, sizeof(rm_logfile));
|
|
|
- remove(rm_logfile);
|
|
|
+ for (int i = interval_days; i >= s_remain_days; --i) {
|
|
|
+ time_t ts_rm = ts_now - i * SECONDS_PER_DAY;
|
|
|
+ ts_logfile(ts_rm, rm_logfile, sizeof(rm_logfile));
|
|
|
+ remove(rm_logfile);
|
|
|
+ }
|
|
|
}
|
|
|
+ // new today logfile
|
|
|
+ ts_logfile(ts_now, s_cur_logfile, sizeof(s_cur_logfile));
|
|
|
+ s_logfp = fopen(s_cur_logfile, "a"); // note: append-mode for multi-processes
|
|
|
+ s_last_logfile_ts = ts_now;
|
|
|
}
|
|
|
else {
|
|
|
- // reopen if too big
|
|
|
+ // rewrite if too big
|
|
|
if (s_logfp && ftell(s_logfp) > MAX_LOG_FILESIZE) {
|
|
|
fclose(s_logfp);
|
|
|
s_logfp = NULL;
|