Blame view

src/log.cpp 2.62 KB
25b0d2f8   Peter M. Groen   Setting up Loggin...
1
2
  #include "log.h"
  
84738f56   Peter M. Groen   Setting up the lo...
3
  #include "threadcontext.h"
25b0d2f8   Peter M. Groen   Setting up Loggin...
4
  
84738f56   Peter M. Groen   Setting up the lo...
5
6
7
8
9
10
11
12
  // std
  #include <ios>
  #include <iomanip>
  #include <sstream>
  #include <syslog.h>
  #include <sys/types.h>
  #include <thread>
  #include <unistd.h>
25b0d2f8   Peter M. Groen   Setting up Loggin...
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  
  using namespace osdev::components::mqtt;
  
  namespace {
  
  std::string toString( LogLevel level )
  {
      switch (level)
      {
          case LogLevel::Trace:
              return "T";
          case LogLevel::Debug:
              return "D";
          case LogLevel::Info:
              return "I";
          case LogLevel::Warning:
              return "W";
          case LogLevel::Error:
              return "E";
      }
      return "U";
  }
  
  } // namespace
  
  const std::string Log::s_startMarker = std::string("|________________________________________________________________________________________________________________________________|");
  std::string Log::s_context = std::string();
  std::string Log::s_fileName = std::string();
  LogLevel Log::s_logLevel = LogLevel::Info;
  
  void Log::init( const std::string &context, const std::string &logFile, LogLevel logDepth )
  {
      s_logLevel = logDepth;
      s_context = context;
  
      if( !logFile.empty())
      {
          s_fileName = logFile;
      }
  }
  
  void Log::terminate()
  {
      s_context.clear();
      s_fileName.clear();
      s_logLevel = LogLevel::Info;
  }
  
  void Log::log( const std::string &category, const std::string &message, LogLevel level )
  {
      std::string logCategory = s_context + '|' + toString( level ) + '|' + ThreadContext::instance().context() + '|' + category;
      std::string logMessage = message;
      if( logMessage.empty() )
      {
          static const std::string emptyMessage( "--" );
          logMessage = emptyMessage;
      }
      else
      {
          // Replace % signs
84738f56   Peter M. Groen   Setting up the lo...
73
          ReplaceAll( logMessage, "%", "%%" );
25b0d2f8   Peter M. Groen   Setting up Loggin...
74
75
76
77
      }
  
      writeLog( logCategory, logMessage, level );
  }
84738f56   Peter M. Groen   Setting up the lo...
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  
  void Log::writeLog(const std::string &category, const std::string &message, LogLevel level)
  {
      if( s_fileName.empty() )
      {
          (void)level;
          // To be implemented.
          return;
      }
      else
      {
          setlogmask( LOG_UPTO( LOG_NOTICE ) );
          openlog( category.c_str(), LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1 );
  
          syslog( LOG_NOTICE, "%s", message.c_str() );
  
          closelog();
      }
  }
  
  void Log::ReplaceAll( std::string &strToReplace,
                        const std::string& from_chars,
                        const std::string& to_chars )
  {
      size_t start_pos = 0;
      while( ( start_pos = strToReplace.find( from_chars, start_pos ) ) != std::string::npos )
      {
          strToReplace.replace( start_pos, from_chars.length(), to_chars );
          start_pos += to_chars.length(); // Handles case where 'to' is a substring of 'from'
      }
  }