Skip to content

Instantly share code, notes, and snippets.

@polovik
Last active August 29, 2015 13:57
Show Gist options
  • Save polovik/9617653 to your computer and use it in GitHub Desktop.
Save polovik/9617653 to your computer and use it in GitHub Desktop.
Log to file and log to syslog on Linux on C
#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