40 default:
return "UNKN ";
46 auto now = std::chrono::system_clock::now();
47 auto time_t_val = std::chrono::system_clock::to_time_t(now);
48 auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
49 now.time_since_epoch()) % 1000;
53 localtime_s(&tm_buf, &time_t_val);
55 localtime_r(&time_t_val, &tm_buf);
59 ss << std::put_time(&tm_buf,
"%Y-%m-%d %H:%M:%S");
60 ss <<
'.' << std::setfill(
'0') << std::setw(3) << ms.count();
68#if KCENON_WITH_COMMON_SYSTEM
70common_system_logger_adapter::common_system_logger_adapter(
const std::string& logger_name)
71 : logger_name_(logger_name) {}
73std::shared_ptr<kcenon::common::interfaces::ILogger>
74common_system_logger_adapter::get_logger()
const {
75 if (logger_name_.empty()) {
76 return kcenon::common::interfaces::get_logger();
78 return kcenon::common::interfaces::get_logger(logger_name_);
81void common_system_logger_adapter::log(log_level level,
const std::string&
message) {
82 auto logger = get_logger();
84 logger->log(to_common_level(level),
message);
88void common_system_logger_adapter::log(log_level level,
const std::string&
message,
89 const std::string& file,
int line,
90 const std::string& function) {
91 auto logger = get_logger();
95 kcenon::common::interfaces::log_entry entry;
96 entry.level = to_common_level(level);
100 entry.function = function;
101 entry.timestamp = std::chrono::system_clock::now();
106bool common_system_logger_adapter::is_level_enabled(log_level level)
const {
107 auto logger = get_logger();
108 return logger ? logger->is_enabled(to_common_level(level)) :
false;
111void common_system_logger_adapter::flush() {
112 auto logger = get_logger();
126 explicit impl(
log_level min_level) : min_level_(static_cast<int>(min_level)) {}
129 if (
static_cast<int>(level) < min_level_)
return;
131 std::lock_guard<std::mutex> lock(mutex_);
134 std::ostringstream oss;
135 oss <<
"[" << timestamp <<
"] "
137 <<
"[network_system] "
140 auto* target = (level >= log_level::error) ? stderr : stdout;
141 const auto& record = oss.str();
142 std::fwrite(record.data(), 1, record.size(), target);
143 std::fputc(
'\n', target);
148 const std::string& file,
int line,
const std::string& function) {
149 if (
static_cast<int>(level) < min_level_)
return;
151 std::lock_guard<std::mutex> lock(mutex_);
154 std::ostringstream oss;
155 oss <<
"[" << timestamp <<
"] "
157 <<
"[network_system] "
159 <<
" (" << file <<
":" << line <<
" in " << function <<
")";
161 auto* target = (level >= log_level::error) ? stderr : stdout;
162 const auto& record = oss.str();
163 std::fwrite(record.data(), 1, record.size(), target);
164 std::fputc(
'\n', target);
169 return static_cast<int>(level) >= min_level_;
173 std::lock_guard<std::mutex> lock(mutex_);
179 min_level_ =
static_cast<int>(level);
183 return static_cast<log_level>(min_level_.load());
192 : pimpl_(std::make_unique<
impl>(min_level)) {}
201 const std::string& file,
int line,
const std::string& function) {
231#if KCENON_WITH_COMMON_SYSTEM
234 logger_ = std::make_shared<common_system_logger_adapter>();
237 logger_ = std::make_shared<basic_logger>();
242 std::lock_guard<std::mutex> lock(
mutex_);
247 std::lock_guard<std::mutex> lock(
mutex_);
249#if KCENON_WITH_COMMON_SYSTEM
250 logger_ = std::make_shared<common_system_logger_adapter>();
252 logger_ = std::make_shared<basic_logger>();
259#if KCENON_WITH_COMMON_SYSTEM
261 auto common_logger = kcenon::common::interfaces::get_logger();
263 common_logger->log(to_common_level(level),
message);
274 const std::string& file,
int line,
const std::string& function) {
275#if KCENON_WITH_COMMON_SYSTEM
278 auto common_logger = kcenon::common::interfaces::get_logger();
280 kcenon::common::interfaces::log_entry entry;
281 entry.level = to_common_level(level);
285 entry.function = function;
286 entry.timestamp = std::chrono::system_clock::now();
287 common_logger->log(entry);
292 logger->log(level,
message, file, line, function);
310 : pimpl_(std::make_unique<
impl>()) {}
327 const std::string& file,
int line,
const std::string& function) {
void set_min_level(log_level level)
void log(log_level level, const std::string &message, const std::string &file, int line, const std::string &function)
impl(log_level min_level)
void log(log_level level, const std::string &message)
log_level get_min_level() const
std::atomic< int > min_level_
bool is_level_enabled(log_level level) const
void log(log_level level, const std::string &message) override
Log a message with specified level.
std::unique_ptr< impl > pimpl_
bool is_level_enabled(log_level level) const override
Check if a log level is enabled.
void set_min_level(log_level level)
Set minimum log level.
void flush() override
Flush any buffered log messages.
log_level get_min_level() const
Get current minimum log level.
void set_logger(std::shared_ptr< logger_interface > logger)
std::shared_ptr< logger_interface > logger_
std::shared_ptr< logger_interface > get_logger()
void log(log_level level, const std::string &message, const std::string &file, int line, const std::string &function)
void log(log_level level, const std::string &message)
Manager for logger system integration.
static logger_integration_manager & instance()
Get the singleton instance.
logger_integration_manager()
~logger_integration_manager()
void log(log_level level, const std::string &message)
Log a message.
void set_logger(std::shared_ptr< logger_interface > logger)
Set the logger implementation.
std::shared_ptr< logger_interface > get_logger()
Get the current logger.
std::unique_ptr< impl > pimpl_
Feature flags for network_system.
Logger system integration interface for network_system.
log_level
Log severity levels.
static std::string get_timestamp()
static const char * level_to_string(log_level level)