121 lines
3.2 KiB
C++
121 lines
3.2 KiB
C++
#include "applog.h"
|
|
#include "spdlog/spdlog.h"
|
|
#include "spdlog/sinks/stdout_color_sinks.h"
|
|
#include "spdlog/sinks/basic_file_sink.h"
|
|
#include "spdlog/sinks/rotating_file_sink.h"
|
|
#include "stringex.hpp"
|
|
#include <iostream>
|
|
#include <algorithm>
|
|
|
|
inline std::string string_toupper(const std::string& str)
|
|
{
|
|
std::string s = str;
|
|
transform(s.begin(), s.end(), s.begin(), toupper);
|
|
return s;
|
|
}
|
|
|
|
void log_init(const std::string& name, bool benv)
|
|
{
|
|
if(spdlog::get(name))
|
|
return;
|
|
|
|
const auto max_size = 1048576 * 5;
|
|
const auto max_files = 3;
|
|
|
|
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
|
|
char *pathvar = getenv(("APP_" + string_toupper(name) + "_CONSOLE_LOG").c_str());
|
|
console_sink->set_level(pathvar ? std::min(spdlog::level::from_str(pathvar), spdlog::level::off) : spdlog::level::off);
|
|
auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("app.log", max_size, max_files);
|
|
pathvar = getenv(("APP_" + string_toupper(name) + "_FILE_LOG").c_str());
|
|
file_sink->set_level(pathvar ? std::min(spdlog::level::from_str(pathvar), spdlog::level::off) : spdlog::level::off);
|
|
auto logger = std::shared_ptr<spdlog::logger>(new spdlog::logger(name, {console_sink, file_sink}));
|
|
pathvar = getenv(("APP_" + string_toupper(name) + "_LOG").c_str());
|
|
logger->set_level(pathvar ? std::min(spdlog::level::from_str(pathvar), spdlog::level::off) : spdlog::level::off);
|
|
spdlog::register_logger(logger);
|
|
}
|
|
|
|
void log_info(const std::string& name, const std::string& msg)
|
|
{
|
|
if(auto log = spdlog::get(name))
|
|
{
|
|
log->info(msg);
|
|
log->flush();
|
|
}
|
|
}
|
|
|
|
void log_warn(const std::string& name, const std::string& msg)
|
|
{
|
|
if (auto log = spdlog::get(name))
|
|
{
|
|
log->warn(msg);
|
|
log->flush();
|
|
}
|
|
}
|
|
|
|
void log_trace(const std::string& name, const std::string& msg)
|
|
{
|
|
if (auto log = spdlog::get(name))
|
|
{
|
|
log->trace(msg);
|
|
log->flush();
|
|
}
|
|
}
|
|
|
|
void log_debug(const std::string& name, const std::string& msg)
|
|
{
|
|
if (auto log = spdlog::get(name))
|
|
{
|
|
log->debug(msg);
|
|
log->flush();
|
|
}
|
|
}
|
|
|
|
void log_error(const std::string& name, const std::string& msg)
|
|
{
|
|
if (auto log = spdlog::get(name))
|
|
{
|
|
log->error(msg);
|
|
log->flush();
|
|
}
|
|
}
|
|
|
|
|
|
void log_critical(const std::string name, const std::string& msg)
|
|
{
|
|
if (auto log = spdlog::get(name))
|
|
{
|
|
log->critical(msg);
|
|
log->flush();
|
|
}
|
|
}
|
|
|
|
bool log_set_level(const std::string& name, int type ,int level)
|
|
{
|
|
if (auto log = spdlog::get(name))
|
|
{
|
|
spdlog::level::level_enum actLevel = (spdlog::level::level_enum)std::min(std::max((int)spdlog::level::trace, level), (int)spdlog::level::off);
|
|
if(type < log->sinks().size())
|
|
log->sinks()[type]->set_level(actLevel);
|
|
else
|
|
log->set_level(actLevel);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool log_get_level(const std::string& name, int type ,int& level)
|
|
{
|
|
if (auto log = spdlog::get(name))
|
|
{
|
|
if(type < log->sinks().size())
|
|
level = log->sinks()[type]->level();
|
|
else
|
|
level = log->level();
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
} |