Лог-файл не создается

Мне нужен глобальный регистратор, который я могу использовать в нескольких классах моего проекта. Я хочу иметь настройки регистратора в файле ini.

Я начинаю следующий пример здесь и комбинирую его с некоторыми предложениями по моему предыдущему вопросу здесь.

Мой 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;
}

Настройки.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";
}

Однако файл журнала не создается. Что я сейчас делаю не так?


person BKS    schedule 04.09.2018    source источник
comment
Рекомендую улучшить заголовок. Он содержит очень мало информации, что затрудняет его использование будущими программистами с той же или похожей проблемой. Тем не менее, Visual Studio имеет потрясающий отладчик. Вы использовали его, чтобы помочь сузить источник вашей проблемы?   -  person user4581301    schedule 04.09.2018
comment
Я не знаю, что снова означает в названии вопроса. Удалось ли вам заставить свой журнал работать? И затем вы внесли определенные изменения, которые снова его сломали?   -  person Drew Dormann    schedule 04.09.2018
comment
Уровень INFO больше, чем уровень отладки?? Хотя я не использовал этот регистратор, я думаю, что это правильное поведение, основанное на других подобных классах журналирования. Попробуйте WARN << "Program started"; и посмотрите, получите ли вы что-нибудь.   -  person drescherjm    schedule 04.09.2018
comment
@ user4581301 Я обновил заголовок. Я пытаюсь отлаживать с помощью Visual Studio, но он просто идет на глубоком уровне шаблонов, которые я не претендую на понимание. Исключения не возникают или что-то в этом роде.   -  person BKS    schedule 04.09.2018
comment
Спасибо. И достаточно честно о том, насколько безумным может быть код. Я не знаком с boost::log, но boost вообще требует понимания, что подходит к grok.   -  person user4581301    schedule 04.09.2018
comment
@drescherjm Я тоже пробовал с WARN, и все те же результаты. Не создается файл   -  person BKS    schedule 04.09.2018
comment
@DrewDormann Извините за запутанный заголовок. В моем вопросе у меня есть ссылка на другой вопрос, который я разместил. Для этого сценария ведение журнала работало. Однако, когда я пытаюсь преобразовать его в глобальный регистратор, который можно использовать в нескольких классах, я не могу заставить его работать. Надеюсь, это дало вам некоторый контекст, извините за запутанный заголовок снова   -  person BKS    schedule 04.09.2018
comment
Я не могу проверить прямо сейчас, но, по крайней мере, кажется, что // строки добавления некоторых атрибутов должны быть перед init_from_stream   -  person sehe    schedule 06.09.2018
comment
@sehe ты мужчина мой друг. Можете ли вы добавить это как ответ, чтобы я мог отметить это так.   -  person BKS    schedule 06.09.2018


Ответы (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);

Без фабрики фильтр не интерпретируется и в конечном итоге фильтрует все.

person sehe    schedule 06.09.2018