15 const char file_sep
= '/';
17 Logger::Logger(const char *prefix
, int level
, unsigned size
, bool rollDate
)
18 : m_defaultLevel(level
), m_defaultSize(size
), m_dirPrefix(prefix
), m_rollDate(rollDate
)
23 logDir
= fopen(m_dirPrefix
.c_str(), "r+");
26 cmkdir(m_dirPrefix
.c_str(), 0755);
28 else if(logDir
!= NULL
)
34 time_t t
= time(NULL
);
35 localtime_r(&t
, &now
);
37 memcpy(&m_lastDateTime
, &now
, sizeof(tm
));
40 sprintf(buf
, "%s%c%2.2d-%2.2d-%2.2d", m_dirPrefix
.c_str(), file_sep
, (now
.tm_mon
+ 1), now
.tm_mday
, (now
.tm_year
% 100));
44 sprintf(buf
, "%s", m_dirPrefix
.c_str());
46 logDir
= fopen(buf
, "r+");
51 else if(logDir
!= NULL
)
60 map
<unsigned, LogInfo
*>::iterator iter
;
61 for(iter
= m_logTable
.begin(); iter
!= m_logTable
.end(); iter
++)
63 log((*iter
).first
, LOG_FILEONLY
, "---=== Log Stopped ===---");
64 fflush((*iter
).second
->file
);
65 fclose((*iter
).second
->file
);
66 delete((*iter
).second
);
72 void Logger::flush(unsigned logenum
)
74 map
<unsigned, LogInfo
*>::iterator iter
= m_logTable
.find(logenum
);
76 if(iter
!= m_logTable
.end())
78 LogInfo
*info
= (*iter
).second
;
84 void Logger::flushAll()
86 map
<unsigned, LogInfo
*>::iterator iter
;
88 for(iter
= m_logTable
.begin(); iter
!= m_logTable
.end(); iter
++)
90 LogInfo
*info
= (*iter
).second
;
96 void Logger::addLog(const char *id
, unsigned logenum
, int level
, unsigned size
)
98 LogInfo
*newLog
= new LogInfo
;
99 newLog
->filename
= m_logPrefix
+ file_sep
+ id
+ ".log";
104 newLog
->level
= level
;
106 m_logTable
.insert(pair
<unsigned, LogInfo
*>(logenum
, newLog
));
108 if(strcmp("stdout", id
) == 0)
110 newLog
->file
= stdout
;
112 else if(strcmp("stderr", id
) == 0)
114 newLog
->file
= stderr
;
118 newLog
->file
= fopen(newLog
->filename
.c_str(), "a+");
120 log(logenum
, LOG_FILEONLY
, "---=== Log Started ===---");
123 void Logger::addLog(const char *id
, unsigned logenum
)
125 LogInfo
*newLog
= new LogInfo
;
126 newLog
->filename
= m_logPrefix
+ file_sep
+ id
+ ".log";
129 newLog
->max
= m_defaultSize
;
131 newLog
->level
= m_defaultLevel
;
133 m_logTable
.insert(pair
<unsigned, LogInfo
*>(logenum
, newLog
));
135 if(strcmp("stdout", id
) == 0)
137 newLog
->file
= stdout
;
139 else if(strcmp("stderr", id
) == 0)
141 newLog
->file
= stderr
;
145 newLog
->file
= fopen(newLog
->filename
.c_str(), "a+");
147 log(logenum
, LOG_FILEONLY
, "---===Log Started ===---");
150 void Logger::updateLog(unsigned logenum
, int level
, unsigned size
)
152 map
<unsigned, LogInfo
*>::iterator iter
= m_logTable
.find(logenum
);
154 if(iter
!= m_logTable
.end())
156 (*iter
).second
->level
= level
;
157 (*iter
).second
->max
= size
;
161 void Logger::removeLog(unsigned logenum
)
163 map
<unsigned, LogInfo
*>::iterator iter
= m_logTable
.find(logenum
);
165 if(iter
!= m_logTable
.end())
167 log((*iter
).first
, LOG_ALWAYS
, "---=== Log Stopped ===---");
168 fflush((*iter
).second
->file
);
169 fclose((*iter
).second
->file
);
170 delete((*iter
).second
);
174 void Logger::logSimple(unsigned logenum
, int level
, const char *message
)
176 map
<unsigned, LogInfo
*>::iterator iter
= m_logTable
.find(logenum
);
177 if(iter
== m_logTable
.end())
181 time_t t
= time(NULL
);
182 LogInfo
*info
= (*iter
).second
;
183 if(level
>= info
->level
)
187 if(level
== LOG_FILEONLY
&& ((info
->file
== stderr
) || (info
->file
== stdout
)))
193 memcpy(&info
->ts
, localtime(&t
), sizeof(tm
));
197 if(m_rollDate
&& info
->ts
.tm_mday
!= m_lastDateTime
.tm_mday
)
199 #if defined(_REENTRANT)
202 if(info
->ts
.tm_mday
!= m_lastDateTime
.tm_mday
)
204 memcpy(&m_lastDateTime
, &info
->ts
, sizeof(tm
));
207 #if defined(_REENTRANT)
211 if(iter
!= m_logTable
.end())
215 int tmp
= fprintf(info
->file
, "[%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d] %s\n", (info
->ts
.tm_mon
+ 1), info
->ts
.tm_mday
, (info
->ts
.tm_year
% 100), info
->ts
.tm_hour
, info
->ts
.tm_min
, info
->ts
.tm_sec
, message
);
217 if(info
->used
> info
->max
)
225 fprintf(info
->file
, "[%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d] %s\n", (info
->ts
.tm_mon
+ 1), info
->ts
.tm_mday
, (info
->ts
.tm_year
% 100), info
->ts
.tm_hour
, info
->ts
.tm_min
, info
->ts
.tm_sec
, message
);
230 void Logger::log(unsigned logenum
, int level
, const char *message
, ...)
234 va_start(varg
, message
);
235 vsnprintf(buf
, 2047, message
, varg
);
239 map
<unsigned, LogInfo
*>::iterator iter
= m_logTable
.find(logenum
);
240 if(iter
== m_logTable
.end())
244 time_t t
= time(NULL
);
245 LogInfo
*info
= (*iter
).second
;
246 if(level
>= info
->level
)
250 if(level
== LOG_FILEONLY
&& ((info
->file
== stderr
) || (info
->file
== stdout
)))
256 localtime_r(&t
, &info
->ts
);
259 if(m_rollDate
&& info
->ts
.tm_mday
!= m_lastDateTime
.tm_mday
)
261 #if defined(_REENTRANT)
264 if(info
->ts
.tm_mday
!= m_lastDateTime
.tm_mday
)
266 memcpy(&m_lastDateTime
, &info
->ts
, sizeof(tm
));
269 #if defined(_REENTRANT)
274 if(iter
!= m_logTable
.end())
278 int tmp
= fprintf(info
->file
, "[%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d] %s\n", (info
->ts
.tm_mon
+ 1), info
->ts
.tm_mday
, (info
->ts
.tm_year
% 100), info
->ts
.tm_hour
, info
->ts
.tm_min
, info
->ts
.tm_sec
, buf
);
280 if(info
->used
> info
->max
)
288 fprintf(info
->file
, "[%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d] %s\n", (info
->ts
.tm_mon
+ 1), info
->ts
.tm_mday
, (info
->ts
.tm_year
% 100), info
->ts
.tm_hour
, info
->ts
.tm_min
, info
->ts
.tm_sec
, buf
);
294 void Logger::rollDate(time_t t
)
299 logDir
= fopen(m_dirPrefix
.c_str(), "r+");
302 cmkdir(m_dirPrefix
.c_str(), 0755);
304 else if(logDir
!= NULL
)
310 localtime_r(&t
, &now
);
312 sprintf(buf
, "%s%c%2.2d-%2.2d-%2.2d", m_dirPrefix
.c_str(), file_sep
, (now
.tm_mon
+ 1), now
.tm_mday
, (now
.tm_year
% 100));
313 logDir
= fopen(buf
, "r+");
319 else if(logDir
!= NULL
)
325 map
<unsigned, LogInfo
*>::iterator iter
;
326 for(iter
= m_logTable
.begin(); iter
!= m_logTable
.end(); iter
++)
328 (*iter
).second
->filename
= m_logPrefix
+ file_sep
+ (*iter
).second
->name
.c_str() + ".log";
329 fflush((*iter
).second
->file
);
330 fclose((*iter
).second
->file
);
331 (*iter
).second
->file
= fopen((*iter
).second
->filename
.c_str(), "a+");
332 memcpy(&((*iter
).second
->ts
), &now
, sizeof(tm
));
336 // mkdir function that creates intermediate directories
337 void Logger::cmkdir(const char *dir
, int mode
)
340 strncpy(dirbuf
, dir
, 127);
342 char *j
= dirbuf
, *i
= dirbuf
;
350 // handle = open(j, O_EXCL); // Ben's original code
351 // if((handle > 0) || (errno != EISDIR && errno != ENOENT))
353 // perror("Logger::cmkdir():");
357 // This doesnt work under Linux, it returns a valid handle
358 // Instead: see if file exists. If it doesnt, create directory ok
359 // If it exists, do stat to see if it is a dir.
360 // If it is a dir, then ok, create the directory.
361 // If it is a file, error
364 handle
= open(j
, O_RDONLY
);
367 struct stat stat_buffer
;
368 int ret
= fstat(handle
,&stat_buffer
);
369 if ((ret
== -1) || ((stat_buffer
.st_mode
| S_IFDIR
) == 0))
371 perror("Logger::cmkdir():");
380 else if(*(i
+ 1) == 0)
387 #ifdef EXTERNAL_DISTRO