-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #15 from uPiscium/develop
Fix logger interface and add example loggers.
- Loading branch information
Showing
10 changed files
with
188 additions
and
166 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
#include "../includes/loggers.hpp" | ||
|
||
namespace TerreateLogger::Loggers { | ||
using namespace TerreateLogger::Defines; | ||
|
||
MultiLogger::~MultiLogger() { | ||
for (auto &logger : loggers) { | ||
delete logger.second; | ||
} | ||
} | ||
|
||
void MultiLogger::Log(Str const &log) { | ||
for (auto &logger : loggers) { | ||
logger.second->Log(log); | ||
} | ||
} | ||
|
||
} // namespace TerreateLogger::Loggers |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,49 +1,53 @@ | ||
#ifndef __TL_LOGGER_BASE_HPP__ | ||
#define __TL_LOGGER_BASE_HPP__ | ||
#ifndef __TL_LOGGER_HPP__ | ||
#define __TL_LOGGER_HPP__ | ||
|
||
#include "defines.hpp" | ||
|
||
namespace TerreateLogger::Base { | ||
namespace TerreateLogger::Interface { | ||
using namespace TerreateLogger::Defines; | ||
|
||
class ILogger { | ||
private: | ||
using LogFunc = Func<LogData(LogData const &)>; | ||
|
||
protected: | ||
Vec<LogData> mLogs; | ||
LogFunc mCriticalCallback; | ||
LogFunc mErrorCallback; | ||
LogFunc mWarningCallback; | ||
LogFunc mInfoCallback; | ||
LogFunc mDebugCallback; | ||
LogFunc mTraceCallback; | ||
Str mLoggerName = ""; | ||
|
||
private: | ||
ILogger(ILogger const &) = delete; | ||
ILogger &operator=(ILogger const &) = delete; | ||
|
||
public: | ||
ILogger() {} | ||
virtual ~ILogger() {} | ||
|
||
virtual Vec<LogData> const &GetLogs() const { return mLogs; } | ||
|
||
virtual void SetCriticalCallback(LogFunc callback) { | ||
mCriticalCallback = callback; | ||
} | ||
virtual void SetErrorCallback(LogFunc callback) { mErrorCallback = callback; } | ||
virtual void SetWarningCallback(LogFunc callback) { | ||
mWarningCallback = callback; | ||
/* | ||
* @brief: Default constructor | ||
* @note: Logger name is empty by default | ||
*/ | ||
ILogger() = default; | ||
/* | ||
* @brief: Constructor with logger name | ||
* @param: name: Logger name | ||
*/ | ||
ILogger(Str const &name) { this->SetLoggerName(name); } | ||
virtual ~ILogger() = default; | ||
|
||
/* | ||
* @brief: Get logger name | ||
* @return: Logger name | ||
*/ | ||
virtual Str GetLoggerName() const { return mLoggerName; } | ||
|
||
/* | ||
* @brief: Set logger name | ||
* @param: loggerName: Logger name | ||
*/ | ||
virtual void SetLoggerName(Str const &loggerName) { | ||
mLoggerName = loggerName; | ||
} | ||
virtual void SetInfoCallback(LogFunc callback) { mInfoCallback = callback; } | ||
virtual void SetDebugCallback(LogFunc callback) { mDebugCallback = callback; } | ||
virtual void SetTraceCallback(LogFunc callback) { mTraceCallback = callback; } | ||
|
||
virtual void Log(LogData const &log) = 0; | ||
virtual void Dump(Str const &path) = 0; | ||
/* | ||
* @brief: Log message | ||
* @param: log: Log message | ||
* @note: Pure virtual function. You must implement this function in derived | ||
*/ | ||
virtual void Log(Str const &log) = 0; | ||
}; | ||
} // namespace TerreateLogger::Interface | ||
|
||
} // namespace TerreateLogger::Base | ||
|
||
#endif // __TL_LOGGER_BASE_HPP__ | ||
#endif // __TL_LOGGER_HPP__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,37 +1,18 @@ | ||
#ifndef __TL_DEFINES_HPP__ | ||
#define __TL_DEFINES_HPP__ | ||
|
||
#include <functional> | ||
#include <iostream> | ||
#include <cstdint> | ||
#include <string> | ||
#include <unordered_map> | ||
#include <vector> | ||
|
||
namespace TerreateLogger::Defines { | ||
|
||
using Uint = unsigned int; | ||
using Str = std::string; | ||
// STL types | ||
typedef uint64_t Uint64; | ||
typedef std::string Str; | ||
template <typename T> using Vec = std::vector<T>; | ||
template <typename T> using Func = std::function<T>; | ||
|
||
enum class LogLevel { CRITICAL, ERROR, WARNING, INFO, DEBUG, TRACE }; | ||
|
||
Str LogLevelToString(LogLevel const &level); | ||
|
||
struct LogData { | ||
LogLevel level; | ||
Str file; | ||
Str func; | ||
Uint line; | ||
Str msg; | ||
}; | ||
|
||
#define TLLOG(level, msg) \ | ||
TerreateLogger::Defines::LogData { \ | ||
level, Str(__FILE__), Str(__func__), __LINE__, msg \ | ||
} | ||
template <typename K, typename V> using Map = std::unordered_map<K, V>; | ||
|
||
} // namespace TerreateLogger::Defines | ||
|
||
std::ostream &operator<<(std::ostream &stream, | ||
TerreateLogger::Defines::LogData const &log); | ||
#endif // __TL_DEFINES_HPP__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#ifndef __TL_LOGGERS_HPP__ | ||
#define __TL_LOGGERS_HPP__ | ||
|
||
#include <fstream> | ||
#include <iostream> | ||
|
||
#include "ILogger.hpp" | ||
#include "defines.hpp" | ||
|
||
namespace TerreateLogger::Loggers { | ||
using namespace TerreateLogger::Defines; | ||
using namespace TerreateLogger::Interface; | ||
|
||
class MultiLogger : public ILogger { | ||
protected: | ||
Map<Str, ILogger *> loggers; | ||
|
||
private: | ||
MultiLogger(MultiLogger const &) = delete; | ||
MultiLogger &operator=(MultiLogger const &) = delete; | ||
|
||
public: | ||
MultiLogger() = default; | ||
MultiLogger(Str const &name) : ILogger(name) {} | ||
virtual ~MultiLogger() override; | ||
|
||
void AddLogger(Str const &name, ILogger *logger) { loggers[name] = logger; } | ||
void RemoveLogger(Str const &name) { loggers.erase(name); } | ||
|
||
virtual void Log(Str const &message) override; | ||
}; | ||
|
||
class ConsoleLogger : public ILogger { | ||
private: | ||
ConsoleLogger(ConsoleLogger const &) = delete; | ||
ConsoleLogger &operator=(ConsoleLogger const &) = delete; | ||
|
||
public: | ||
ConsoleLogger() = default; | ||
ConsoleLogger(Str const &name) : ILogger(name) {} | ||
virtual ~ConsoleLogger() override {} | ||
|
||
virtual void Log(Str const &message) override { | ||
std::cout << message << std::endl; | ||
} | ||
}; | ||
|
||
class FileLogger : public ILogger { | ||
protected: | ||
std::ofstream mFile; | ||
|
||
private: | ||
FileLogger(FileLogger const &) = delete; | ||
FileLogger &operator=(FileLogger const &) = delete; | ||
|
||
public: | ||
FileLogger(Str const &name) : ILogger(name) { | ||
mFile.open((name + ".txt").c_str(), std::ios::app); | ||
} | ||
FileLogger(Str const &name, Str const &filename) : ILogger(name) { | ||
mFile.open(filename, std::ios::app); | ||
} | ||
virtual ~FileLogger() override {} | ||
|
||
virtual void Log(Str const &message) override { | ||
mFile << message << std::endl; | ||
} | ||
}; | ||
} // namespace TerreateLogger::Loggers | ||
|
||
#endif // __TL_LOGGERS_HPP__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.