I need a global logger that I can use across multiple classes in my project. I want to have logger settings in an ini file.
I start following example here and combined it with some suggestions at my earlier question here.
My Logger.h is as follows.
#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< >)
The Logger.cpp is as follows.
#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;
}
The settings.ini looks like below
#
# 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%"
Finally I am trying to use logger as below.
#include "Logger.h"
int wmain(int argc, wchar_t* argv[])
{
INFO << "Program started";
}
However, no log file is getting created. What am I doing wrong now?
The filter factory needs to be registered before parsing the settings ini.
Needs to be in front of the call
Without the factory, the filter is not interpreted and ends up filtering everything.