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

Last change on this file since 122 was 122, checked in by hozdoba, 14 years ago

Plusieurs modifications en attendant une version propre et stable.

File size: 3.0 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()
21         { signal(SIGSEGV, SigHandler); }
22
23         static ILogger LOGGER;
24
25      public :
26
27         static ILogger& GetLogger(void) { return (ILogger::LOGGER); }
28
29         static void ShowBTrace(std::ostream& out = std::clog)
30         {
31#ifdef __GNUC__
32            int status = 0;
33            string value;
34            void *stack_addrs[20] = {NULL};
35            size_t stack_depth = backtrace(stack_addrs, 20);
36            char **stack_strings = backtrace_symbols(stack_addrs, stack_depth);
37
38            out << "Trace : " << std::endl;
39            for (size_t i = 2, j = 0; i < stack_depth; i++)
40            {
41               value.assign(stack_strings[i]);
42               size_t bpos = value.find ('('), epos = value.find ('+');
43               if ((bpos != string::npos) and (epos != string::npos))
44               {
45                  char* demangled_name = abi::__cxa_demangle(value.substr(bpos+1, epos-bpos-1).c_str(), 0, 0, &status);
46                  if (status == 0) out << "   "  << ++j << " -> "  << (demangled_name) << std::endl;
47                  else out << "   "  << ++j << " -> "  << value.substr(bpos+1, epos-bpos-1) << std::endl;
48                  free(demangled_name);
49               }
50            }
51
52            free(stack_strings);
53#endif // __GNUC__
54         }
55
56         static void SigHandler(int _sigValue)
57         {
58            std::cerr << "============= Erreur =============" << std::endl;
59            std::cerr << "Signal " << _sigValue << " reçu !" << std::endl;
60            ShowBTrace(std::cerr);
61            std::cerr << "==================================" << std::endl;
62            exit(EXIT_FAILURE);
63         }
64
65         ~ILogger(void)
66         { std::cout << str() << std::endl; }
67
68   }; // class XMLIOLogger
69
70   // Initialisation de la classe de Logging
71   ILogger ILogger::LOGGER;
72
73   /////////////////////////////////////////////////////////////////////
74   unsigned int Indent = 0;
75   const char*  Increm = "   ";
76
77   std::ostream& NIndent(std::ostream& out)
78   {
79      static unsigned int LineNB = 1;
80      out<< LineNB++ << ". ";
81      for(unsigned int i = 0;i < Indent; i++) out << Increm;
82      return(out);
83   }
84
85   std::ostream& IncIndent(std::ostream& out) { Indent++; return (NIndent(out)); }
86   std::ostream& DecEndl(std::ostream& out) { Indent--; return (out); }
87   /////////////////////////////////////////////////////////////////////
88
89} // namespace XMLIOSERVER
90
91#define   ERROR(MSG)   (ILogger::GetLogger() << __FILE__ << ":" << __LINE__ << ": error : "   << MSG << std::endl)
92#define   WARNING(MSG) (ILogger::GetLogger() << __FILE__ << ":" << __LINE__ << ": warning : " << MSG << std::endl)
93#define   INFO(MSG)    (ILogger::GetLogger() << __FILE__ << ":" << __LINE__ << ": info : "    << MSG << std::endl)
94// A compléter.
95
96#endif // __XMLIO_LOGGER__
Note: See TracBrowser for help on using the repository browser.