标签: boost-logging

提升日志以打印源代码文件名和行号

我正在使用Boost(1.55.0)登录我的C++应用程序.我已经能够生成这种格式的日志

[2014-Jul-15 10:47:26.137959]: <debug>  A regular message
Run Code Online (Sandbox Code Playgroud)

我希望能够在生成日志的位置添加源文件名和行号.

[2014-Jul-15 10:47:26.137959]: <debug> [filename:line_no] A regular message
Run Code Online (Sandbox Code Playgroud)

例:

[2014-Jul-15 10:47:26.137959]: <debug> [helloworld.cpp : 12] A regular message
Run Code Online (Sandbox Code Playgroud)

源代码:

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/log/attributes/attribute.hpp>
#include <boost/log/attributes/attribute_cast.hpp>
#include <boost/log/attributes/attribute_value.hpp>
#include <boost/make_shared.hpp>
#include <boost/property_tree/ptree.hpp>

namespace logging = boost::log;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace keywords = boost::log::keywords;

void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log", …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-logging boost-log

14
推荐指数
3
解决办法
8094
查看次数

如何使用Gloa从多个文件中使用boost日志

我正在尝试在整个应用程序中创建一个Global Logger,以便我可以使用

src::severity_logger_mt< >& lg = my_logger::get();
Run Code Online (Sandbox Code Playgroud)

获取不同类(驻留在不同文件中)日志记录的全局记录器.

我尝试按照boost.org中列出的示例(如下所列).但似乎没有用.有没有人知道我可以遵循的任何例子或我需要做什么,如果有效.谢谢.

http://www.boost.org/doc/libs/1_54_0/libs/log/doc/html/log/detailed/sources.html

BOOST_LOG_GLOBAL_LOGGER(my_logger, src::severity_logger_mt)


// my_logger.h
// ===========

#include "my_logger.h"

BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, src::severity_logger_mt)
{
    src::severity_logger_mt< > lg;
    lg.add_attribute("StopWatch", boost::make_shared< attrs::timer >());
    return lg;
}

// my_logger.cpp
// ===========

#include "my_logger.h"

BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, src::severity_logger_mt)
{
    src::severity_logger_mt< > lg;
    lg.add_attribute("StopWatch", boost::make_shared< attrs::timer >());
    return lg;
}
Run Code Online (Sandbox Code Playgroud)

boost boost-logging

9
推荐指数
1
解决办法
4505
查看次数

Boost.log:如何防止输出在使用add_file_log()函数时被复制到所有添加的流?

我使用该add_file_log()函数初始化将日志记录存储到文本文件中的日志记录接收器.当我定义几个接收器时,我观察到:

  • 为每个接收器创建一个文件.
  • 输出将复制到所有文件.

这是我的记录器:

class logger
{
public:
  logger(const logger&) =delete;
  logger(logger&&) =delete;
  logger& operator=(const logger&) =delete;
  logger& operator=(logger&&) =delete;

  static logger& get_instance(
    const std::string& file,
    bool console
  )
  {
      boost::log::register_simple_formatter_factory<
                                                    boost::log::trivial::severity_level,
                                                    char
                                                   >("Severity");

      std::string the_format = "[%TimeStamp%] (%LineID%) [%Severity%]: %Message%";

      if(!file.empty()) {
        boost::log::add_file_log(
          boost::log::keywords::file_name = file + "_%N.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::open_mode = (std::ios::out | std::ios::app),
          boost::log::keywords::format = the_format
        );
      }

      boost::log::add_common_attributes();
      static logger instance{ …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-logging boost-log c++11

7
推荐指数
1
解决办法
2618
查看次数

重载<<运算符以提升日志记录对象

所以我想使用Boost.Log进行所有日志记录.我目前编写了一个包含实例化和设置辅助方法所需的所有操作的类.

问题是我想重载<<运算符以cout方式使用它.我希望能够使用它来使不同的参数类型似乎是最大的问题.

这是我试过的:

template <typename T>
void trace::operator <<(T data)
{
    std::string text=boost::lexical_cast<std::string>(data);
    std::cout<<data<<std::endl;
    BOOST_LOG_TRIVIAL(debug) << text;
}
Run Code Online (Sandbox Code Playgroud)

但是,据我所知,这在逻辑上有点瑕疵.为了能够将多个args传递给<<它需要递归.但我有点困惑如何用升压日志来做这件事.

我是否必须使用自定义接收器而不是方便的boost宏来定义日志系统?如果是这样支持std :: ostream返回?我猜这将是返回值和流中的输入值.

c++ boost boost-logging boost-log

7
推荐指数
1
解决办法
1624
查看次数

获取boost.log记录器的严重性..?

假设我有一个简单的boost.log severity_logger记录器设置如下:

   logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::debug);
   logging::add_common_attributes();
   src::severity_logger< logging::trivial::severity_level > logger;
Run Code Online (Sandbox Code Playgroud)

如何以编程方式检查严重性?
有点像logger.getSeverity()..?

我已经在StackOverflow上筛选了文档和其他问题但是却找不到应该是一个简单的API调用..?

c++ boost boost-logging boost-log

6
推荐指数
1
解决办法
1641
查看次数

Boost.Log与Boost.Log v2

我目前正在评估一些非托管C++的日志框架.

我的问题是:Boost.Log和Boost.Log v2有什么区别?
Api是不同的?在项目中使用Boost.Log v2是否安全,还是应该坚持使用Boost.Log 1.1?
何时被Boost接受?它可能在未来遭受重大变化?

c++ boost boost-logging boost-log

6
推荐指数
1
解决办法
2531
查看次数

Yocto 1.6工具链中没有libboost_log

我按照Daiane Angolini编写的教程安装了Yocto 1.6并运行bitbake来设置工具链.虽然我在$ SDKTARGETSYSROOT/usr/lib下看到了大多数boost库,但似乎没有libboost_log.a和libboost_log_setup.a.我相信这些是在Boost 1.55中引入的,Yocto 1.6已经升至1.55.他们不应该在那里,或者我做错了什么?

我的.../fsl-community-bsp/build/conf/local.conf:

BB_NUMBER_THREADS ?= "${@oe.utils.cpu_count()}"
PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}"
MACHINE ??= 'imx6qsabresd'
DISTRO ?= 'poky'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES = "debug-tweaks tools-sdk"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS = "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K" 
PACKAGECONFIG_pn-qemu-native = "sdl"
PACKAGECONFIG_pn-nativesdk-qemu = "sdl"
ASSUME_PROVIDED += "libsdl-native"
CONF_VERSION = "1"

BB_NUMBER_THREADS = '1'
PARALLEL_MAKE = '-j 1'

DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = ""


CORE_IMAGE_EXTRA_INSTALL += "boost"
Run Code Online (Sandbox Code Playgroud)

boost boost-logging boost-log yocto

5
推荐指数
2
解决办法
1344
查看次数

提升日志记录 - 目标和格式化程序

我在使用Boost Logging库时遇到问题,如果我使用自己的Log类向记录器添加格式化程序或目标,我就无法更改该目标或格式化程序.

有人知道如何在boost日志对象上更改目标或格式化程序吗?

我的场景是我希望服务器组件处理的每个请求都有不同的目标(文件名),因此我需要有灵活的方法来更改它们.此外,我将同时从不同的线程登录,每个日志应该真正拥有它自己的目的地,轻松添加 - 删除.

事实上,宏的日志对象实际上是应用程序全局,并没有真正帮助这一点.

任何人都可以给我一些指导,告诉我如何创建一种灵活的方法来从boost :: logging添加/删除Logger的目标?

c++ boost-logging

5
推荐指数
1
解决办法
992
查看次数

如何使用自定义 boost::log 格式化程序输出 TimeStamp 和 ThreadID 属性?

我正在使用自定义boost::log格式化程序对输出日志消息进行颜色编码,但我找不到将TimeStampThreadID属性添加到日志的正确方法。当我使用文件日志记录时,我只是将其写keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%"logging::add_file_log参数。我想在以下自定义格式化程序中具有类似的效果:

void coloring_formatter(const logging::record_view& record,
                        logging::formatting_ostream& stream)
{
  auto severity = record[logging::trivial::severity];
  assert(severity);

  stream << "\e[1m";

  switch (severity.get())
  {
  case logging::trivial::severity_level::trace:
    stream << "\e[97m";
    break;
  case logging::trivial::severity_level::debug:
    stream << "\e[34m";
    break;
  case logging::trivial::severity_level::info:
    stream << "\e[32m";
    break;
  case logging::trivial::severity_level::warning:
    stream << "\e[93m";
    break;
  case logging::trivial::severity_level::error:
    stream << "\e[91m";
    break;
  case logging::trivial::severity_level::fatal:
    stream << "\e[41m";
    break;
  }

  stream // << output TimeStamp
         // << output ThreadID …
Run Code Online (Sandbox Code Playgroud)

c++ logging boost boost-logging boost-log

5
推荐指数
1
解决办法
1289
查看次数

使用 Boost 同时记录到控制台和文件

我需要帮助来初始化 boost 日志记录框架,以同时记录到命名日志文件和控制台 - (命名日志文件不需要定期轮换或按照许多 boost 教程进行任何花哨的设置)。

日志文本应该同时发送到两个接收器,但是我需要将控制台输出的格式稍微不同(因为用户将看到它)。我能够使用 boost 示例代码了解记录到 2 个独立接收器的基础知识。对于我需要做的事情来说,它过于复杂,并且就访问适当的记录器而言确实令人困惑。我需要做的就是将带有时间戳的消息发送到日志文件,并具有相同的信息,而无需将时间戳或换行符发送到控制台日志(仅像我通常使用的那样显式放入新行<< std::endl)。我真的很想坚持使用 boost 的日志框架,因为它提供了未来扩展的灵活性。

在这个例子中,我尝试了tail -f日志文件 - 但是日志输出似乎不会在每个日志条目后自动刷新。尽管这对于文件日志来说不是很重要,但这对于控制台输出流至关重要,因为它代表用户将监视的实时活动。

非常感谢任何帮助,甚至更好的一些非常简单的示例代码来使基础工作正常工作。

我设置日志记录的方式(根据上面的链接)如下所示,我想用控制台记录器替换这些注册接收器之一 - 但我不确定如何操作。我希望控制台记录器能够自动刷新。

// Setup the common formatter for all sinks
logging::formatter fmt = expr::stream
    << std::setw(6) << std::setfill('0') << line_id << std::setfill(' ')
    << ": <" << severity << ">\t"
    << expr::if_(expr::has_attr(tag_attr))
    [
        expr::stream << "[" << tag_attr << "] "
    ]
    << expr::smessage;

// Initialize sinks
typedef sinks::synchronous_sink<sinks::text_ostream_backend> text_sink;

boost::shared_ptr<text_sink> sink = …
Run Code Online (Sandbox Code Playgroud)

c++ logging boost boost-logging boost-log

5
推荐指数
1
解决办法
7746
查看次数

如何为boost :: log console输出添加颜色编码?

我正在尝试为linux下的boost :: log添加彩色日志输出.我读了以下内容,并尝试了这个:

#define MY_LOG_ERROR() BOOST_LOG_TRIVIAL(error) << "\033[1;31"

MY_LOG_ERROR() << "This is an error log."
Run Code Online (Sandbox Code Playgroud)

但它给了我以下结果:

[2016-07-11 17:23:16.328435] [0x00007f15f03d6780] [错误] [1; 31这是一个错误日志.

如何正确添加彩色日志输出到boost :: log?

c++ logging boost boost-logging boost-log

4
推荐指数
1
解决办法
3043
查看次数

如何手动冲洗升压日志?

我正在使用Boost.Log中的boost 1.54.0来查看它是否适用于我的应用程序.一般来说,我没有缓冲问题,所以我不打算打开auto_flush或其他任何东西......但是我注意到在我调用之前记录的消息fork()是重复的,我想知道它是否是因为它们是缓冲的,所以在复制过程映像时缓冲区会被复制,然后两个进程最终将它们的缓冲区副本写入日志文件......

所以基本上,我只想在我打电话之前在日志上做一次手动刷新,fork()以确保没有消息仍然在内存中.换句话说,我正在寻找一个类似于fflush(),.flush(),<< flush等我可以在升压日志使用.

我确实尝试使用<< flush日志,但我仍然得到重复的消息,所以我不是100%确定它是否正在刷新并且重复是由其他一些问题引起的,或者它是否以某种方式默默地忽略了<< flush...

编辑:

我环顾四周,发现升压日志不是叉安全的.所以我应该补充一点,我不是想在父进程和子进程中使用相同的日志.我有两个分叉场景 - 在一个,父母立即终止和孩子contineus(这应该是安全的),而在另一个,孩子应该打开自己的单独的日志文件,所以这应该是安全的...但我需要弄清楚如何关闭日志文件接收器,然后打开一个新文件(在不同的文件上).我想关闭水槽也可能是一种强制冲洗的方法......?

c++ boost flush boost-logging boost-log

4
推荐指数
2
解决办法
6776
查看次数

没有创建日志文件

我在以下链接中使用该示例.

https://www.boost.org/doc/libs/1_57_0/libs/log/doc/html/log/detailed/utilities.html#log.detailed.utilities.setup.settings_file

我的代码如下.

#include "stdafx.h"
#include <iostream>
#include <fstream>

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/from_stream.hpp>
#include <boost/log/utility/setup/settings.hpp>
#include <boost/log/utility/setup/from_settings.hpp>
#include <boost/regex.hpp>

namespace logging = boost::log;
namespace keywords = boost::log::keywords;
#define BOOST_LOG_DYN_LINK 1


int main(int, char*[])
{
    //init_logging();
    std::ifstream file("settings.ini");
    logging::init_from_stream(file);

    BOOST_LOG_TRIVIAL(trace) << "This is a trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "This is a debug severity message";
    BOOST_LOG_TRIVIAL(info) << "This is an informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "This is a warning severity message";
    BOOST_LOG_TRIVIAL(error) << …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-logging boost-log

0
推荐指数
1
解决办法
110
查看次数

标签 统计

boost-logging ×13

boost ×12

boost-log ×11

c++ ×11

logging ×3

c++11 ×1

flush ×1

yocto ×1