source: XMLIO_V2/dev/dev_rv/src/XMLIO/logger.hpp @ 128

Last change on this file since 128 was 128, checked in by hozdoba, 14 years ago
File size: 3.3 KB
Line 
1#ifndef __XMLIO_LOGGER__
2#define __XMLIO_LOGGER__
3
4// Entête Poco logging
5#include <csignal>
6
7#ifdef __GNUC__
8#include <execinfo.h>
9#include <cxxabi.h>
10#endif // __GNUC__
11
12using std::string;
13
14namespace XMLIOSERVER
15{
16   class ILogger : public std::ostringstream
17   {
18      private :
19
20         ILogger(void)
21         { signal(SIGSEGV, SigHandler); }
22
23      private : /* static */
24
25         static ILogger LOGGER;
26
27      public : /* static */
28
29         static ILogger& GetLogger(void) { return (ILogger::LOGGER); }
30
31         static void Flush(std::ostream& out = std::clog)
32         { ILogger::GetLogger().flush(out); }
33
34         static void ShowBTrace(std::ostream& out = std::clog)
35         {
36#ifdef __GNUC__
37            int status = 0;
38            string value;
39            void *stack_addrs[20] = {NULL};
40            size_t stack_depth = backtrace(stack_addrs, 20);
41            char **stack_strings = backtrace_symbols(stack_addrs, stack_depth);
42
43            out << "Trace : " << std::endl;
44            for (size_t i = 2, j = 0; i < stack_depth; i++)
45            {
46               value.assign(stack_strings[i]);
47               size_t bpos = value.find ('('), epos = value.find ('+');
48               if ((bpos != string::npos) and (epos != string::npos))
49               {
50                  char* demangled_name = abi::__cxa_demangle(value.substr(bpos+1, epos-bpos-1).c_str(), 0, 0, &status);
51                  if (status == 0) out << "   "  << ++j << " -> "  << (demangled_name) << std::endl;
52                  else out << "   "  << ++j << " -> "  << value.substr(bpos+1, epos-bpos-1) << std::endl;
53                  free(demangled_name);
54               }
55            }
56
57            free(stack_strings);
58#endif // __GNUC__
59         }
60
61         static void SigHandler(int _sigValue)
62         {
63            std::cerr << "============= Erreur =============" << std::endl;
64            std::cerr << "Signal " << _sigValue << " reçu !" << std::endl;
65            ShowBTrace(std::cerr);
66            std::cerr << "==================================" << std::endl;
67            exit(EXIT_FAILURE);
68         }
69
70      public :
71
72         void flush(std::ostream& out = std::clog)
73         { out << str() << std::endl; str(""); }
74
75         ~ILogger(void) { this->flush(); }
76
77   }; // class XMLIOLogger
78
79   // Initialisation de la classe de Logging
80   ILogger ILogger::LOGGER;
81
82   /////////////////////////////////////////////////////////////////////
83   unsigned int Indent = 0;
84   const char*  Increm = "   ";
85
86   std::ostream& NIndent(std::ostream& out)
87   {
88      static unsigned int LineNB = 1;
89      out<< LineNB++ << ". ";
90      for(unsigned int i = 0;i < Indent; i++) out << Increm;
91      return(out);
92   }
93
94   std::ostream& IncIndent(std::ostream& out) { Indent++; return (NIndent(out)); }
95   std::ostream& DecEndl  (std::ostream& out) { Indent--; return (out); }
96   /////////////////////////////////////////////////////////////////////
97
98} // namespace XMLIOSERVER
99
100#define   ERROR(MSG)\
101   (ILogger::GetLogger() << __FILE__ << ":" << __LINE__ << ": error : "   << MSG << std::endl)
102#define   WARNING(MSG)\
103   (ILogger::GetLogger() << __FILE__ << ":" << __LINE__ << ": warning : " << MSG << std::endl)
104#define   INFO(MSG)\
105   (ILogger::GetLogger() << __FILE__ << ":" << __LINE__ << ": info : "    << MSG << std::endl)
106// A compléter.
107
108#endif // __XMLIO_LOGGER__
Note: See TracBrowser for help on using the repository browser.