A
Hallo,
ich benutze eine Logging-Lib (rlog), die in einer Klasse mittels write() (io.h) Log-Meldungen in eine Datei schreibt.
Die Logging-Datei erzeuge ich in einer anderen Klasse so:
class App
{
App::App()
{
[...]
#ifdef RLOG
time_t curTime;
time(&curTime);
struct tm* ptm = localtime(&curTime);
char buf[25];
sprintf(buf, "Log_%02d%02d%4d%02d%02d%02d.txt", ptm->tm_mday,
(ptm->tm_mon)+1, (ptm->tm_year) + 1900, ptm->tm_hour,
ptm->tm_min, ptm->tm_sec);
mLogFile = std::fopen(buf, "w+");
if (mLogFile == NULL) {
qDebug() << "LogFile could not be created! Exiting...";
exit(1);
}
mLogNode = new StdioNode(_fileno(mLogFile));
[...]
}
[...]
App::~App()
{
#ifdef RLOG
fclose(mLogFile);
delete mLogFile;
#endif
}
}
Das eigentliche Logging passiert in einer Methode von StdioNode:
[...]
void StdioNode::publish(const RLogData& data)
{
char timeStamp[32];
time_t errTime = data.time;
tm currentTime;
#ifdef HAVE_LOCALTIME_R
localtime_r( &errTime, ¤tTime );
#else
currentTime = *localtime( &errTime );
#endif
const char *color = NULL;
if(colorize)
{
sprintf(timeStamp, "%s%02i:%02i:%02i%s ",
kGreenColor,
currentTime.tm_hour,
currentTime.tm_min,
currentTime.tm_sec,
kNormalColor);
string channel = data.publisher->channel->name();
LogLevel level = data.publisher->channel->logLevel();
switch(level)
{
case Log_Critical:
case Log_Error:
color = kRedColor;
break;
case Log_Warning:
color = kYellowColor;
break;
case Log_Notice:
case Log_Info:
case Log_Debug:
case Log_Undef:
break;
}
} else
{
sprintf(timeStamp, "%02i:%02i:%02i ",
currentTime.tm_hour,
currentTime.tm_min,
currentTime.tm_sec);
}
#ifdef USE_STRSTREAM
ostrstream ss;
#else
ostringstream ss;
#endif
ss << timeStamp;
if (outputChannel) {
ss << '[' << data.publisher->channel->name() << "] ";
}
if (outputContext) {
ss << "(" << data.publisher->fileName << ':'
<< data.publisher->lineNum << ") ";
}
#ifndef _WIN32
if (outputThreadId) {
char tid[16] = "";
snprintf(tid,15,"%lu",pthread_self());
ss << "[tid:" << tid << "] ";
}
#endif
if(color)
ss << color;
ss << data.msg;
if(color)
ss << kNormalColor;
ss << '\n';
string out = ss.str();
write( fdOut, out.c_str(), out.length() );
}
Im Debug-Modus fkt. auch alles, die Log-Meldungen werden in die angelegte Datei geschrieben. Im Release-Modus aber wrid die Datei nur angelegt und hat keinen Inhalt, d.h es wird nichts geschrieben.
Ich vermute mal, dass es an meinen Build-Einstellungen liegt. Ich benutze die Standard-Debug und Release-Einstellungen von Visual Studio 2010.
Oder hat es was mit Buffering im Release Modus zu tun?
Ist ein Qt-Projekt, und in der Projektdatei definiere ich das Makro, wenn Logging verwendet werden soll:
TEMPLATE = app
DEFINES += RLOG
CONFIG(debug, debug|release) {
TARGET = App
win32 {
CONFIG += console
[...]
contains(DEFINES, RLOG) {
LIBS += ../../ThirdParty/rlog-1.4/win32/Debug/rlogd.lib
}
}
[...]
} else {
win32 {
contains(DEFINES, RLOG) {
LIBS += ../../ThirdParty/rlog-1.4/win32/Release/rlog.lib
}
}
}
[...]
Danke für alle Hinweise
Edit: Ok, war mein Fehler, hat sich noch ein Makro versteckt...