#include "torch_npu/csrc/logging/LogContext.h"
namespace npu_logging {
LogContext &LogContext::GetInstance()
{
static LogContext instance;
return instance;
}
void LogContext::GetQNameAndLevelByName(const std::string& name, std::string& qname, LoggingLevel& level)
{
std::string nameKey = name;
level = allLevel_;
qname = "";
do {
auto iterLevel = qnameLevels_.find(nameKey);
if (iterLevel != qnameLevels_.end()) {
level = static_cast<LoggingLevel>(iterLevel->second);
qname = iterLevel->first;
break;
}
auto pos = nameKey.rfind('.');
if (pos == std::string::npos) {
break;
}
nameKey = nameKey.substr(0, pos);
} while (true);
}
void LogContext::setLogs(const std::unordered_map<std::string, int>& qnameLevels)
{
std::lock_guard<std::mutex> lock(mutex_);
qnameLevels_ = qnameLevels;
auto iter = qnameLevels_.find("torch");
if (iter != qnameLevels_.end()) {
allLevel_ = static_cast<LoggingLevel>(iter->second);
}
for (auto iter = loggers_.begin(); iter != loggers_.end(); iter++) {
LoggingLevel level = allLevel_;
std::string qname = iter->second->getQName();
if (qname.empty()) {
GetQNameAndLevelByName(iter->first, qname, level);
iter->second->setQName(qname);
}
auto iterLevel = qnameLevels_.find(qname);
if (iterLevel != qnameLevels_.end()) {
level = static_cast<LoggingLevel>(iterLevel->second);
}
iter->second->setAllowLevel(level);
}
}
std::shared_ptr<Logger> LogContext::getLogger(const std::string& name) noexcept
{
std::lock_guard<std::mutex> lock(mutex_);
auto iter = loggers_.find(name);
if (iter != loggers_.end()) {
return iter->second;
}
std::string qname;
LoggingLevel level = allLevel_;
GetQNameAndLevelByName(name, qname, level);
std::shared_ptr<Logger> logger = std::make_shared<Logger>(name);
logger->setAllowLevel(level);
logger->setQName(qname);
loggers_[name] = logger;
return logger;
}
}