diff options
-rw-r--r-- | src/common/Logging/Appender.cpp | 33 | ||||
-rw-r--r-- | src/common/Logging/Appender.h | 7 | ||||
-rw-r--r-- | src/common/Logging/AppenderConsole.cpp | 34 | ||||
-rw-r--r-- | src/common/Logging/AppenderConsole.h | 5 | ||||
-rw-r--r-- | src/common/Logging/AppenderFile.cpp | 12 | ||||
-rw-r--r-- | src/common/Logging/AppenderFile.h | 3 | ||||
-rw-r--r-- | src/common/Logging/Log.cpp | 18 | ||||
-rw-r--r-- | src/common/Logging/Log.h | 6 | ||||
-rw-r--r-- | src/common/Logging/Logger.cpp | 14 | ||||
-rw-r--r-- | src/common/Logging/Logger.h | 7 | ||||
-rw-r--r-- | src/common/Utilities/Util.cpp | 1 | ||||
-rw-r--r-- | src/server/database/Logging/AppenderDB.cpp | 6 | ||||
-rw-r--r-- | src/server/database/Logging/AppenderDB.h | 3 |
13 files changed, 82 insertions, 67 deletions
diff --git a/src/common/Logging/Appender.cpp b/src/common/Logging/Appender.cpp index 12e441b2ed8..dabd6fcd6f5 100644 --- a/src/common/Logging/Appender.cpp +++ b/src/common/Logging/Appender.cpp @@ -18,12 +18,11 @@ #include "Appender.h" #include "LogMessage.h" #include "StringFormat.h" -#include <sstream> -Appender::Appender(uint8 _id, std::string const& _name, LogLevel _level /* = LOG_LEVEL_DISABLED */, AppenderFlags _flags /* = APPENDER_FLAGS_NONE */): -id(_id), name(_name), level(_level), flags(_flags) { } +Appender::Appender(uint8 _id, std::string _name, LogLevel _level /* = LOG_LEVEL_DISABLED */, AppenderFlags _flags /* = APPENDER_FLAGS_NONE */): +id(_id), name(std::move(_name)), level(_level), flags(_flags) { } -Appender::~Appender() { } +Appender::~Appender() = default; uint8 Appender::getId() const { @@ -55,18 +54,28 @@ void Appender::write(LogMessage* message) if (!level || level > message->level) return; - std::ostringstream ss; + if (flags & (APPENDER_FLAGS_PREFIX_TIMESTAMP | APPENDER_FLAGS_PREFIX_LOGLEVEL | APPENDER_FLAGS_PREFIX_LOGFILTERTYPE)) + { + message->prefix.reserve(100); + message->prefix.clear(); - if (flags & APPENDER_FLAGS_PREFIX_TIMESTAMP) - ss << message->getTimeStr() << ' '; + if (flags & APPENDER_FLAGS_PREFIX_TIMESTAMP) + { + message->prefix.append(message->getTimeStr()); + message->prefix.append(1, ' '); + } - if (flags & APPENDER_FLAGS_PREFIX_LOGLEVEL) - ss << Trinity::StringFormat("{:<5} ", Appender::getLogLevelString(message->level)); + if (flags & APPENDER_FLAGS_PREFIX_LOGLEVEL) + Trinity::StringFormatTo(std::back_inserter(message->prefix), "{:<5} ", getLogLevelString(message->level)); - if (flags & APPENDER_FLAGS_PREFIX_LOGFILTERTYPE) - ss << '[' << message->type << "] "; + if (flags & APPENDER_FLAGS_PREFIX_LOGFILTERTYPE) + { + message->prefix.append(1, '['); + message->prefix.append(message->type); + message->prefix.append("] ", 2); + } + } - message->prefix = ss.str(); _write(message); } diff --git a/src/common/Logging/Appender.h b/src/common/Logging/Appender.h index ed98fd56935..8e1563f83bc 100644 --- a/src/common/Logging/Appender.h +++ b/src/common/Logging/Appender.h @@ -22,14 +22,17 @@ #include "LogCommon.h" #include <stdexcept> #include <string> -#include <vector> struct LogMessage; class TC_COMMON_API Appender { public: - Appender(uint8 _id, std::string const& name, LogLevel level = LOG_LEVEL_DISABLED, AppenderFlags flags = APPENDER_FLAGS_NONE); + Appender(uint8 _id, std::string name, LogLevel level = LOG_LEVEL_DISABLED, AppenderFlags flags = APPENDER_FLAGS_NONE); + Appender(Appender const&) = delete; + Appender(Appender&&) = delete; + Appender& operator=(Appender const&) = delete; + Appender& operator=(Appender&&) = delete; virtual ~Appender(); uint8 getId() const; diff --git a/src/common/Logging/AppenderConsole.cpp b/src/common/Logging/AppenderConsole.cpp index 460f2b6f500..afdaccd6fc7 100644 --- a/src/common/Logging/AppenderConsole.cpp +++ b/src/common/Logging/AppenderConsole.cpp @@ -18,22 +18,21 @@ #include "AppenderConsole.h" #include "LogMessage.h" #include "SmartEnum.h" -#include "StringFormat.h" #include "StringConvert.h" +#include "StringFormat.h" #include "Util.h" #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS #include <Windows.h> #endif -AppenderConsole::AppenderConsole(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args) - : Appender(id, name, level, flags), _colored(false) +AppenderConsole::AppenderConsole(uint8 id, std::string name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args) + : Appender(id, std::move(name), level, flags), _colored(false) { - for (uint8 i = 0; i < NUM_ENABLED_LOG_LEVELS; ++i) - _colors[i] = ColorTypes(NUM_COLOR_TYPES); + std::ranges::fill(_colors, NUM_COLOR_TYPES); - if (3 < args.size()) - InitColors(name, args[3]); + if (args.size() > 3) + InitColors(getName(), args[3]); } void AppenderConsole::InitColors(std::string const& name, std::string_view str) @@ -154,20 +153,23 @@ void AppenderConsole::SetColor(bool stdout_stream, ColorTypes color) void AppenderConsole::ResetColor(bool stdout_stream) { - #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS +#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE); SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); - #else - fprintf((stdout_stream ? stdout : stderr), "\x1b[0m"); - #endif +#else + fputs("\x1b[0m", stdout_stream ? stdout : stderr); +#endif } -void AppenderConsole::Print(std::string const& str, bool error) +void AppenderConsole::Print(std::string const& prefix, std::string const& text, bool error) { #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS - WriteWinConsole(str + "\n", error); + WriteWinConsole(prefix + text + "\n", error); #else - utf8printf(error ? stderr : stdout, "%s\n", str.c_str()); + FILE* out = error ? stderr : stdout; + fwrite(prefix.c_str(), 1, prefix.length(), out); + fwrite(text.c_str(), 1, text.length(), out); + fwrite("\n", 1, 1, out); #endif } @@ -203,9 +205,9 @@ void AppenderConsole::_write(LogMessage const* message) } SetColor(stdout_stream, _colors[index]); - Print(message->prefix + message->text, !stdout_stream); + Print(message->prefix, message->text, !stdout_stream); ResetColor(stdout_stream); } else - Print(message->prefix + message->text, !stdout_stream); + Print(message->prefix, message->text, !stdout_stream); } diff --git a/src/common/Logging/AppenderConsole.h b/src/common/Logging/AppenderConsole.h index 19c5c211028..d687d7fea6c 100644 --- a/src/common/Logging/AppenderConsole.h +++ b/src/common/Logging/AppenderConsole.h @@ -19,6 +19,7 @@ #define APPENDERCONSOLE_H #include "Appender.h" +#include <vector> // EnumUtils: DESCRIBE THIS enum ColorTypes @@ -46,14 +47,14 @@ class TC_COMMON_API AppenderConsole : public Appender public: static constexpr AppenderType type = APPENDER_CONSOLE; - AppenderConsole(uint8 _id, std::string const& name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args); + AppenderConsole(uint8 _id, std::string name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args); void InitColors(std::string const& name, std::string_view init_str); AppenderType getType() const override { return type; } private: void SetColor(bool stdout_stream, ColorTypes color); void ResetColor(bool stdout_stream); - void Print(std::string const& str, bool error); + void Print(std::string const& prefix, std::string const& text, bool error); void _write(LogMessage const* message) override; bool _colored; ColorTypes _colors[NUM_ENABLED_LOG_LEVELS]; diff --git a/src/common/Logging/AppenderFile.cpp b/src/common/Logging/AppenderFile.cpp index cf1aa0b7013..2a8db9b4e06 100644 --- a/src/common/Logging/AppenderFile.cpp +++ b/src/common/Logging/AppenderFile.cpp @@ -21,8 +21,8 @@ #include "StringConvert.h" #include <algorithm> -AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args) : - Appender(id, name, level, flags), +AppenderFile::AppenderFile(uint8 id, std::string name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args) : + Appender(id, std::move(name), level, flags), logfile(nullptr), _logDir(sLog->GetLogsDir()), _maxFileSize(0), @@ -78,7 +78,9 @@ void AppenderFile::_write(LogMessage const* message) FILE* file = OpenFile(namebuf, "a", _backup || exceedMaxSize); if (!file) return; - fprintf(file, "%s%s\n", message->prefix.c_str(), message->text.c_str()); + fwrite(message->prefix.c_str(), 1, message->prefix.length(), file); + fwrite(message->text.c_str(), 1, message->text.length(), file); + fwrite("\n", 1, 1, file); fflush(file); _fileSize += uint64(message->Size()); fclose(file); @@ -90,7 +92,9 @@ void AppenderFile::_write(LogMessage const* message) if (!logfile) return; - fprintf(logfile, "%s%s\n", message->prefix.c_str(), message->text.c_str()); + fwrite(message->prefix.c_str(), 1, message->prefix.length(), logfile); + fwrite(message->text.c_str(), 1, message->text.length(), logfile); + fwrite("\n", 1, 1, logfile); fflush(logfile); _fileSize += uint64(message->Size()); } diff --git a/src/common/Logging/AppenderFile.h b/src/common/Logging/AppenderFile.h index c360e81a2ae..3521a7a8fca 100644 --- a/src/common/Logging/AppenderFile.h +++ b/src/common/Logging/AppenderFile.h @@ -20,13 +20,14 @@ #include "Appender.h" #include <atomic> +#include <vector> class TC_COMMON_API AppenderFile : public Appender { public: static constexpr AppenderType type = APPENDER_FILE; - AppenderFile(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args); + AppenderFile(uint8 id, std::string name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args); ~AppenderFile(); FILE* OpenFile(std::string const& name, std::string const& mode, bool backup); AppenderType getType() const override { return type; } diff --git a/src/common/Logging/Log.cpp b/src/common/Logging/Log.cpp index 99ff568ecd4..feefce33f1e 100644 --- a/src/common/Logging/Log.cpp +++ b/src/common/Logging/Log.cpp @@ -83,13 +83,13 @@ void Log::CreateAppenderFromConfigLine(std::string const& appenderName, std::str auto factoryFunction = appenderFactory.find(type); if (factoryFunction == appenderFactory.end()) { - fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type '%s' for appender %s\n", std::string(tokens[0]).c_str(), name.c_str()); + fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type '" STRING_VIEW_FMT "' for appender %s\n", STRING_VIEW_FMT_ARG(tokens[0]), name.c_str()); return; } if (level > NUM_ENABLED_LOG_LEVELS) { - fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level '%s' for appender %s\n", std::string(tokens[1]).c_str(), name.c_str()); + fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level '" STRING_VIEW_FMT "' for appender %s\n", STRING_VIEW_FMT_ARG(tokens[1]), name.c_str()); return; } @@ -99,14 +99,14 @@ void Log::CreateAppenderFromConfigLine(std::string const& appenderName, std::str flags = AppenderFlags(*flagsVal); else { - fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown flags '%s' for appender %s\n", std::string(tokens[2]).c_str(), name.c_str()); + fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown flags '" STRING_VIEW_FMT "' for appender %s\n", STRING_VIEW_FMT_ARG(tokens[2]), name.c_str()); return; } } try { - Appender* appender = factoryFunction->second(NextAppenderId(), name, level, flags, tokens); + Appender* appender = factoryFunction->second(NextAppenderId(), std::move(name), level, flags, tokens); appenders[appender->getId()].reset(appender); } catch (InvalidAppenderArgsException const& iaae) @@ -152,7 +152,7 @@ void Log::CreateLoggerFromConfigLine(std::string const& loggerName, std::string level = LogLevel(Trinity::StringTo<uint8>(tokens[0]).value_or(LOG_LEVEL_INVALID)); if (level > NUM_ENABLED_LOG_LEVELS) { - fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong Log Level '%s' for logger %s\n", std::string(tokens[0]).c_str(), name.c_str()); + fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong Log Level '" STRING_VIEW_FMT "' for logger %s\n", STRING_VIEW_FMT_ARG(tokens[0]), name.c_str()); return; } @@ -167,11 +167,11 @@ void Log::CreateLoggerFromConfigLine(std::string const& loggerName, std::string { if (Appender* appender = GetAppenderByName(appenderName)) { - logger->addAppender(appender->getId(), appender); + logger->addAppender(appender); //fprintf(stdout, "Log::CreateLoggerFromConfig: Added Appender %s to Logger %s\n", appender->getName().c_str(), name.c_str()); } else - fprintf(stderr, "Error while configuring Appender %s in Logger %s. Appender does not exist\n", std::string(appenderName).c_str(), name.c_str()); + fprintf(stderr, "Error while configuring Appender " STRING_VIEW_FMT " in Logger %s. Appender does not exist\n", STRING_VIEW_FMT_ARG(appenderName), name.c_str()); } } @@ -205,11 +205,11 @@ void Log::ReadLoggersFromConfig() appenders[appender->getId()].reset(appender); Logger* rootLogger = new Logger(LOGGER_ROOT, LOG_LEVEL_ERROR); - rootLogger->addAppender(appender->getId(), appender); + rootLogger->addAppender(appender); loggers[rootLogger->getName()].reset(rootLogger); Logger* serverLogger = new Logger("server", LOG_LEVEL_INFO); - serverLogger->addAppender(appender->getId(), appender); + serverLogger->addAppender(appender); loggers[serverLogger->getName()].reset(serverLogger); } } diff --git a/src/common/Logging/Log.h b/src/common/Logging/Log.h index 9f9634a40ae..99ad69b5d26 100644 --- a/src/common/Logging/Log.h +++ b/src/common/Logging/Log.h @@ -40,12 +40,12 @@ namespace Trinity #define LOGGER_ROOT "root" -typedef Appender*(*AppenderCreatorFn)(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& extraArgs); +typedef Appender*(*AppenderCreatorFn)(uint8 id, std::string name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& extraArgs); template <class AppenderImpl> -Appender* CreateAppender(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& extraArgs) +Appender* CreateAppender(uint8 id, std::string name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& extraArgs) { - return new AppenderImpl(id, name, level, flags, extraArgs); + return new AppenderImpl(id, std::move(name), level, flags, extraArgs); } class TC_COMMON_API Log diff --git a/src/common/Logging/Logger.cpp b/src/common/Logging/Logger.cpp index 63653770ade..571e4d6b7ae 100644 --- a/src/common/Logging/Logger.cpp +++ b/src/common/Logging/Logger.cpp @@ -31,14 +31,9 @@ LogLevel Logger::getLogLevel() const return level; } -void Logger::addAppender(uint8 id, Appender* appender) +void Logger::addAppender(Appender* appender) { - appenders[id] = appender; -} - -void Logger::delAppender(uint8 id) -{ - appenders.erase(id); + appenders.push_back(appender); } void Logger::setLogLevel(LogLevel _level) @@ -54,7 +49,6 @@ void Logger::write(LogMessage* message) const return; } - for (std::pair<uint8 const, Appender*> const& appender : appenders) - if (appender.second) - appender.second->write(message); + for (Appender* appender : appenders) + appender->write(message); } diff --git a/src/common/Logging/Logger.h b/src/common/Logging/Logger.h index 046f5464f40..71f6396fd94 100644 --- a/src/common/Logging/Logger.h +++ b/src/common/Logging/Logger.h @@ -20,8 +20,8 @@ #include "Define.h" #include "LogCommon.h" -#include <unordered_map> #include <string> +#include <vector> class Appender; struct LogMessage; @@ -31,8 +31,7 @@ class TC_COMMON_API Logger public: Logger(std::string const& name, LogLevel level); - void addAppender(uint8 type, Appender* appender); - void delAppender(uint8 type); + void addAppender(Appender* appender); std::string const& getName() const; LogLevel getLogLevel() const; @@ -42,7 +41,7 @@ class TC_COMMON_API Logger private: std::string name; LogLevel level; - std::unordered_map<uint8, Appender*> appenders; + std::vector<Appender*> appenders; }; #endif diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index 5fb34c59948..9730c169832 100644 --- a/src/common/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp @@ -826,6 +826,7 @@ bool ReadWinConsole(std::string& str, size_t size /*= 256*/) bool WriteWinConsole(std::string_view str, bool error /*= false*/) { std::wstring wstr; + wstr.reserve(str.length()); if (!Utf8toWStr(str, wstr)) return false; diff --git a/src/server/database/Logging/AppenderDB.cpp b/src/server/database/Logging/AppenderDB.cpp index 5bac05b47e1..8041cbafdaa 100644 --- a/src/server/database/Logging/AppenderDB.cpp +++ b/src/server/database/Logging/AppenderDB.cpp @@ -20,10 +20,10 @@ #include "LogMessage.h" #include "PreparedStatement.h" -AppenderDB::AppenderDB(uint8 id, std::string const& name, LogLevel level, AppenderFlags /*flags*/, std::vector<std::string_view> const& /*args*/) - : Appender(id, name, level), realmId(0), enabled(false) { } +AppenderDB::AppenderDB(uint8 id, std::string name, LogLevel level, AppenderFlags /*flags*/, std::vector<std::string_view> const& /*args*/) + : Appender(id, std::move(name), level), realmId(0), enabled(false) { } -AppenderDB::~AppenderDB() { } +AppenderDB::~AppenderDB() = default; void AppenderDB::_write(LogMessage const* message) { diff --git a/src/server/database/Logging/AppenderDB.h b/src/server/database/Logging/AppenderDB.h index f4880df659a..64c8aa57f6a 100644 --- a/src/server/database/Logging/AppenderDB.h +++ b/src/server/database/Logging/AppenderDB.h @@ -19,13 +19,14 @@ #define APPENDERDB_H #include "Appender.h" +#include <vector> class TC_DATABASE_API AppenderDB: public Appender { public: static constexpr AppenderType type = APPENDER_DB; - AppenderDB(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args); + AppenderDB(uint8 id, std::string name, LogLevel level, AppenderFlags flags, std::vector<std::string_view> const& args); ~AppenderDB(); void setRealmId(uint32 realmId) override; |