Skip to content

Commit

Permalink
Support a rolling log file based on size.
Browse files Browse the repository at this point in the history
  • Loading branch information
mmichalek committed Dec 22, 2015
1 parent 84cc40c commit 00baaa5
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 1 deletion.
8 changes: 7 additions & 1 deletion symmetric-client-clib/inc/common/Log.h
Expand Up @@ -23,12 +23,15 @@
#define SYM_LOG_H

#include <stdio.h>
#include <stdarg.h>
#include <errno.h>
#include <time.h>
#include <libgen.h>
#include <dirent.h>
#include "util/StringBuilder.h"
#include "util/Properties.h"
#include "util/Date.h"
#include "util/StringUtils.h"
#include "util/FileUtils.h"

typedef enum {SYM_LOG_LEVEL_DEBUG, SYM_LOG_LEVEL_INFO, SYM_LOG_LEVEL_WARN, SYM_LOG_LEVEL_ERROR} SymLogLevel;

Expand All @@ -37,6 +40,9 @@ typedef enum {SYM_LOG_LEVEL_DEBUG, SYM_LOG_LEVEL_INFO, SYM_LOG_LEVEL_WARN, SYM_L
#define SYM_LOG_SETTINGS_LOG_LEVEL "client.log.level"
#define SYM_LOG_SETTINGS_LOG_DESTINATION "client.log.destination"
#define SYM_LOG_SETTINGS_LOG_SHOW_SOURCE_FILE "client.log.show.source.file"
#define SYM_LOG_SETTINGS_LOG_MAX_FILE_SIZE "client.log.max.file.size"
#define SYM_LOG_SETTINGS_LOG_BACKUP_APPEND "client.log.backup.append"
#define SYM_LOG_SETTINGS_LOG_DAYS_TO_KEEP "client.log.backup.days.to.keep"

#define SYM_LOG_LEVEL_DESC_DEBUG "DEBUG"
#define SYM_LOG_LEVEL_DESC_INFO "INFO"
Expand Down
2 changes: 2 additions & 0 deletions symmetric-client-clib/inc/util/FileUtils.h
Expand Up @@ -28,5 +28,7 @@
#include "common/Log.h"

int SymFileUtils_mkdir(char* dirName);
int SymFileUtils_getFileSize(char *filename);
unsigned short SymFileUtils_exists(char *filename);

#endif
86 changes: 86 additions & 0 deletions symmetric-client-clib/src/common/Log.c
Expand Up @@ -19,10 +19,14 @@
* under the License.
*/
#include "common/Log.h"
#include <sys/stat.h>

static int SymLog_logLevel = SYM_LOG_LEVEL_DEBUG;
static unsigned short SymLog_showSourceFile = 0;
static char* SymLog_destination = "console";
static int SymLog_maxLogSize = 10485760;
static char* SymLog_backupAppend = "%Y-%m-%dT%H.%M.%S";
static int SymLog_daysToKeep = 10;

static char* SymLog_getlogLevelDescription(SymLogLevel logLevel) {
switch (logLevel) {
Expand Down Expand Up @@ -68,6 +72,84 @@ void SymLog_configure(SymProperties *settings) {
SymLog_showSourceFile = SymStringUtils_equals(showSourceFile, "1")
|| SymStringUtils_equalsIgnoreCase(showSourceFile, "true");
}

char *maxLogSize = settings->get(settings, SYM_LOG_SETTINGS_LOG_MAX_FILE_SIZE, "10485760");
if (! SymStringUtils_isBlank(maxLogSize)) {
SymLog_maxLogSize = atoi(maxLogSize);
}

char *backupAppend = settings->get(settings, SYM_LOG_SETTINGS_LOG_BACKUP_APPEND, "%Y-%m-%dT%H.%M.%S");
if (! SymStringUtils_isBlank(backupAppend)) {
SymLog_backupAppend = backupAppend;
}

char *daysToKeep = settings->get(settings, SYM_LOG_SETTINGS_LOG_DAYS_TO_KEEP, "10");
if (! SymStringUtils_isBlank(daysToKeep)) {
SymLog_daysToKeep = atoi(daysToKeep);
}
}

void SymLog_cleanupLogs(char *logFileName) {
if (SymLog_daysToKeep > 0) {
time_t nowInSeconds = time(NULL);
time_t timeToKeepInSeconds = SymLog_daysToKeep*24*60*60;
time_t logExpiryTime = nowInSeconds-timeToKeepInSeconds;

char *logFileBaseName = basename(logFileName);
char *logDirName = dirname(logFileName);
DIR *logDir;

logDir = opendir(logDirName);
struct dirent *directoryEntry;

struct stat fileStatus;

if (logDir != NULL) {
while ((directoryEntry = readdir(logDir)) != NULL) {
char *name = directoryEntry->d_name;
if (SymStringUtils_startsWith(name, logFileBaseName)
&& ! SymStringUtils_equals(name, logFileBaseName)) {

char *archivedLogFileName = SymStringUtils_format("%s/%s", logDirName, name);
stat(archivedLogFileName, &fileStatus);
if (fileStatus.st_mtime < logExpiryTime) {
int result = remove(archivedLogFileName);
if (result != 0) {
printf("Failed to remove '%s' %s\n", archivedLogFileName, strerror(errno));
}
}
free(archivedLogFileName);
}
}
closedir(logDir);
}
}
}

void SymLog_rollLogFile(char *logFileName) {
char *dateTimeString = calloc(24, sizeof(char));
time_t now = time(NULL);
struct tm *timeInfo = localtime(&now);
strftime(dateTimeString, 24, SymLog_backupAppend, timeInfo);

char *rolledFileName = SymStringUtils_format("%s%s", logFileName, dateTimeString);

int result = rename(logFileName, rolledFileName);
if (result != 0) {
printf("Failed to rename '%s' to '%s' %s\n", logFileName, dateTimeString,
strerror(errno));
}

SymLog_cleanupLogs(logFileName);
}

void SymLog_rollIfNeeded(char *logFileName) {
if (SymLog_maxLogSize > 0) {
int fileSize = SymFileUtils_getFileSize(logFileName);
if (fileSize > SymLog_maxLogSize) {
SymLog_rollLogFile(logFileName);
}
}
}

/** This is the central place where all logging funnels through. */
Expand Down Expand Up @@ -131,9 +213,13 @@ void SymLog_log(SymLogLevel logLevel, const char *functionName, const char *file
fflush(destination);
if (physicalFile) {
fclose(destination);
SymLog_rollIfNeeded(SymLog_destination);

}

date->destroy(date);
messageBuffer->destroy(messageBuffer);
}



18 changes: 18 additions & 0 deletions symmetric-client-clib/src/util/FileUtils.c
Expand Up @@ -56,3 +56,21 @@ int SymFileUtils_mkdir(char* dirName) {

return result;
}

int SymFileUtils_getFileSize(char *filename) {
struct stat st;

if (stat(filename, &st) == 0) {
return st.st_size;
}

return -1;
}

unsigned short SymFileUtils_exists(char *filename) {
if( access( filename, F_OK ) != -1 ) {
return 1;
} else {
return 0;
}
}

0 comments on commit 00baaa5

Please sign in to comment.