All Classes Files Functions Variables Typedefs Pages
Logger.hpp
1 #pragma once
2 
3 #include "../config/LConfig.hpp"
4 #include "../core/LogLevel.hpp"
5 #include "../util/TerminalLook.hpp"
6 
7 #include <chrono>
8 #include <fstream>
9 #include <iostream>
10 #include <string>
11 #include <vector>
12 
13 namespace lumina {
14 
15 class Logger {
16 public:
17  Logger();
18 
19 
20  /*****************************************************************************
21  * Logging functions
22  ****************************************************************************/
27  template <LogLevel LL = LogLevel::Info, typename... Ts>
28  void log(Ts... msgs);
29 
34  void setLogFileName(std::string filename);
35  static void setGlobalLogFileName(std::string filename);
36 
41  void setStdLogging(bool enable);
42  static void setGlobalStdLogging(bool enable);
43 
44 
49  void setStdLevelFilter(LogLevel required);
50  static void setGlobalStdLevelFilter(LogLevel required);
51 
52 
53 private:
54  using Clock = std::chrono::system_clock;
55 
56  std::string m_logFileName;
57  bool m_stdIO;
58  Clock::time_point m_time;
59  std::ofstream m_logFile;
60  LogLevel m_requiredStdLevel;
61 
62  static std::vector<Logger*> s_instances;
63 
64 
65 
66 
67  void openLogFile() {
68  // try to open log file
69  m_logFile.open(m_logFileName, std::ios::app | std::ios::ate);
70  if(!m_logFile) {
71  std::cerr << "Failed to open log file ("
72  << m_logFileName << ")!" << std::endl;
73  }
74 
75  // write header
76  m_logFile << std::endl << "---------------------------------------"
77  << std::endl;
78  m_logFile << "Opened log file: " << m_logFileName
79  << std::endl;
80  }
81 
82  template <typename T, typename... Ts>
83  void logStdIO(T head, Ts... tail) {
84  logStdIO(head);
85  logStdIO(tail...);
86  }
87  template <typename T>
88  void logStdIO(T msg) {
89  std::cout << msg;
90  }
91 
92  template <typename T, typename... Ts>
93  void logFile(T head, Ts... tail) {
94  logFile(head);
95  logFile(tail...);
96  }
97  template <typename T>
98  void logFile(T msg) {
99  m_logFile << msg;
100  }
101 
102  std::string getTimeString();
103 };
104 
105 
106 } // namespace lumina
107 
108 #include "Logger.tpp"
void setStdLogging(bool enable)
Enable or disable logging via cout and cerr.
Definition: Logger.tpp:57
Definition: Logger.hpp:15
void setLogFileName(std::string filename)
Set the name of the file, which is used for logging.
Definition: Logger.tpp:50
void setStdLevelFilter(LogLevel required)
Don't print log messages, that are below the required log level.
Definition: Logger.tpp:61
void log(Ts...msgs)
Log information.
Definition: Logger.tpp:11