Antares Xpansion
Investment simulations for Antares studies
Loading...
Searching...
No Matches
ProblemGenerationLogger.h
1#ifndef __PROBLEMGENERATIONLOGGER_H__
2#define __PROBLEMGENERATIONLOGGER_H__
3
4#include <ctime>
5#include <filesystem>
6#include <fstream>
7#include <iostream>
8#include <list>
9#include <memory>
10#include <mutex>
11#include <ostream>
12#include <set>
13#include <string>
14
15#include "antares-xpansion/xpansion_interfaces/ILogger.h"
16#include "antares-xpansion/xpansion_interfaces/LoggerUtils.h"
17
18namespace ProblemGenerationLog
19{
20
22{
23public:
24 ~ProblemGenerationILogger() override = default;
25 void display_message(const std::string& message) override = 0;
26 void display_message(const std::string& str,
27 LogUtils::LOGLEVEL level,
28 const std::string& context) override
29 = 0;
30 void PrintIterationSeparatorBegin() override = 0;
31 void PrintIterationSeparatorEnd() override = 0;
32
33 virtual std::ostream& GetOstreamObject() = 0;
34
35 LogUtils::LOGGERTYPE Type() const
36 {
37 return type_;
38 }
39
40protected:
41 void SetType(const LogUtils::LOGGERTYPE& type)
42 {
43 type_ = type;
44 }
45
46private:
47 LogUtils::LOGGERTYPE type_ = LogUtils::LOGGERTYPE::NONE;
48};
49
50using ProblemGenerationILoggerSharedPointer = std::shared_ptr<ProblemGenerationILogger>;
51
53{
54private:
55 std::filesystem::path logFilePath_;
56 std::ofstream logFile_;
57
58public:
60 {
61 logFile_.close();
62 }
63
64 explicit ProblemGenerationFileLogger(const std::filesystem::path& logFilePath);
65 void display_message(const std::string& message) override;
66 void display_message(const std::string& message,
67 const LogUtils::LOGLEVEL log_level,
68 const std::string& context) override;
69 void PrintIterationSeparatorBegin() override;
70 void PrintIterationSeparatorEnd() override;
71 std::ostream& GetOstreamObject() override;
72};
73
75{
76private:
77 std::ostream& stream_;
78
79public:
80 ~ProblemGenerationOstreamLogger() override = default;
81 explicit ProblemGenerationOstreamLogger(std::ostream& stream);
82 void display_message(const std::string& message) override;
83 void display_message(const std::string& message,
84 const LogUtils::LOGLEVEL log_level,
85 const std::string& context) override;
86 void PrintIterationSeparatorBegin() override;
87 void PrintIterationSeparatorEnd() override;
88 std::ostream& GetOstreamObject() override;
89};
90
92{
93private:
94 LogUtils::LOGLEVEL log_level_;
95 std::string context_ = "Unknown Context";
96
97public:
98 explicit ProblemGenerationLogger(const LogUtils::LOGLEVEL log_level):
99 log_level_(log_level)
100 {
101 }
102
103 ~ProblemGenerationLogger() = default;
104
105 void AddLogger(const ProblemGenerationILoggerSharedPointer& logger);
106 void display_message(const std::string& message) override;
107 void display_message(const std::string& message,
108 const LogUtils::LOGLEVEL log_level,
109 const std::string& context) override;
110 void PrintIterationSeparatorBegin() override;
111 void PrintIterationSeparatorEnd() override;
112 void setLogLevel(const LogUtils::LOGLEVEL log_level);
113
114 void setContext(const std::string& context)
115 {
116 context_ = context;
117 }
118
119 const std::string& getContext() const;
120
121 ProblemGenerationLogger& operator()(const LogUtils::LOGLEVEL log_level, bool lock = false)
122 {
123 std::unique_lock ulck(write_mutex_, std::defer_lock);
124 if (lock)
125 {
126 ulck.lock();
127 }
128 return (*this) << log_level;
129 }
130
131 ProblemGenerationLogger& operator()(bool lock = false)
132 {
133 std::unique_lock ulck(write_mutex_, std::defer_lock);
134 if (lock)
135 {
136 ulck.lock();
137 }
138 return (*this) << PrefixMessage(log_level_, context_);
139 }
140
141 ProblemGenerationLogger& operator<<(std::ostream& (*f)(std::ostream&));
142
143 ProblemGenerationLogger& operator<<(const std::shared_ptr<ProblemGenerationLogger> logger)
144 {
145 return (*logger);
146 }
147
148 ProblemGenerationLogger& operator<<(const LogUtils::LOGLEVEL log_level);
149
150 template<typename T>
151 ProblemGenerationLogger& operator<<(const T& t);
152
153private:
154 std::mutex write_mutex_;
155 std::list<ProblemGenerationILoggerSharedPointer> loggers_;
156 std::set<ProblemGenerationILoggerSharedPointer> enabled_loggers_;
157 void update_enabled_logger();
158 bool try_to_add_logger_to_enabled_list(const ProblemGenerationILoggerSharedPointer& logger);
159};
160
161template<typename T>
162ProblemGenerationLogger& ProblemGenerationLogger::operator<<(const T& t)
163{
164 for (const auto& subLogger: enabled_loggers_)
165 {
166 subLogger->GetOstreamObject() << t;
167 }
168 return *this;
169}
170
171std::shared_ptr<ProblemGenerationLogger> BuildLogger(const std::filesystem::path& log_file_path,
172 std::ostream& stream,
173 const std::string& context);
174
175} // namespace ProblemGenerationLog
176#endif //__PROBLEMGENERATIONLOGGER_H__
Definition ProblemGenerationLogger.h:53
void display_message(const std::string &message) override
pure virtual method to display a std::string message
Definition ProblemGenerationLogger.cpp:18
Definition ProblemGenerationLogger.h:22
void display_message(const std::string &message) override=0
pure virtual method to display a std::string message
Definition ProblemGenerationLogger.h:92
void display_message(const std::string &message) override
pure virtual method to display a std::string message
Definition ProblemGenerationLogger.cpp:87
Definition ProblemGenerationLogger.h:75
void display_message(const std::string &message) override
pure virtual method to display a std::string message
Definition ProblemGenerationLogger.cpp:56
Xpansion Unique log Interface.
Definition ILogger.h:79