From 757a3b96a71ca350c846bd501232cf756395160e Mon Sep 17 00:00:00 2001 From: yuqing Date: Tue, 16 Sep 2014 11:26:17 +0800 Subject: [PATCH] delete log old files with any time format affix --- HISTORY | 3 +- src/logger.c | 159 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 144 insertions(+), 18 deletions(-) diff --git a/HISTORY b/HISTORY index 0df1230..739ef3b 100644 --- a/HISTORY +++ b/HISTORY @@ -1,9 +1,10 @@ -Version 1.07 2014-09-15 +Version 1.07 2014-09-16 * increment alloc task buffer * add function free_queue_alloc_connections * check file size before log access header * conn_pool_destroy close connections and free memory + * delete log old files with any time format affix Version 1.06 2014-08-27 * update source code from FastDFS V5.02 diff --git a/src/logger.c b/src/logger.c index e3b90a9..2fa87fd 100644 --- a/src/logger.c +++ b/src/logger.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -301,13 +302,102 @@ int log_notify_rotate(void *args) return 0; } +static int log_delete_matched_old_files(LogContext *pContext, + const int prefix_len) +{ + char rotate_time_format_prefix[32]; + char log_filepath[MAX_PATH_SIZE]; + char filename_prefix[MAX_PATH_SIZE + 32]; + char full_filename[MAX_PATH_SIZE + 32]; + int prefix_filename_len; + int result; + int len; + char *p; + char *log_filename; + DIR *dir; + struct dirent ent; + struct dirent *pEntry; + time_t the_time; + struct tm tm; + + p = strrchr(pContext->log_filename, '/'); + if (p == NULL) + { + *log_filepath = '.'; + *(log_filepath + 1) = '/'; + *(log_filepath + 2) = '\0'; + log_filename = pContext->log_filename; + } + else + { + int path_len; + path_len = (p - pContext->log_filename) + 1; + memcpy(log_filepath, pContext->log_filename, path_len); + *(log_filepath + path_len) = '\0'; + log_filename = p + 1; + } + + memcpy(rotate_time_format_prefix, pContext->rotate_time_format, prefix_len); + *(rotate_time_format_prefix + prefix_len) = '\0'; + + dir = opendir(log_filepath); + if (dir == NULL) + { + fprintf(stderr, "file: "__FILE__", line: %d, " \ + "opendir %s fail, errno: %d, error info: %s\n", \ + __LINE__, log_filepath, errno, STRERROR(errno)); + return errno != 0 ? errno : ENOENT; + } + + result = 0; + the_time = get_current_time() - (pContext->keep_days + 1) * 86400; + localtime_r(&the_time, &tm); + memset(filename_prefix, 0, sizeof(filename_prefix)); + len = sprintf(filename_prefix, "%s.", log_filename); + strftime(filename_prefix + len, sizeof(filename_prefix) - len, + rotate_time_format_prefix, &tm); + prefix_filename_len = strlen(filename_prefix); + while (readdir_r(dir, &ent, &pEntry) == 0) + { + if (pEntry == NULL) + { + break; + } + + if ((int)strlen(pEntry->d_name) >= prefix_filename_len && + memcmp(pEntry->d_name, filename_prefix, + prefix_filename_len) == 0) + { + snprintf(full_filename, sizeof(full_filename), "%s%s", + log_filepath, pEntry->d_name); + fprintf(stderr, "full_filename: %s\n", full_filename); + if (unlink(full_filename) != 0) + { + if (errno != ENOENT) + { + fprintf(stderr, "file: "__FILE__", line: %d, " \ + "unlink %s fail, errno: %d, error info: %s\n", \ + __LINE__, full_filename, errno, STRERROR(errno)); + result = errno != 0 ? errno : EPERM; + break; + } + } + } + } + + closedir(dir); + return result; +} + int log_delete_old_files(void *args) { LogContext *pContext; + char *p; char old_filename[MAX_PATH_SIZE + 32]; + int full_len; + int prefix_len; int len; struct tm tm; - time_t the_time; if (args == NULL) { @@ -325,27 +415,62 @@ int log_delete_old_files(void *args) return 0; } - the_time = get_current_time() - pContext->keep_days * 86400; - while (1) { - the_time -= 86400; - localtime_r(&the_time, &tm); - memset(old_filename, 0, sizeof(old_filename)); - len = sprintf(old_filename, "%s.", pContext->log_filename); - strftime(old_filename + len, sizeof(old_filename) - len, - pContext->rotate_time_format, &tm); - if (unlink(old_filename) != 0) + full_len = strlen(pContext->rotate_time_format); + p = pContext->rotate_time_format + full_len - 1; + while (p > pContext->rotate_time_format) + { + if (*(p-1) != '%') { - if (errno != ENOENT) - { - fprintf(stderr, "file: "__FILE__", line: %d, " \ - "unlink %s fail, errno: %d, error info: %s\n", \ - __LINE__, old_filename, errno, STRERROR(errno)); - } break; } + if (*p == 'd' || *p == 'm' || *p == 'Y' || *p == 'y') + { + break; + } + + p -= 2; } - return 0; + prefix_len = (p - pContext->rotate_time_format) + 1; + if (prefix_len == 0) + { + return EINVAL; + } + + if (prefix_len == full_len) + { + time_t the_time; + + the_time = get_current_time() - pContext->keep_days * 86400; + while (1) { + the_time -= 86400; + localtime_r(&the_time, &tm); + memset(old_filename, 0, sizeof(old_filename)); + len = sprintf(old_filename, "%s.", pContext->log_filename); + strftime(old_filename + len, sizeof(old_filename) - len, + pContext->rotate_time_format, &tm); + if (unlink(old_filename) != 0) + { + if (errno != ENOENT) + { + fprintf(stderr, "file: "__FILE__", line: %d, " \ + "unlink %s fail, errno: %d, error info: %s\n", \ + __LINE__, old_filename, errno, STRERROR(errno)); + return errno != 0 ? errno : EPERM; + } + else + { + break; + } + } + } + + return 0; + } + else + { + return log_delete_matched_old_files(pContext, prefix_len); + } } int log_rotate(LogContext *pContext)