36 RegisterAppender<AppenderConsole>();
37 RegisterAppender<AppenderFile>();
54 while (it !=
appenders.end() && it->second && it->second->getName() != name)
57 return it ==
appenders.end() ? nullptr : it->second.get();
62 if (appenderName.empty())
68 std::string options =
sConfigMgr->GetStringDefault(appenderName,
"");
72 size_t const size = tokens.size();
73 std::string name = appenderName.substr(9);
77 fprintf(stderr,
"Log::CreateAppenderFromConfig: Wrong configuration for appender %s. Config line: %s\n", name.c_str(), options.c_str());
88 fprintf(stderr,
"Log::CreateAppenderFromConfig: Unknown type '%s' for appender %s\n", std::string(tokens[0]).c_str(), name.c_str());
94 fprintf(stderr,
"Log::CreateAppenderFromConfig: Wrong Log Level '%s' for appender %s\n", std::string(tokens[1]).c_str(), name.c_str());
104 fprintf(stderr,
"Log::CreateAppenderFromConfig: Unknown flags '%s' for appender %s\n", std::string(tokens[2]).c_str(), name.c_str());
116 fprintf(stderr,
"%s\n", iaae.what());
122 if (appenderName.empty())
127 std::string options =
sConfigMgr->GetStringDefault(appenderName,
"");
128 std::string name = appenderName.substr(7);
132 fprintf(stderr,
"Log::CreateLoggerFromConfig: Missing config option Logger.%s\n", name.c_str());
138 if (tokens.size() != 2)
140 fprintf(stderr,
"Log::CreateLoggerFromConfig: Wrong config option Logger.%s=%s\n", name.c_str(), options.c_str());
144 std::unique_ptr<Logger>& logger =
loggers[name];
147 fprintf(stderr,
"Error while configuring Logger %s. Already defined\n", name.c_str());
154 fprintf(stderr,
"Log::CreateLoggerFromConfig: Wrong Log Level '%s' for logger %s\n", std::string(tokens[0]).c_str(), name.c_str());
161 logger = std::make_unique<Logger>(name, level);
168 logger->addAppender(appender->getId(), appender);
172 fprintf(stderr,
"Error while configuring Appender %s in Logger %s. Appender does not exist\n", std::string(appenderName).c_str(), name.c_str());
178 std::vector<std::string> keys =
sConfigMgr->GetKeysByString(
"Appender.");
179 for (std::string
const& appenderName : keys)
185 std::vector<std::string> keys =
sConfigMgr->GetKeysByString(
"Logger.");
186 for (std::string
const& loggerName : keys)
192 fprintf(stderr,
"Wrong Loggers configuration. Review your Logger config section.\n"
193 "Creating default loggers [root (Error), server (Info)] to console\n");
206 loggers[
"server"].reset(serverLogger);
233 std::shared_ptr<LogOperation> logOperation = std::make_shared<LogOperation>(logger, std::move(msg));
237 logger->
write(msg.get());
244 return it->second.get();
250 size_t found = type.find_last_of(
'.');
251 if (found != std::string::npos)
252 parentLogger = type.substr(0, found);
259 time_t tt = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
262 localtime_r(&tt, &aTm);
271 aTm.tm_year + 1900, aTm.tm_mon + 1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
284 while (it !=
loggers.end() && it->second->getName() != name)
290 it->second->setLogLevel(newLevel);
312 std::ostringstream ss;
313 ss <<
"== START DUMP == (account: " << accountId <<
" guid: " << guid <<
" name: " << name
314 <<
")\n" << str <<
"\n== END DUMP ==\n";
317 std::ostringstream param;
318 param << guid <<
'_' << name;
320 msg->param1 = param.str();
322 write(std::move(msg));
327 for (std::pair<
uint8 const, std::unique_ptr<Appender>>& appender :
appenders)
328 appender.second->setRealmId(
id);
Appender *(* AppenderCreatorFn)(uint8 id, std::string const &name, LogLevel level, AppenderFlags flags, std::vector< std::string_view > const &extraArgs)
std::optional< T > Optional
Optional helper class to wrap optional values within.
void setLogLevel(LogLevel)
void OutMessageImpl(std::string_view filter, LogLevel level, Trinity::FormatStringView messageFormat, Trinity::FormatArgs messageFormatArgs)
Trinity::Asio::Strand * _strand
void write(std::unique_ptr< LogMessage > msg) const
bool SetLogLevel(std::string const &name, int32 level, bool isLogger=true)
bool ShouldLog(std::string const &type, LogLevel level) const
void CreateAppenderFromConfig(std::string const &name)
void OutCharDump(char const *str, uint32 account_id, uint64 guid, char const *name)
void SetRealmId(uint32 id)
void OutCommandImpl(uint32 account, Trinity::FormatStringView messageFormat, Trinity::FormatArgs messageFormatArgs)
std::unordered_map< uint8, std::unique_ptr< Appender > > appenders
std::string m_logsTimestamp
Trinity::Asio::IoContext * _ioContext
void Initialize(Trinity::Asio::IoContext *ioContext)
void ReadAppendersFromConfig()
std::unordered_map< std::string, std::unique_ptr< Logger > > loggers
static std::string GetTimestampStr()
void CreateLoggerFromConfig(std::string const &name)
Appender * GetAppenderByName(std::string_view name)
std::unordered_map< uint8, AppenderCreatorFn > appenderFactory
void ReadLoggersFromConfig()
Logger const * GetLoggerByType(std::string const &type) const
void write(LogMessage *message) const
void addAppender(uint8 type, Appender *appender)
LogLevel getLogLevel() const
decltype(auto) post(boost::asio::io_context &ioContext, T &&t)
std::string ToString(Type &&val, Params &&... params)
fmt::format_args FormatArgs
TC_COMMON_API std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
std::string StringVFormat(FormatStringView fmt, FormatArgs args)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
fmt::string_view FormatStringView