26 #include "TDataType.h" 70 if (!fgxMutex) fgxMutex =
new TMutex(kTRUE);
74 if (IsLogfileEnabled()) {
75 OpenLogfile(fgcDEFAULTLOG,
"--- This is the default Go4 Message logfile ---");
76 LogfileEnable(kFALSE);
95 if (fgStdSave > 0)
return;
101 fgStdSave = dup(STDOUT_FILENO);
103 if(pipe(fgStdPipe) != 0)
return;
105 dup2(fgStdPipe[1], STDOUT_FILENO);
106 long flags = fcntl(fgStdPipe[0], F_GETFL);
108 fcntl(fgStdPipe[0], F_SETFL, flags);
120 if (fgStdSave < 0)
return;
130 memset(buffer, 0,
sizeof(buffer));
131 int len = read(fgStdPipe[0], buffer,
sizeof(buffer)-1);
134 if (len == 0)
return;
136 dup2(fgStdSave, STDOUT_FILENO);
138 printf(
"%s", buffer);
141 if (fgSniffer) fgSniffer->SetTitle(buffer);
145 dup2(fgStdPipe[1], STDOUT_FILENO);
158 if (fgsGO4SYS.Length()>0)
return fgsGO4SYS.Data();
159 const char *go4sys = gSystem->Getenv(
"GO4SYS");
161 if (!go4sys || (strlen(go4sys) == 0)) go4sys = COMP_GO4SYS;
163 if (!go4sys || (strlen(go4sys) == 0))
return "";
166 if (fgsGO4SYS.Length() > 0) {
168 char lastsymbol =
'\\';
169 fgsGO4SYS.ReplaceAll(
"/",
"\\");
171 char lastsymbol =
'/';
173 if (fgsGO4SYS[fgsGO4SYS.Length() - 1] != lastsymbol) fgsGO4SYS += lastsymbol;
176 return fgsGO4SYS.Length()>0 ? fgsGO4SYS.Data() :
"";
191 const char *go4sys = GO4SYS();
193 if (!subdir || (strlen(subdir) == 0))
return TString(go4sys);
195 TString res = go4sys;
198 res += TString(subdir).ReplaceAll(
"/",
"\\");
210 if(prio>-1 && prio<fgiIgnoreLevel)
return nullptr;
211 char txtbuf[fguMESLEN-20];
213 va_start(args, text);
214 vsnprintf(txtbuf, fguMESLEN-20, text, args);
216 const char *prefix = fgcINFO;
219 case -1: prefix = fgcINFO;
break;
220 case 0: prefix = fgcDEBUG;
break;
221 case 1: prefix = fgcINFO;
break;
222 case 2: prefix = fgcWARN;
break;
223 case 3: prefix = fgcERR;
break;
226 if(fgbLogfileEnabled) {
229 WriteLogfile(fgcMessagetext);
235 int res = snprintf(fgcMessagetext,
__MESSAGETEXTLENGTH__,
"%s%s> %s %s", fgcLEFT, prefix, txtbuf, fgcRIGHT);
238 if(fgbOutputEnabled) {
240 ProcessRedirection(1);
242 std::cout << fgcMessagetext << std::endl;
246 if (fgSniffer) fgSniffer->SetTitle(fgcMessagetext);
248 ProcessRedirection(-1);
251 return fgcMessagetext;
256 ProcessRedirection(1);
259 fprintf(stdout,
"%s", text);
262 fprintf(stderr,
"%s", text);
266 ProcessRedirection(-1);
272 ProcessRedirection(1);
274 int width = (rate > 1e4) ? 0 : (rate < 1. ? 3 : 1);
275 fprintf(stdout,
"\rCnt = %llu Rate = %5.*f Ev/s", cnt, width, rate);
278 ProcessRedirection(-1);
283 if(fgiIgnoreLevel>0)
return;
286 char txtbuf[fguMESLEN];
288 va_start(args, text);
289 vsnprintf(txtbuf, fguMESLEN, text, args);
291 Message(0,
"%s", txtbuf);
296 if(fgiIgnoreLevel>1)
return;
299 char txtbuf[fguMESLEN];
301 va_start(args, text);
302 vsnprintf(txtbuf, fguMESLEN, text, args);
304 Message(1,
"%s", txtbuf);
309 if(fgiIgnoreLevel>2)
return;
312 char txtbuf[fguMESLEN];
314 va_start(args, text);
315 vsnprintf(txtbuf, fguMESLEN, text, args);
317 Message(2,
"%s", txtbuf);
324 char txtbuf[fguMESLEN];
326 va_start(args, text);
327 vsnprintf(txtbuf, fguMESLEN, text, args);
329 Message(3,
"%s", txtbuf);
335 fgiIgnoreLevel = level;
340 return fgiIgnoreLevel;
345 return fgxLogName.Data();
350 return fgcDEFAULTLOG;
355 fgbOutputEnabled = on;
360 return fgbOutputEnabled;
365 fgbLogfileEnabled = on;
370 return fgbLogfileEnabled;
389 char txtbuf[fguMESLEN];
392 snprintf(txtbuf,fguMESLEN,
"go4log-%d.txt", gSystem->GetPid());
394 snprintf(txtbuf,fguMESLEN,
"%s",name);
396 std::ofstream* lf =
new std::ofstream(txtbuf, appendmode ? std::ios::app : std::ios::out);
399 LogfileEnable(kFALSE);
401 std::cerr <<
"TGo4Log::OpenLogfile() - Error opening logfile "<< name << std::endl;
407 if(headercomment) WriteLogfile(headercomment, kFALSE);
410 catch(std::exception& ex)
412 std::cerr <<
"standard exception "<<ex.what()<<
"in TGo4Log::OpenLogfile" << std::endl;
416 std::cerr <<
"!!! Unexpected exception in TGo4Log::OpenLogfile !!!" << std::endl;
423 if(!text || !fgbLogfileEnabled || !fgxLogfile)
return;
425 std::ofstream *lf =
static_cast<std::ofstream*
>(fgxLogfile);
429 *lf << now.AsSQLString() <<
": ";
431 *lf << text << std::endl;
434 catch(std::exception& ex)
436 std::cerr <<
"standard exception "<<ex.what()<<
"in TGo4Log::WriteLogfile" << std::endl;
440 std::cerr <<
"!!! Unexpected exception in TGo4Log::WriteLogfile !!!" << std::endl;
451 delete (std::ofstream*)fgxLogfile;
452 fgxLogfile =
nullptr;
454 catch(std::exception& ex)
456 std::cerr <<
"standard exception "<<ex.what()<<
"in TGo4Log::CloseLogfile" << std::endl;
460 std::cerr <<
"!!! Unexpected exception in TGo4Log::CloseLogfile !!!" << std::endl;
static const char * GetLogname()
static TGo4Log * Instance()
static TGo4Log * fgxInstance
static const char * fgcWARN
static void Info(const char *text,...) GO4_PRINTF_ARGS
static void WriteLogfile(const char *text, Bool_t withtime=kTRUE)
static void CloseLogfile()
static Bool_t IsOutputEnabled()
static Bool_t fgbLogfileEnabled
static void OpenLogfile(const char *name=nullptr, const char *headercomment=nullptr, Bool_t appendmode=kFALSE)
static const char * GetDefaultLogname()
static Bool_t fgbAutoMode
static void SetIgnoreLevel(Int_t level)
static void OutputEnable(Bool_t on=kTRUE)
static const char * fgcRIGHT
static const char * fgcDEBUG
static Bool_t fgbOutputEnabled
static int fgStdSave
redirected pipe for stdout
static void ProcessRedirection(int kind=0)
static void SetSniffer(TNamed *sniff)
static const char * Message(Int_t prio, const char *text,...) GO4_PRINTF2_ARGS
static void Debug(const char *text,...) GO4_PRINTF_ARGS
TLogTimer(Int_t millisec)
static const char * fgcINFO
static const char * GO4INCPATH()
static void EnableRedirection()
static int fgStdPipe[2]
optional object to get all output via SetTitle method
static Bool_t IsLogfileEnabled()
static const char * fgcDEFAULTLOG
static Int_t fgiIgnoreLevel
static void Error(const char *text,...) GO4_PRINTF_ARGS
static TString fgxLogName
static void Printf(Bool_t _stdout, const char *text)
static void PrintRate(ULong64_t cnt, double rate)
static Int_t GetIgnoreLevel()
static TNamed * fgSniffer
value of GO4SYS during run
static TString subGO4SYS(const char *subdir)
static char fgcMessagetext[__MESSAGETEXTLENGTH__]
static const char * fgcLEFT
static const char * GO4SYS()
static TLogTimer * fgTimer
saved file for stdout
static void AutoEnable(Bool_t on=kTRUE)
#define __MESSAGETEXTLENGTH__
static const char * fgcERR
static void Warn(const char *text,...) GO4_PRINTF_ARGS
static Bool_t IsAutoEnabled()
static void LogfileEnable(Bool_t on=kTRUE)