【问题标题】:Log file is not getting created未创建日志文件
【发布时间】:2019-02-09 20:25:39
【问题描述】:

我需要一个可以在项目中的多个类中使用的全局记录器。我想在 ini 文件中有记录器设置。

我开始遵循示例 here 并将其与我之前的问题 here 中的一些建议结合起来。

我的Logger.h如下。

#pragma once

#include <boost/log/common.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/utility/setup/from_stream.hpp>
#include <boost/regex.hpp>

#include <boost/log/expressions.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup.hpp>


#define INFO  BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::info)
#define WARN  BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::warning)
#define ERROR BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::error)

//Narrow-char thread-safe logger.
typedef boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> logger_t;

//declares a global logger with a custom initialization
BOOST_LOG_GLOBAL_LOGGER(my_logger, logger_t)
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(test_lg, boost::log::sources::severity_logger< >)

Logger.cpp如下。

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

namespace attrs = boost::log::attributes;
namespace expr = boost::log::expressions;
namespace logging = boost::log;

//Defines a global logger initialization routine
BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, logger_t)
{
    logger_t lg;

    logging::add_common_attributes();

    std::ifstream settings("settings.ini");
    if (!settings.is_open())
    {
        std::cout << "Could not open settings.txt file" << std::endl;
        //return 1;
    }

    // Read the settings and initialize logging library
    logging::init_from_stream(settings);

    // Add some attributes
    logging::core::get()->add_global_attribute("TimeStamp", attrs::local_clock());
    logging::register_simple_filter_factory<logging::trivial::severity_level>("Severity");

    return lg;
}

settings.ini 如下所示

#
#          Copyright Andrey Semashev 2007 - 2014.
# Distributed under the Boost Software License, Version 1.0.
#    (See accompanying file LICENSE_1_0.txt or copy at
#          http://www.boost.org/LICENSE_1_0.txt)
#

[Core]
Filter="%Severity% >= debug"

[Sinks.1]
Destination=TextFile
FileName=test.log
AutoFlush=true
Format="[%TimeStamp%] <%Severity%> (%Channel%): %Message%"

最后我尝试如下使用记录器。

#include "Logger.h"
int wmain(int argc, wchar_t* argv[])
{
    INFO << "Program started";
}

但是,没有创建日志文件。我现在做错了什么?

【问题讨论】:

  • 我建议改进标题。它包含的信息非常少,使得未来遇到相同或类似问题的程序员更难使用。也就是说,Visual Studio 有一个了不起的调试器。您是否使用它来帮助缩小问题的根源?
  • 我不知道问题标题中的“再次”是什么意思。你让你的日志记录工作了吗?然后你做了一些改变再次
  • INFO 级别是否高于调试?虽然我没有使用过这个记录器,但我认为这是基于其他类似日志记录类的正确行为。试试WARN &lt;&lt; "Program started";,看看有没有收获。
  • @user4581301 我更新了标题。我尝试使用 Visual Studio 进行调试,但它只是深入到我不假装理解的模板中。没有抛出异常或类似的东西
  • 我现在不能测试,但至少看起来“//添加一些属性”行需要在“init_from_stream”之前

标签: c++ visual-studio boost-log boost-logging


【解决方案1】:

过滤器工厂需要在解析设置ini之前注册

// Add some attributes
logging::core::get()->add_global_attribute("TimeStamp", attrs::local_clock());
logging::register_simple_filter_factory<logging::trivial::severity_level>("Severity");

需要在电话前面

// Read the settings and initialize logging library
logging::init_from_stream(settings);

没有工厂,过滤器不会被解释并最终过滤所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多