35 RegisterAppender<AppenderConsole>();
36 RegisterAppender<AppenderFile>();
53 while (it !=
appenders.end() && it->second && it->second->getName() != name)
56 return it ==
appenders.end() ? nullptr : it->second.get();
61 if (appenderName.empty())
70 size_t const size = tokens.size();
71 std::string name = appenderName.substr(9);
75 fprintf(stderr,
"Log::CreateAppenderFromConfig: Wrong configuration for appender %s. Config line: %s\n", name.c_str(), options.c_str());
86 fprintf(stderr,
"Log::CreateAppenderFromConfig: Unknown type '%s' for appender %s\n", std::string(tokens[0]).c_str(), name.c_str());
92 fprintf(stderr,
"Log::CreateAppenderFromConfig: Wrong Log Level '%s' for appender %s\n", std::string(tokens[1]).c_str(), name.c_str());
102 fprintf(stderr,
"Log::CreateAppenderFromConfig: Unknown flags '%s' for appender %s\n", std::string(tokens[2]).c_str(), name.c_str());
114 fprintf(stderr,
"%s\n", iaae.what());
125 if (loggerName.empty())
130 std::string name = loggerName.substr(7);
134 fprintf(stderr,
"Log::CreateLoggerFromConfig: Missing config option Logger.%s\n", name.c_str());
140 if (tokens.size() != 2)
142 fprintf(stderr,
"Log::CreateLoggerFromConfig: Wrong config option Logger.%s=%s\n", name.c_str(), options.c_str());
148 fprintf(stderr,
"Error while configuring Logger %s. Already defined\n", name.c_str());
155 fprintf(stderr,
"Log::CreateLoggerFromConfig: Wrong Log Level '%s' for logger %s\n", std::string(tokens[0]).c_str(), name.c_str());
174 fprintf(stderr,
"Error while configuring Appender %s in Logger %s. Appender does not exist\n", std::string(appenderName).c_str(), name.c_str());
185 std::vector<std::string> keys =
sConfigMgr->GetKeysByString(
"Appender.");
186 for (std::string
const& appenderName : keys)
192 std::vector<std::string> keys =
sConfigMgr->GetKeysByString(
"Logger.");
193 for (std::string
const& loggerName : keys)
199 fprintf(stderr,
"Wrong Loggers configuration. Review your Logger config section.\n"
200 "Creating default loggers [root (Error), server (Info)] to console\n");
240 std::shared_ptr<LogOperation> logOperation = std::make_shared<LogOperation>(logger, std::move(msg));
244 logger->
write(msg.get());
251 return it->second.get();
257 size_t found = type.find_last_of(
'.');
258 if (found != std::string::npos)
259 parentLogger = type.substr(0, found);
266 time_t tt = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
269 localtime_r(&tt, &aTm);
280 aTm.tm_year + 1900, aTm.tm_mon + 1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
282 catch (std::exception
const& ex)
284 fprintf(stderr,
"Failed to initialize timestamp part of log filename! %s", ex.what());
300 while (it !=
loggers.end() && it->second->getName() != name)
306 it->second->setLogLevel(newLevel);
328 std::ostringstream ss;
329 ss <<
"== START DUMP == (account: " << accountId <<
" guid: " << guid <<
" name: " << name
330 <<
")\n" << str <<
"\n== END DUMP ==\n";
333 std::ostringstream param;
334 param << guid <<
'_' << name;
336 msg->param1 = param.str();
338 write(std::move(msg));
343 for (std::pair<
uint8 const, std::unique_ptr<Appender>>& appender :
appenders)
344 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)
std::unordered_map< std::string_view, std::unique_ptr< Logger > > loggers
Trinity::Asio::Strand * _strand
void write(std::unique_ptr< LogMessage > msg) const
bool SetLogLevel(std::string const &name, int32 level, bool isLogger=true)
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
void CreateAppenderFromConfigLine(std::string const &name, std::string const &options)
Logger const * GetLoggerByType(std::string_view type) const
std::string m_logsTimestamp
Trinity::Asio::IoContext * _ioContext
void CreateLoggerFromConfigLine(std::string const &name, std::string const &options)
void Initialize(Trinity::Asio::IoContext *ioContext)
void ReadAppendersFromConfig()
static std::string GetTimestampStr()
bool ShouldLog(std::string_view type, LogLevel level) const
void CreateLoggerFromConfig(std::string const &name)
Appender * GetAppenderByName(std::string_view name)
std::unordered_map< uint8, AppenderCreatorFn > appenderFactory
void ReadLoggersFromConfig()
void write(LogMessage *message) const
void addAppender(uint8 type, Appender *appender)
LogLevel getLogLevel() const
std::string const & getName() 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
constexpr std::size_t size()