clog.c
Go to the documentation of this file.
00001 #include "stdafx.h"
00002 #include "clog.h"
00003 
00004 static FILE *logFile = NULL;
00005 CPhidgetLog_level logging_level = 0;
00006 
00007 /* Protects logFile, logging_level - thread safe */
00008 int logLockInitialized = PFALSE;
00009 CThread_mutex_t logLock;
00010 
00011 static const char *
00012 logLevelToStr(CPhidgetLog_level l)
00013 {
00014         switch (l) {
00015         case PHIDGET_LOG_CRITICAL:
00016                 return "CRIT";
00017         case PHIDGET_LOG_ERROR:
00018                 return "ERR";
00019         case PHIDGET_LOG_WARNING:
00020                 return "WARN";
00021         case PHIDGET_LOG_DEBUG:
00022                 return "DEBUG";
00023         case PHIDGET_LOG_INFO:
00024                 return "INFO";
00025         case PHIDGET_LOG_VERBOSE:
00026                 return "VERBOSE";
00027         }
00028         return "???";
00029 }
00030 
00031 PHIDGET21_API int CCONV CPhidget_enableLogging(CPhidgetLog_level level, const char *outputFile)
00032 {       
00033         if(!logLockInitialized)
00034         {
00035                 CThread_mutex_init(&logLock);
00036                 logLockInitialized = PTRUE;
00037         }
00038         CThread_mutex_lock(&logLock);
00039         logging_level = level;
00040         if(outputFile == NULL)
00041                 logFile = NULL;
00042         else
00043         {
00044                 logFile = fopen(outputFile,"a");
00045 #ifndef _WINDOWS
00046                 if(!logFile)
00047                 {
00048                         CThread_mutex_unlock(&logLock);
00049                         switch(errno)
00050                         {
00051                                 case EACCES:
00052                                         LOG(PHIDGET_LOG_WARNING, "Permission denied for specified logfile. Logging to stdout.");
00053                                         break;
00054                                 defualt:
00055                                         LOG(PHIDGET_LOG_WARNING, "Logfile fopen failed with code: %d",errno);
00056                         }
00057                         CThread_mutex_lock(&logLock);
00058                 }
00059 #endif
00060         }
00061         CThread_mutex_unlock(&logLock);
00062         LOG(PHIDGET_LOG_INFO, "Enabling logging");
00063         return EPHIDGET_OK;
00064 }
00065 
00066 PHIDGET21_API int CCONV CPhidget_disableLogging()
00067 {
00068         if(!logLockInitialized)
00069         {
00070                 CThread_mutex_init(&logLock);
00071                 logLockInitialized = PTRUE;
00072         }
00073         LOG(PHIDGET_LOG_INFO, "Disabling logging");
00074         CThread_mutex_lock(&logLock);
00075         if(logFile!=NULL && logFile!=stdout && logFile!=stderr)
00076                 fclose(logFile);
00077         logFile = NULL;
00078         logging_level = 0;
00079         CThread_mutex_unlock(&logLock);
00080         return EPHIDGET_OK;
00081 }
00082 
00083 //if outputting to a file, it is designed to be CSV compliant
00084 //only print out debug logs in debug library
00085 PHIDGET21_API int CCONV CPhidget_log(CPhidgetLog_level level, const char *msg, const char *fmt, ...)
00086 {
00087         size_t threadID = 0;
00088         int logToStderr = (int)level & LOG_TO_STDERR;
00089         va_list va;
00090         level = level & 0xFF;
00091 #ifdef DEBUG
00092         if(level <= logging_level || level == PHIDGET_LOG_DEBUG || logToStderr)
00093 #else
00094         if((level <= logging_level && level != PHIDGET_LOG_DEBUG) || logToStderr)
00095 #endif
00096         {
00097                 if(!logLockInitialized)
00098                 {
00099                         CThread_mutex_init(&logLock);
00100                         logLockInitialized = PTRUE;
00101                 }
00102                 CThread_mutex_lock(&logLock);
00103                 if (!logFile)
00104                         logFile = stdout;
00105 #ifdef WINCE
00106                 if(logToStderr)
00107                         fprintf(stderr, "%s: ",logLevelToStr(level));
00108                 else if(logFile==stdout)
00109                         fprintf(logFile, "%s: ",logLevelToStr(level));
00110                 else
00111                         fprintf(logFile, "%d,\"%s\",%s,\"", threadID, msg, logLevelToStr(level));
00112                 va_start(va, fmt);
00113                 if(logToStderr)
00114                 {
00115                         vfprintf(stderr, fmt, va);
00116                         va_end(va);
00117                         fprintf(stderr, "\n");
00118                         fflush(stderr);
00119                 }
00120                 else
00121                 {
00122                         vfprintf(logFile, fmt, va);
00123                         va_end(va);
00124                         if(logFile==stdout)
00125                                 fprintf(logFile, "\n");
00126                         else
00127                                 fprintf(logFile, "\"\n");
00128                         fflush(logFile);
00129                 }
00130 #else //!WINCE
00131                 {
00132                         char date[50];
00133                         struct tm *tmp;
00134                         time_t t;
00135                         time(&t);
00136  #ifndef _WINDOWS
00137                         struct tm tm;
00138                         localtime_r(&t, &tm);
00139                         tmp = &tm;
00140                         threadID = (size_t)pthread_self();
00141  #else
00142                         tmp = localtime(&t);
00143                         threadID = (size_t)GetCurrentThreadId();
00144  #endif
00145                         if (!strftime(date, sizeof (date), "%c", tmp))
00146                                 strncpy(date, "?", sizeof (date));
00147                         if(logToStderr)
00148                                 fprintf(stderr, "%s: ",logLevelToStr(level));
00149                         else if(logFile==stdout)
00150                                 fprintf(logFile, "%s: ",logLevelToStr(level));
00151                         else
00152                                 fprintf(logFile, "%s,%d,\"%s\",%s,\"", date, (int)threadID, msg, logLevelToStr(level));
00153                         va_start(va, fmt);
00154                         if(logToStderr)
00155                         {
00156                                 vfprintf(stderr, fmt, va);
00157                                 va_end(va);
00158                                 fprintf(stderr, "\n");
00159                                 fflush(stderr);
00160                         }
00161                         else
00162                         {
00163                                 vfprintf(logFile, fmt, va);
00164                                 va_end(va);
00165                                 if(logFile==stdout)
00166                                         fprintf(logFile, "\n");
00167                                 else
00168                                         fprintf(logFile, "\"\n");
00169                                 fflush(logFile);
00170                         }
00171                 }
00172 #endif
00173                 CThread_mutex_unlock(&logLock);
00174         }
00175         return EPHIDGET_OK;
00176 }


pedal_monitor
Author(s): Pedro Mendes
autogenerated on Fri Jun 6 2014 18:37:20