// $Id$ //----------------------------------------------------------------------- // The GSI Online Offline Object Oriented (Go4) Project // Experiment Data Processing at EE department, GSI //----------------------------------------------------------------------- // Copyright (C) 2000- GSI Helmholtzzentrum für Schwerionenforschung GmbH // Planckstr. 1, 64291 Darmstadt, Germany // Contact: http://go4.gsi.de //----------------------------------------------------------------------- // This software can be used under the license agreements as stated // in Go4License.txt file which is part of the distribution. //----------------------------------------------------------------------- #include "TGo4Log.h" #include "Riostream.h" #include "TDatime.h" #include "TMutex.h" #include "TSystem.h" #include "snprintf.h" #include "TGo4LockGuard.h" const char* TGo4Log::fgcLEFT = "GO4-"; //const char* TGo4Log::fgcRIGHT = " 0) return fgsGO4SYS.Data(); const char* go4sys = gSystem->Getenv("GO4SYS"); #ifdef COMP_GO4SYS if ((go4sys==0) || (strlen(go4sys)==0)) go4sys = COMP_GO4SYS; #endif if ((go4sys==0) || (strlen(go4sys)==0)) return ""; fgsGO4SYS = go4sys; if (fgsGO4SYS.Length() > 0) { #ifdef WIN32 char lastsymbol = '\\'; fgsGO4SYS.ReplaceAll("/","\\"); // while in cygpath we cannot deliver windows-like slashes #else char lastsymbol = '/'; #endif if (fgsGO4SYS[fgsGO4SYS.Length() - 1] != lastsymbol) fgsGO4SYS += lastsymbol; } return fgsGO4SYS.Length()>0 ? fgsGO4SYS.Data() : ""; } TString TGo4Log::subGO4SYS(const char* subdir) { const char* go4sys = GO4SYS(); if ((subdir==0) || (strlen(subdir)==0)) return TString(go4sys); TString res = go4sys; #ifdef WIN32 res += TString(subdir).ReplaceAll("/","\\"); #else res += subdir; #endif return res; } const char* TGo4Log::Message(Int_t prio, const char* text,...) { Instance(); //TGo4LockGuard(fxMutex); if(prio>-1 && prio %s %s", fgcLEFT, prefix, txtbuf,fgcRIGHT); if(fgbOutputEnabled) { cout << fgcMessagetext << endl; } return fgcMessagetext; } void TGo4Log::Debug(const char* text,...) { if(fgiIgnoreLevel>0) return; Instance(); //TGo4LockGuard(fxMutex); char txtbuf[fguMESLEN]; va_list args; va_start(args, text); vsnprintf(txtbuf, fguMESLEN, text, args); va_end(args); Message(0,txtbuf); } void TGo4Log::Info(const char* text,...) { if(fgiIgnoreLevel>1) return; Instance(); //TGo4LockGuard(fxMutex); char txtbuf[fguMESLEN]; va_list args; va_start(args, text); vsnprintf(txtbuf, fguMESLEN, text, args); va_end(args); Message(1,txtbuf); } void TGo4Log::Warn(const char* text,...) { if(fgiIgnoreLevel>2) return; Instance(); //TGo4LockGuard(fxMutex); char txtbuf[fguMESLEN]; va_list args; va_start(args, text); vsnprintf(txtbuf, fguMESLEN, text, args); va_end(args); Message(2,txtbuf); } void TGo4Log::Error(const char* text,...) { Instance(); //TGo4LockGuard(fxMutex); char txtbuf[fguMESLEN]; va_list args; va_start(args, text); vsnprintf(txtbuf, fguMESLEN, text, args); va_end(args); Message(3,txtbuf); } void TGo4Log::SetIgnoreLevel(Int_t level) { //TGo4LockGuard(fxMutex); fgiIgnoreLevel=level; } Int_t TGo4Log::GetIgnoreLevel() { return fgiIgnoreLevel; } const char* TGo4Log::GetLogname() { return fgxLogName.Data(); } const char* TGo4Log::GetDefaultLogname() { return fgcDEFAULTLOG; } void TGo4Log::OutputEnable(Bool_t on) { //TGo4LockGuard(fxMutex); fgbOutputEnabled=on; } Bool_t TGo4Log::IsOutputEnabled() { return fgbOutputEnabled; } void TGo4Log::LogfileEnable(Bool_t on) { //TGo4LockGuard(fxMutex); fgbLogfileEnabled=on; } Bool_t TGo4Log::IsLogfileEnabled() { return fgbLogfileEnabled; } void TGo4Log::AutoEnable(Bool_t on) { //TGo4LockGuard(fxMutex); fgbAutoMode=on; } Bool_t TGo4Log::IsAutoEnabled() { return fgbAutoMode; } void TGo4Log::OpenLogfile(const char* name, const char* headercomment, Bool_t appendmode) { //TGo4LockGuard(fxMutex); try { CloseLogfile(); char txtbuf[fguMESLEN]; if(name==0) // default: encode pid into filename snprintf(txtbuf,fguMESLEN,"go4log-%d.txt", gSystem->GetPid()); else snprintf(txtbuf,fguMESLEN,"%s",name); std::ofstream* lf = new std::ofstream(txtbuf, appendmode ? std::ios::app : std::ios::out); if(lf->fail()) { LogfileEnable(kFALSE); delete lf; cerr <<"TGo4Log::OpenLogfile() - Error opening logfile "<< name << endl; } else { fgxLogfile = lf; fgxLogName = txtbuf; // remember our last filename } // write headercomment into the first lines: if(headercomment) WriteLogfile(headercomment, kFALSE); } // try catch(std::exception& ex) // treat standard library exceptions { cerr <<"standard exception "<