00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _PASSENGER_LOGGING_H_
00021 #define _PASSENGER_LOGGING_H_
00022
00023 #include <sys/types.h>
00024 #include <sys/time.h>
00025 #include <unistd.h>
00026 #include <ostream>
00027 #include <ctime>
00028
00029 namespace Passenger {
00030
00031 using namespace std;
00032
00033 extern unsigned int _logLevel;
00034 extern ostream *_logStream;
00035 extern ostream *_debugStream;
00036
00037 unsigned int getLogLevel();
00038 void setLogLevel(unsigned int value);
00039 void setDebugFile(const char *logFile = NULL);
00040
00041
00042
00043
00044 #define P_LOG(expr) \
00045 do { \
00046 if (Passenger::_logStream != 0) { \
00047 time_t the_time = time(NULL); \
00048 struct tm *the_tm = localtime(&the_time); \
00049 char datetime_buf[60]; \
00050 struct timeval tv; \
00051 strftime(datetime_buf, sizeof(datetime_buf), "%x %H:%M:%S", the_tm); \
00052 gettimeofday(&tv, NULL); \
00053 *Passenger::_logStream << \
00054 "[ pid=" << getpid() << " file=" << __FILE__ << ":" << __LINE__ << \
00055 " time=" << datetime_buf << "." << (tv.tv_usec / 1000) << " ]:" << \
00056 "\n " << expr << std::endl; \
00057 } \
00058 } while (false)
00059
00060
00061
00062
00063
00064 #define P_WARN(expr) P_LOG(expr)
00065
00066
00067
00068
00069
00070 #define P_ERROR(expr) P_LOG(expr)
00071
00072
00073
00074
00075
00076 #define P_DEBUG(expr) P_TRACE(1, expr)
00077
00078 #ifdef PASSENGER_DEBUG
00079 #define P_TRACE(level, expr) \
00080 do { \
00081 if (Passenger::_logLevel >= level) { \
00082 if (Passenger::_debugStream != 0) { \
00083 time_t the_time = time(NULL); \
00084 struct tm *the_tm = localtime(&the_time); \
00085 char datetime_buf[60]; \
00086 struct timeval tv; \
00087 strftime(datetime_buf, sizeof(datetime_buf), "%x %H:%M:%S", the_tm); \
00088 gettimeofday(&tv, NULL); \
00089 *Passenger::_debugStream << \
00090 "[ pid=" << getpid() << " file=" << __FILE__ << ":" << __LINE__ << \
00091 " time=" << datetime_buf << "." << (tv.tv_usec / 1000) << " ]:" << \
00092 "\n " << expr << std::endl; \
00093 } \
00094 } \
00095 } while (false)
00096
00097 #define P_ASSERT(expr, result_if_failed, message) \
00098 do { \
00099 if (!(expr)) { \
00100 P_ERROR("Assertion failed: " << message); \
00101 return result_if_failed; \
00102 } \
00103 } while (false)
00104 #else
00105 #define P_TRACE(level, expr) do { } while (false)
00106
00107 #define P_ASSERT(expr, result_if_failed, message) do { } while (false)
00108 #endif
00109
00110 }
00111
00112 #endif
00113