Boost logo

Boost Users :

Subject: Re: [Boost-users] [Log] How to use a channel that is constant per file?
From: immanuel litzroth (ilitzroth_at_[hidden])
Date: 2013-09-03 03:14:38


What I"ve just done is define a logger with an attribute in each class:
#define DECLARE_LOGGER(name) static ::youtils::Logger::logger_type&
getLogger__() \
    { \
        static youtils::SeverityLoggerWithAttribute logger(name); \
        return logger.get(); \
    }

Where:
class SeverityLoggerWithAttribute
{
public:

    SeverityLoggerWithAttribute(const std::string& name,
                                const std::string& /*subsystem*/ = "no
subsystem")
    {
        logger_.add_attribute(LOGGER_ATTRIBUTE_ID,

boost::log::attributes::constant<LOGGER_ATTRIBUTE_ID_TYPE>(name));
        // logger_.add_attribute(LOGGER_ATTRIBUTE_SUBSYSTEM,
        //
boost::log::attributes::constant<LOGGER_ATTRIBUTE_SUBSYSTEM_TYPE>(subsystem));
    }

    inline Logger::logger_type&
    get()
    {
        return logger_;
    }
    private:
    Logger::logger_type logger_;
};

Then I wrote some macros:
#define LOG_TYPE(type, message) \
    BOOST_LOG_SEV(getLogger__(), type) << __FUNCTION__ << ": " << message

#define LOG_NOTIFY(message) LOG_TYPE(youtils::Severity::notification,
message)

So long as getLogger__ is in scope and returns the correct logger you can
just LOG_XXX(whatever).
You add DECLARE_LOGGER("xxx") to the class and all the member functions
will do the correct
logging. A mixin class that contains a logger would work equally well --
or better -- but i had to stay
close to an existing architecture.

So the idea is
* use different loggers
* make sure the LOG statements find the correct logger
* Add the attribute to the logger once, and each log record will see it
automatically.
Regards,
i

On Mon, Sep 2, 2013 at 11:10 PM, Timo Schmiade <the_isz_at_[hidden]> wrote:

> Hi all,
>
> I want to use boost's log library to output messages to the console
> which feature a per-message severity and a per-file channel.
>
> I already tried two approaches, none of which was satisfying:
>
> === 1. approach ===
>
> The class boost::log::sources::severity_channel_logger supports both
> severity and channel and I could define it in each source file like so:
>
> --- 8< ---
>
> BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(
> log,
> boost::log::sources::severity_channel_logger<
> boost::log::trivial::severity_level,
> std::string
> >
> )
>
> --- >8 ---
>
> Unfortunately, using it like this requires me to redundantly add the
> channel to each log message, which is very inconvenient because it is
> the same for all logs in the file.
>
> --- 8< ---
>
> // Message.cpp
>
> BOOST_LOG_CHANNEL_SEV(log, Message, trace) << "Hello, world";
>
> --- >8 ---
>
> === 2. approach ===
>
> I defined my logger like this:
>
> --- 8< ---
>
> BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(
> log,
> boost::log::sources::severity_logger<
> boost::log::trivial::severity_level
> >
> )
>
> --- >8 ---
>
> Then, in each file, I manually set the "Channel" attribute for the
> logger, like so:
>
> --- 8< ---
>
> // Message.cpp
>
> log::get().add_attribute(
> "Channel",
> boost::log::attributes::make_constant("Message"));
>
> --- >8 ---
>
> This works, but as the "log" object seems to be stored globally, I would
> have to "invent" new names for the logger object in each file. This is
> both insecure and prevents the usage of macros (I think).
>
> So here's the question:
>
> What would be the recommended / a convenient way to add a per-file
> constant channel to log messages?
>
> Thanks in advance!
>
> Timo
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net