delete log old files with any time format affix
parent
acc17549ee
commit
757a3b96a7
3
HISTORY
3
HISTORY
|
|
@ -1,9 +1,10 @@
|
||||||
|
|
||||||
Version 1.07 2014-09-15
|
Version 1.07 2014-09-16
|
||||||
* increment alloc task buffer
|
* increment alloc task buffer
|
||||||
* add function free_queue_alloc_connections
|
* add function free_queue_alloc_connections
|
||||||
* check file size before log access header
|
* check file size before log access header
|
||||||
* conn_pool_destroy close connections and free memory
|
* conn_pool_destroy close connections and free memory
|
||||||
|
* delete log old files with any time format affix
|
||||||
|
|
||||||
Version 1.06 2014-08-27
|
Version 1.06 2014-08-27
|
||||||
* update source code from FastDFS V5.02
|
* update source code from FastDFS V5.02
|
||||||
|
|
|
||||||
159
src/logger.c
159
src/logger.c
|
|
@ -13,6 +13,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <dirent.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
@ -301,13 +302,102 @@ int log_notify_rotate(void *args)
|
||||||
return 0;
|
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)
|
int log_delete_old_files(void *args)
|
||||||
{
|
{
|
||||||
LogContext *pContext;
|
LogContext *pContext;
|
||||||
|
char *p;
|
||||||
char old_filename[MAX_PATH_SIZE + 32];
|
char old_filename[MAX_PATH_SIZE + 32];
|
||||||
|
int full_len;
|
||||||
|
int prefix_len;
|
||||||
int len;
|
int len;
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t the_time;
|
|
||||||
|
|
||||||
if (args == NULL)
|
if (args == NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -325,27 +415,62 @@ int log_delete_old_files(void *args)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
the_time = get_current_time() - pContext->keep_days * 86400;
|
full_len = strlen(pContext->rotate_time_format);
|
||||||
while (1) {
|
p = pContext->rotate_time_format + full_len - 1;
|
||||||
the_time -= 86400;
|
while (p > pContext->rotate_time_format)
|
||||||
localtime_r(&the_time, &tm);
|
{
|
||||||
memset(old_filename, 0, sizeof(old_filename));
|
if (*(p-1) != '%')
|
||||||
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));
|
|
||||||
}
|
|
||||||
break;
|
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)
|
int log_rotate(LogContext *pContext)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue