Last active
August 29, 2015 13:57
-
-
Save polovik/9617653 to your computer and use it in GitHub Desktop.
Log to file and log to syslog on Linux on C
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdarg.h> | |
#include <syslog.h> | |
#include <time.h> | |
/** | |
* \brief Log levels. Used to control applications's verbosity. | |
* | |
* Verbosity is as follows: LOG_CRITICAL_ERROR is least verbose, | |
* LOG_EVENT is the most verbose log level. | |
*/ | |
typedef enum { | |
/** \brief A flag to indicate that _critical_ error message is logged. */ | |
LOG_CRITICAL_ERROR, | |
/** \brief A flag to indicate that error message is logged. */ | |
LOG_ERROR, | |
/** \brief A flag to indicate that warning message is logged. */ | |
LOG_WARNING, | |
/** \brief A flag to indicate that some diagnostic message is logged. */ | |
LOG_INFO, | |
/** \brief A flag to indicate that some message is logged to special log */ | |
LOG_SPECIAL | |
} log_e; | |
log_e g_log_verbosity = LOG_WARNING; | |
static const char* g_log_message_names[] = | |
{ | |
"CRITICAL ERROR", | |
"ERROR", | |
"WARNING", | |
"INFO" | |
}; | |
void log(log_e level, char* format, ...) | |
{ | |
FILE *stream; | |
if (level == LOG_SPECIAL) { | |
char buf[300]; | |
sprintf(buf, "APP: "); | |
va_list argptr; | |
va_start(argptr, format); | |
vsnprintf(&buf[strlen(buf)], sizeof(buf - strlen(buf)), format, argptr); | |
va_end(argptr); | |
openlog ("AppName", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL2); | |
syslog (LOG_INFO, buf); | |
} | |
if (level > g_log_verbosity) | |
return; | |
if (g_log_verbosity == LOG_SPECIAL) { | |
char log_name[50]; | |
if (strlen(username) > 0) | |
snprintf(log_name, sizeof(log_name), "%s.log", username); | |
else | |
return; | |
stream = fopen(log_name, "a+"); | |
if (stream == NULL) { | |
perror("Writing to log file"); | |
return; | |
} | |
} else | |
stream = stderr; | |
time_t sec_since_Epoch = time(NULL); | |
struct tm *date_time = localtime(&sec_since_Epoch); | |
fprintf(stream, "%02d:%02d:%02d %s: ", date_time->tm_hour, date_time->tm_min, | |
date_time->tm_sec, g_log_message_names[level]); | |
va_list argptr; | |
va_start(argptr, format); | |
vfprintf(stream, format, argptr); | |
va_end(argptr); | |
fprintf(stream, "\n"); | |
if ((g_log_verbosity == LOG_SPECIAL) && (stream != NULL)) { | |
int status = fclose(stream); | |
if (status != 0) { | |
perror("Closing log file"); | |
return; | |
} | |
} | |
} | |
void set_log_verbosity(log_e level) | |
{ | |
g_log_verbosity = level; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment