delete log old files with any time format affix

pull/2/head
yuqing 2014-09-16 11:26:17 +08:00
parent acc17549ee
commit 757a3b96a7
2 changed files with 144 additions and 18 deletions

View File

@ -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

View File

@ -13,6 +13,7 @@
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include <dirent.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
@ -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,6 +415,32 @@ int log_delete_old_files(void *args)
return 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) != '%')
{
break;
}
if (*p == 'd' || *p == 'm' || *p == 'Y' || *p == 'y')
{
break;
}
p -= 2;
}
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;
@ -340,13 +456,22 @@ int log_delete_old_files(void *args)
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)
{