30Log::Log() : AppenderId(0), lowestLogLevel(
LOG_LEVEL_FATAL), m_logsTimestamp(
'_' + GetTimestampStr()), _ioContext(nullptr), _strand(nullptr)
32 RegisterAppender<AppenderConsole>();
33 RegisterAppender<AppenderFile>();
50 while (it !=
appenders.end() && it->second && it->second->getName() != name)
53 return it ==
appenders.end() ? nullptr : it->second.get();
58 if (appenderName.empty())
67 size_t const size = tokens.size();
68 std::string name = appenderName.substr(9);
72 fprintf(stderr,
"Log::CreateAppenderFromConfig: Wrong configuration for appender %s. Config line: %s\n", name.c_str(), options.c_str());
111 fprintf(stderr,
"%s\n", iaae.what());
122 if (loggerName.empty())
127 std::string name = loggerName.substr(7);
131 fprintf(stderr,
"Log::CreateLoggerFromConfig: Missing config option Logger.%s\n", name.c_str());
137 if (tokens.size() != 2)
139 fprintf(stderr,
"Log::CreateLoggerFromConfig: Wrong config option Logger.%s=%s\n", name.c_str(), options.c_str());
145 fprintf(stderr,
"Error while configuring Logger %s. Already defined\n", name.c_str());
182 std::vector<std::string> keys =
sConfigMgr->GetKeysByString(
"Appender.");
183 for (std::string
const& appenderName : keys)
189 std::vector<std::string> keys =
sConfigMgr->GetKeysByString(
"Logger.");
190 for (std::string
const& loggerName : keys)
196 fprintf(stderr,
"Wrong Loggers configuration. Review your Logger config section.\n"
197 "Creating default loggers [root (Error), server (Info)] to console\n");
216 [[maybe_unused]]
bool isNewAppender =
appenderFactory.try_emplace(index, appenderCreateFn).second;
226 LogMessage msg(level, filter, Trinity::StringVFormat(messageFormat, messageFormatArgs));
233 Logger const* logger = GetLoggerByType(
"commands.gm");
248 return it->second.get();
254 size_t found = type.find_last_of(
'.');
255 if (found != std::string::npos)
256 parentLogger = type.substr(0, found);
276 while (it !=
loggers.end() && it->second->getName() != name)
282 it->second->setLogLevel(newLevel);
304 std::string ss =
Trinity::StringFormat(
"== START DUMP == (account: {} guid: {} name: {})\n{}\n== END DUMP ==\n", accountId, guid, name, str);
307 Logger const* logger = GetLoggerByType(
"entities.player.dump");
320 for (std::pair<
uint8 const, std::unique_ptr<Appender>>& appender :
appenders)
321 appender.second->setRealmId(
id);
337 if (level < lowestLogLevel)
340 Logger const* logger = GetLoggerByType(type);
351 if (level < lowestLogLevel)
354 Logger const* logger = GetLoggerByType(type);
#define STRING_VIEW_FMT_ARG(str)
Appender *(* AppenderCreatorFn)(uint8 id, std::string name, LogLevel level, AppenderFlags flags, std::vector< std::string_view > const &extraArgs)
std::optional< T > Optional
Optional helper class to wrap optional values within.
std::string TimeToTimestampStr(time_t t)
void setLogLevel(LogLevel)
std::unordered_map< std::string_view, std::unique_ptr< Logger > > loggers
Trinity::Asio::Strand * _strand
static Log * instance() noexcept
bool SetLogLevel(std::string const &name, int32 level, bool isLogger=true)
void CreateAppenderFromConfig(std::string const &name)
void OutCommandImpl(uint32 account, Trinity::FormatStringView messageFormat, Trinity::FormatArgs messageFormatArgs) const noexcept
void OutCharDump(std::string const &str, uint32 account_id, uint64 guid, std::string const &name) const noexcept
void OutMessageImpl(Logger const *logger, std::string_view filter, LogLevel level, Trinity::FormatStringView messageFormat, Trinity::FormatArgs messageFormatArgs) const noexcept
void SetRealmId(uint32 id)
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
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()
Logger const * GetEnabledLogger(std::string_view type, LogLevel level) const noexcept
bool ShouldLog(std::string_view type, LogLevel level) const noexcept
void SetAsynchronous(Trinity::Asio::IoContext *ioContext)
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
LogLevel getLogLevel() const
void addAppender(Appender *appender)
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 StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
fmt::string_view FormatStringView