首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Boost日志切割长日志消息

Boost日志切割长日志消息
EN

Stack Overflow用户
提问于 2016-09-13 20:10:58
回答 1查看 436关注 0票数 0

如果日志消息太长(例如1000个字符),boost::log中是否有可能只考虑日志消息的一部分?当跟踪变量内容时,这将是有用的,因为在跟踪变量内容的全部内容并不是必须要知道所需信息的情况下。

例如:当从当前目录打印带有文件列表的字符串时,我不需要查看整个列表就可以知道文件系统是否被扫描成功。

代码语言:javascript
运行
复制
boost::log::add_file_log
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log",
    boost::log::keywords::rotation_size = 10 * 1024 * 1024,
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0),
    boost::log::keywords::auto_flush = true,
    boost::log::keywords::format =
    (
        boost::log::expressions::stream
        << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S:%f")
        << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]"
        << ": <" << boost::log::trivial::severity << "> " 
        << boost::log::expressions::smessage
    )
);

例如:boost::log::expressions::smessage可以像boost::log::expressions::smessage::substr(0, 1000)那样进行定制或以其他方式定制吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-14 00:30:53

从Boost 1.62开始,就有一个max_size_decor装饰师来做你想要的事情。你可以这样使用它:

代码语言:javascript
运行
复制
boost::log::add_file_log
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log",
    boost::log::keywords::rotation_size = 10 * 1024 * 1024,
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0),
    boost::log::keywords::auto_flush = true,
    boost::log::keywords::format =
    (
        boost::log::expressions::stream
        << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S:%f")
        << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]"
        << ": <" << boost::log::trivial::severity << "> " 
        << boost::log::expressions::max_size_decor(1000)
        [
            boost::log::expressions::stream << boost::log::expressions::smessage
        ]
    )
);

装饰器将所采用的格式化程序的输出限制在指定的字符数。

您还可以创建自己的格式化程序。有一个this的答案描述了多种方法来实现这一点。例如,可以使用boost::phoenix::bind包装将限制大小的函数:

代码语言:javascript
运行
复制
boost::string_view limit_size(boost::log::value_ref<
    std::string, boost::log::expressions::tag::smessage > const& message)
{
    if (!message)
    {
        // No message attribute in the log record
        return boost::string_view();
    }

    boost::string_view msg = message.get();
    return msg.substr(0, 1000);
}

boost::log::add_file_log
(
    boost::log::keywords::file_name = "logs/Log_%Y-%m-%d_%H-%M-%S.log",
    boost::log::keywords::rotation_size = 10 * 1024 * 1024,
    boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0),
    boost::log::keywords::auto_flush = true,
    boost::log::keywords::format =
    (
        boost::log::expressions::stream
        << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S:%f")
        << " [" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "]"
        << ": <" << boost::log::trivial::severity << "> " 
        << boost::phoenix::bind(&limit_size, boost::log::expressions::smessage.or_none())
    )
);

在本例中,phoenix::bind创建一个包装器函数对象,该对象从日志记录中提取消息属性值,并将其传递给包装在value_ref引用包装器中的limit_size函数。如果日志记录不包含消息,则引用包装器是空的(这就是or_none所做的)。作为格式化过程的一部分,任何limit_size返回都将输出到流中。在这种情况下,您可以使用boost::string_viewboost::string_ref来避免复制字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39478239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档