我尝试使用Boost Log V2设置记录器。输出应类似于(文件blubb.log):
2019-08-24 23:24:08-错误:嗨,源代码。
我目前正在努力解决严重性级别的大写问题。其余的工作到现在为止。
get(key,default_value)提供了:: to_string()对话,但我没有使它在严重性类型中起作用。因此,我尝试将数据放入字符串流。
logger.cpp(不包括)
namespace logging = boost::log;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace sinks = boost::log::sinks;
namespace keywords = boost::log::keywords;
BOOST_LOG_ATTRIBUTE_KEYWORD(att_channel, "Channel", std::string);
typedef src::severity_channel_logger<logging::trivial::severity_level, std::string> severity_channel_logger_t;
typedef sinks::synchronous_sink< sinks::text_ostream_backend > synchronous_sink_t;
static std::map<std::string, severity_channel_logger_t> map_logger;
static std::unordered_set<std::string> profiles = { "blubb", "configreader", "connector", "downloader", "mlog", "output", "provider", "rest" };
static std::unordered_map<std::string, logging::trivial::severity_level> levels = {
{ "trace" , logging::trivial::trace},
{ "debug" , logging::trivial::debug},
{ "info" , logging::trivial::info},
{ "warning" , logging::trivial::warning},
{ "error" , logging::trivial::error},
{ "fatal" , logging::trivial::fatal}
};
Logger::Logger()
{
for (std::unordered_set<std::string>::iterator it = profiles.begin(); it != profiles.end(); it++)
{
map_logger[*it] = severity_channel_logger_t(keywords::channel = *it);
create_channel_logger(*it);
}
logging::add_common_attributes();
}
std::stringstream Logger::sev_toupper(logging::trivial::severity_type severity)
{
std::stringstream in;
std::stringstream out;
char c;
in << severity;
while (in >> c)
{
out << toupper(c);
}
return out;
}
void Logger::logmsg(std::string channel, const std::string level, const std::string message)
{
// fallback channel, if not in list
if (profiles.find(channel) == profiles.end())
channel = "rest";
BOOST_LOG_SEV(map_logger[channel], levels[level]) << message;
}
void Logger::create_channel_logger(std::string channel)
{
logging::add_file_log
(
keywords::file_name = channel+".log",
keywords::open_mode = std::ios_base::app,
keywords::filter = att_channel == channel,
keywords::auto_flush = true,
keywords::format =
(
expr::stream
<< expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S")
<< " - "
<< std::right << std::setw(7) << sev_toupper(logging::trivial::severity).str().c_str()
<< std::left << ": " << expr::smessage
)
);
}
main.cpp
int main(int, char*[])
{
Logger * lg = new Logger();
lg->logmsg("blubb", "error", "Hi, from Source Code!");
delete lg;
}
我的函数 sev_toupper()产生gargabe。 expr :: stream 似乎以与 std :: stringstream 不同的方式处理 logging :: trivial :: severity 。
答案 0 :(得分:0)
我会避免将stringstream
用于单个单词。您可以使用std::transform
通过转换字符串的函数来运行字符串的每个字符,如下所示:
#include <algorithm>
#include <cctype>
std::string Logger::sev_toupper(logging::trivial::severity_type severity)
{
std::string text = logging::trivial::to_string(severity);
std::transform(text.begin(), text.end(), text.begin(), toupper);
return text;
}