Cuberite
A lightweight, fast and extensible game server for Minecraft
Logger.cpp
Go to the documentation of this file.
1 
2 #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
3 #include "Logger.h"
4 
5 #include "OSSupport/IsThread.h"
6 #ifdef _WIN32
7  #include <time.h>
8 #endif
9 
10 
11 
12 
13 
15 {
16  static cLogger Instance;
17  return Instance;
18 }
19 
20 
21 
22 
23 
25 {
26  GetInstance();
27 }
28 
29 
30 
31 
32 
33 void cLogger::LogSimple(AString a_Message, eLogLevel a_LogLevel)
34 {
35  time_t rawtime;
36  time(&rawtime);
37 
38  struct tm * timeinfo;
39  #ifdef _MSC_VER
40  struct tm timeinforeal;
41  timeinfo = &timeinforeal;
42  localtime_s(timeinfo, &rawtime);
43  #else
44  timeinfo = localtime(&rawtime);
45  #endif
46 
47  AString Line;
48  #ifdef _DEBUG
49  Printf(Line, "[%04llx|%02d:%02d:%02d] %s\n", static_cast<UInt64>(std::hash<std::thread::id>()(std::this_thread::get_id())), timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, a_Message.c_str());
50  #else
51  Printf(Line, "[%02d:%02d:%02d] %s\n", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, a_Message.c_str());
52  #endif
53 
54 
56  for (size_t i = 0; i < m_LogListeners.size(); i++)
57  {
58  m_LogListeners[i]->Log(Line, a_LogLevel);
59  }
60 }
61 
62 
63 
64 
65 
66 void cLogger::LogPrintf(const char * a_Format, eLogLevel a_LogLevel, fmt::ArgList a_ArgList)
67 {
68  LogSimple(Printf(a_Format, a_ArgList), a_LogLevel);
69 }
70 
71 
72 
73 
74 
75 void cLogger::LogFormat(const char * a_Format, eLogLevel a_LogLevel, fmt::ArgList a_ArgList)
76 {
77  LogSimple(fmt::format(a_Format, a_ArgList), a_LogLevel);
78 }
79 
80 
81 
82 
83 
84 cLogger::cAttachment cLogger::AttachListener(std::unique_ptr<cListener> a_Listener)
85 {
86  auto nonOwning = a_Listener.get();
87  {
89  m_LogListeners.push_back(std::move(a_Listener));
90  }
91  return cAttachment{nonOwning};
92 }
93 
94 
95 
96 
97 
99 {
101  m_LogListeners.erase(
102  std::remove_if(
103  m_LogListeners.begin(),
104  m_LogListeners.end(),
105  [=](std::unique_ptr<cListener> & a_OtherListener) -> bool
106  {
107  return a_OtherListener.get() == a_Listener;
108  }
109  )
110  );
111 }
112 
113 
114 
115 
116 
118 // Global functions
119 
120 void FLOG(const char * a_Format, fmt::ArgList a_ArgList)
121 {
122  cLogger::GetInstance().LogFormat(a_Format, cLogger::llRegular, a_ArgList);
123 }
124 
125 
126 
127 
128 
129 void FLOGINFO(const char * a_Format, fmt::ArgList a_ArgList)
130 {
131  cLogger::GetInstance().LogFormat( a_Format, cLogger::llInfo, a_ArgList);
132 }
133 
134 
135 
136 
137 
138 void FLOGWARNING(const char * a_Format, fmt::ArgList a_ArgList)
139 {
140  cLogger::GetInstance().LogFormat( a_Format, cLogger::llWarning, a_ArgList);
141 }
142 
143 
144 
145 
146 
147 void FLOGERROR(const char * a_Format, fmt::ArgList a_ArgList)
148 {
149  cLogger::GetInstance().LogFormat( a_Format, cLogger::llError, a_ArgList);
150 }
151 
152 
153 
154 
155 
156 void LOG(const char * a_Format, fmt::ArgList a_ArgList)
157 {
158  cLogger::GetInstance().LogPrintf(a_Format, cLogger::llRegular, a_ArgList);
159 }
160 
161 
162 
163 
164 
165 void LOGINFO(const char * a_Format, fmt::ArgList a_ArgList)
166 {
167  cLogger::GetInstance().LogPrintf( a_Format, cLogger::llInfo, a_ArgList);
168 }
169 
170 
171 
172 
173 
174 void LOGWARNING(const char * a_Format, fmt::ArgList a_ArgList)
175 {
176  cLogger::GetInstance().LogPrintf( a_Format, cLogger::llWarning, a_ArgList);
177 }
178 
179 
180 
181 
182 
183 void LOGERROR(const char * a_Format, fmt::ArgList a_ArgList)
184 {
185  cLogger::GetInstance().LogPrintf( a_Format, cLogger::llError, a_ArgList);
186 }
187 
188 
189 
190 
std::vector< std::unique_ptr< cListener > > m_LogListeners
Definition: Logger.h:80
void DetachListener(cListener *a_Listener)
Definition: Logger.cpp:98
Definition: Logger.h:5
cAttachment AttachListener(std::unique_ptr< cListener > a_Listener)
Definition: Logger.cpp:84
void LogFormat(const char *a_Format, eLogLevel a_LogLevel, fmt::ArgList a_ArgList)
Log a message formatted with a python style formatting string.
Definition: Logger.cpp:75
void LOGERROR(const char *a_Format, fmt::ArgList a_ArgList)
Definition: Logger.cpp:183
void FLOGERROR(const char *a_Format, fmt::ArgList a_ArgList)
Definition: Logger.cpp:147
void LogSimple(AString a_Message, eLogLevel a_LogLevel=llRegular)
Logs the simple text message at the specified log level.
Definition: Logger.cpp:33
static cLogger & GetInstance(void)
Definition: Logger.cpp:14
void LOGINFO(const char *a_Format, fmt::ArgList a_ArgList)
Definition: Logger.cpp:165
AString & Printf(AString &str, const char *format, fmt::ArgList args)
Output the formatted text into the string.
Definition: StringUtils.cpp:55
void LOGWARNING(const char *a_Format, fmt::ArgList a_ArgList)
Definition: Logger.cpp:174
void FLOGWARNING(const char *a_Format, fmt::ArgList a_ArgList)
Definition: Logger.cpp:138
std::string AString
Definition: StringUtils.h:13
void LOG(const char *a_Format, fmt::ArgList a_ArgList)
Definition: Logger.cpp:156
void LogPrintf(const char *a_Format, eLogLevel a_LogLevel, fmt::ArgList a_ArgList)
Log a message formatted with a printf style formatting string.
Definition: Logger.cpp:66
RAII for cCriticalSection - locks the CS on creation, unlocks on destruction.
void FLOG(const char *a_Format, fmt::ArgList a_ArgList)
Definition: Logger.cpp:120
cCriticalSection m_CriticalSection
Definition: Logger.h:79
static void InitiateMultithreading()
Definition: Logger.cpp:24
void FLOGINFO(const char *a_Format, fmt::ArgList a_ArgList)
Definition: Logger.cpp:129
eLogLevel
Definition: Logger.h:9