From a75486f3ecd028a3e1e71e6a13da49c69749c259 Mon Sep 17 00:00:00 2001 From: winckler Date: Tue, 29 Sep 2015 16:50:44 +0200 Subject: [PATCH] * split log console output sink into two sinks, one for cout and one for cerr. * remove logger_oldboost_version files and add ifdef boost version in logger.cxx instead * change default logger level in FairMqProgOptions --- fairmq/FairMQLogger.h | 6 - fairmq/logger/CMakeLists.txt | 15 +- fairmq/logger/logger.cxx | 44 +++- fairmq/logger/logger.h | 4 +- fairmq/logger/logger_def.h | 1 + fairmq/logger/logger_oldboost_version.cxx | 235 ---------------------- fairmq/logger/logger_oldboost_version.h | 157 --------------- fairmq/logger/run/testLogger.cxx | 3 +- fairmq/options/FairMQProgOptions.cxx | 6 +- fairmq/options/FairProgOptions.cxx | 2 +- 10 files changed, 55 insertions(+), 418 deletions(-) delete mode 100644 fairmq/logger/logger_oldboost_version.cxx delete mode 100644 fairmq/logger/logger_oldboost_version.h diff --git a/fairmq/FairMQLogger.h b/fairmq/FairMQLogger.h index 020bb9b5..f3ae6ee0 100644 --- a/fairmq/FairMQLogger.h +++ b/fairmq/FairMQLogger.h @@ -15,13 +15,7 @@ #ifndef FAIRMQLOGGER_H_ #define FAIRMQLOGGER_H_ -#include - -#if BOOST_VERSION < 105600 -#include "logger/logger_oldboost_version.h" -#else #include "logger/logger.h" -#endif typedef unsigned long long timestamp_t; timestamp_t get_timestamp(); diff --git a/fairmq/logger/CMakeLists.txt b/fairmq/logger/CMakeLists.txt index f86656a3..87c1149a 100644 --- a/fairmq/logger/CMakeLists.txt +++ b/fairmq/logger/CMakeLists.txt @@ -19,11 +19,8 @@ set(LINK_DIRECTORIES ${Boost_LIBRARY_DIRS}) link_directories(${LINK_DIRECTORIES}) -if(NOT ("${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}" VERSION_LESS "1.56") ) - set(SRCS logger.cxx) -else() - set(SRCS logger_oldboost_version.cxx) -endif() +set(SRCS logger.cxx) + set(LIBRARY_NAME fairmq_logger) set(DEPENDENCIES @@ -36,11 +33,9 @@ set(DEPENDENCIES pthread ) - -if(NOT ("${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}" VERSION_LESS "1.56") ) - install(FILES logger.h logger_def.h DESTINATION include/logger) -else() - install(FILES logger_oldboost_version.h logger_def.h fairroot_null_deleter.h DESTINATION include/logger) +install(FILES logger.h logger_def.h DESTINATION include/logger) +if("${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}" VERSION_LESS "1.56") + install(FILES fairroot_null_deleter.h DESTINATION include/logger) endif() diff --git a/fairmq/logger/logger.cxx b/fairmq/logger/logger.cxx index a0652753..2bfbd24c 100644 --- a/fairmq/logger/logger.cxx +++ b/fairmq/logger/logger.cxx @@ -6,13 +6,21 @@ * copied verbatim in the file "LICENSE" * ********************************************************************************/ #include "logger.h" - +#include #include #include #include #include #include + +#if BOOST_VERSION < 105600 +#include "fairroot_null_deleter.h" +typedef fairroot::null_deleter empty_deleter_t; +#else #include +typedef boost::null_deleter empty_deleter_t; +#endif + #include #include @@ -37,20 +45,48 @@ BOOST_LOG_GLOBAL_LOGGER_INIT(global_logger, src::severity_logger_mt) return global_logger; } -void init_log_console() +void init_log_console(bool color_format) { // add a text sink typedef sinks::synchronous_sink text_sink; + + + // CONSOLE - all severity except error boost::shared_ptr sink = boost::make_shared(); // add "console" output stream to our sink - sink->locked_backend()->add_stream(boost::shared_ptr(&std::clog, boost::null_deleter())); + sink->locked_backend()->add_stream(boost::shared_ptr(&std::cout, empty_deleter_t())); // specify the format of the log message - sink->set_formatter(&init_log_formatter); + if(color_format) + sink->set_formatter(&init_log_formatter); + else + sink->set_formatter(&init_log_formatter); + + sink->set_filter(severity != SEVERITY_ERROR); // add sink to the core logging::core::get()->add_sink(sink); + + + // CONSOLE - only severity error + boost::shared_ptr sink_error = boost::make_shared(); + sink_error->locked_backend()->add_stream(boost::shared_ptr(&std::cerr, empty_deleter_t())); + + if(color_format) + sink_error->set_formatter(&init_log_formatter); + else + sink_error->set_formatter(&init_log_formatter); + + sink_error->set_filter(severity == SEVERITY_ERROR); + logging::core::get()->add_sink(sink_error); } +void reinit_logger(bool color_format) +{ + logging::core::get()->remove_all_sinks(); + init_log_console(color_format); +} + + void init_log_file(const std::string& filename, custom_severity_level threshold, log_op::operation op, const std::string& id) { // add a text sink diff --git a/fairmq/logger/logger.h b/fairmq/logger/logger.h index d0ca4be3..7d0f0f4c 100644 --- a/fairmq/logger/logger.h +++ b/fairmq/logger/logger.h @@ -88,7 +88,9 @@ namespace log_op // declaration of the init function for the global logger -void init_log_console(); + +void init_log_console(bool color_format=true); +void reinit_logger(bool color_format); void init_log_file( const std::string& filename, custom_severity_level threshold=SEVERITY_THRESHOLD, log_op::operation=log_op::GREATER_EQ_THAN, diff --git a/fairmq/logger/logger_def.h b/fairmq/logger/logger_def.h index 16b201c0..c0fb3d69 100644 --- a/fairmq/logger/logger_def.h +++ b/fairmq/logger/logger_def.h @@ -87,6 +87,7 @@ inline std::string write_in(const std::string& text_in_bold) // typedef typedef fairmq::severity_level custom_severity_level; #define SEVERITY_THRESHOLD custom_severity_level::TRACE +#define SEVERITY_ERROR custom_severity_level::ERROR // tags used for log console or file formatting struct tag_console; diff --git a/fairmq/logger/logger_oldboost_version.cxx b/fairmq/logger/logger_oldboost_version.cxx deleted file mode 100644 index d50777a6..00000000 --- a/fairmq/logger/logger_oldboost_version.cxx +++ /dev/null @@ -1,235 +0,0 @@ - - -// fix backward compability issue with boost<1.56 - -/******************************************************************************** - * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * - * * - * This software is distributed under the terms of the * - * GNU Lesser General Public Licence version 3 (LGPL) version 3, * - * copied verbatim in the file "LICENSE" * - ********************************************************************************/ -#include "logger_oldboost_version.h" -#include "fairroot_null_deleter.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - - -namespace logging = boost::log; -namespace src = boost::log::sources; -namespace expr = boost::log::expressions; -namespace sinks = boost::log::sinks; -namespace attrs = boost::log::attributes; - - - -BOOST_LOG_GLOBAL_LOGGER_INIT(global_logger, src::severity_logger_mt) -{ - src::severity_logger_mt global_logger; - global_logger.add_attribute("TimeStamp", attrs::local_clock()); - init_log_console(); - return global_logger; -} - -void init_log_console() -{ - // add a text sink - typedef sinks::synchronous_sink text_sink; - boost::shared_ptr sink = boost::make_shared(); - // add "console" output stream to our sink - sink->locked_backend()->add_stream(boost::shared_ptr(&std::clog, fairroot::null_deleter())); - - // specify the format of the log message - sink->set_formatter(&init_log_formatter); - // add sink to the core - logging::core::get()->add_sink(sink); -} - -void init_log_file(const std::string& filename, custom_severity_level threshold, log_op::operation op, const std::string& id) -{ - // add a text sink - std::string formatted_filename(filename); - formatted_filename+=id; - formatted_filename+="_%Y-%m-%d_%H-%M-%S.%N.log"; - boost::shared_ptr< sinks::text_file_backend > backend = - boost::make_shared< sinks::text_file_backend > - ( - boost::log::keywords::file_name = formatted_filename, - boost::log::keywords::rotation_size = 10 * 1024 * 1024, - // rotate at midnight every day - boost::log::keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0), - // log collector, - // -- maximum total size of the stored log files is 1GB. - // -- minimum free space on the drive is 2GB - boost::log::keywords::max_size = 1000 * 1024 * 1024, - boost::log::keywords::min_free_space = 2000 * 1024 * 1024, - boost::log::keywords::auto_flush = true - //keywords::time_based_rotation = &is_it_time_to_rotate - ); - typedef sinks::synchronous_sink< sinks::text_file_backend > sink_t; - boost::shared_ptr< sink_t > sink(new sink_t(backend)); - - // specify the format of the log message - sink->set_formatter(&init_log_formatter); - - switch (op) - { - case log_op::operation::EQUAL : - sink->set_filter(severity == threshold); - break; - - case log_op::operation::GREATER_THAN : - sink->set_filter(severity > threshold); - break; - - case log_op::operation::GREATER_EQ_THAN : - sink->set_filter(severity >= threshold); - break; - - case log_op::operation::LESS_THAN : - sink->set_filter(severity < threshold); - break; - - case log_op::operation::LESS_EQ_THAN : - sink->set_filter(severity <= threshold); - break; - - default: - break; - } - logging::core::get()->add_sink(sink); -} - -// temporary : to be replaced with c++11 lambda -void set_global_log_level(log_op::operation op, custom_severity_level threshold ) -{ - switch (threshold) - { - case custom_severity_level::TRACE : - set_global_log_level_operation(op,custom_severity_level::TRACE); - break; - - case custom_severity_level::DEBUG : - set_global_log_level_operation(op,custom_severity_level::DEBUG); - break; - - case custom_severity_level::RESULTS : - set_global_log_level_operation(op,custom_severity_level::RESULTS); - break; - - case custom_severity_level::INFO : - set_global_log_level_operation(op,custom_severity_level::INFO); - break; - - case custom_severity_level::WARN : - set_global_log_level_operation(op,custom_severity_level::WARN); - break; - - case custom_severity_level::STATE : - set_global_log_level_operation(op,custom_severity_level::STATE); - break; - - case custom_severity_level::ERROR : - set_global_log_level_operation(op,custom_severity_level::ERROR); - break; - - case custom_severity_level::NOLOG : - set_global_log_level_operation(op,custom_severity_level::NOLOG); - break; - - default: - break; - } -} - -void set_global_log_level_operation(log_op::operation op, custom_severity_level threshold ) -{ - switch (op) - { - case log_op::operation::EQUAL : - boost::log::core::get()->set_filter(severity == threshold); - break; - - case log_op::operation::GREATER_THAN : - boost::log::core::get()->set_filter(severity > threshold); - break; - - case log_op::operation::GREATER_EQ_THAN : - boost::log::core::get()->set_filter(severity >= threshold); - break; - - case log_op::operation::LESS_THAN : - boost::log::core::get()->set_filter(severity < threshold); - break; - - case log_op::operation::LESS_EQ_THAN : - boost::log::core::get()->set_filter(severity <= threshold); - break; - - default: - break; - } -} - -void init_new_file(const std::string& filename, custom_severity_level threshold, log_op::operation op) -{ - // add a file text sink with filters but without any formatting - std::string formatted_filename(filename); - formatted_filename+=".%N.txt"; - boost::shared_ptr< sinks::text_file_backend > backend = - boost::make_shared< sinks::text_file_backend > - ( - boost::log::keywords::file_name = formatted_filename, - boost::log::keywords::rotation_size = 10 * 1024 * 1024, - // rotate at midnight every day - boost::log::keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0), - // log collector, - // -- maximum total size of the stored log files is 1GB. - // -- minimum free space on the drive is 2GB - boost::log::keywords::max_size = 1000 * 1024 * 1024, - boost::log::keywords::min_free_space = 2000 * 1024 * 1024, - boost::log::keywords::auto_flush = true - //keywords::time_based_rotation = &is_it_time_to_rotate - ); - typedef sinks::synchronous_sink< sinks::text_file_backend > sink_t; - boost::shared_ptr< sink_t > sink(new sink_t(backend)); - - //sink->set_formatter(&init_file_formatter); - - switch (op) - { - case log_op::operation::EQUAL : - sink->set_filter(severity == threshold); - break; - - case log_op::operation::GREATER_THAN : - sink->set_filter(severity > threshold); - break; - - case log_op::operation::GREATER_EQ_THAN : - sink->set_filter(severity >= threshold); - break; - - case log_op::operation::LESS_THAN : - sink->set_filter(severity < threshold); - break; - - case log_op::operation::LESS_EQ_THAN : - sink->set_filter(severity <= threshold); - break; - - default: - break; - } - logging::core::get()->add_sink(sink); -} - diff --git a/fairmq/logger/logger_oldboost_version.h b/fairmq/logger/logger_oldboost_version.h deleted file mode 100644 index bfb137e2..00000000 --- a/fairmq/logger/logger_oldboost_version.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * File: logger_oldboost_version.h - * Author: winckler - * - * Created on September 24, 2015, 10:56 AM - */ - -#ifndef LOGGER_OLDBOOST_VERSION_H -#define LOGGER_OLDBOOST_VERSION_H - -#define BOOST_LOG_DYN_LINK 1 // necessary when linking the boost_log library dynamically - -// std -#include -#include -#include - - -#include -#include - - - - -// WARNING : pragma commands to hide boost Wshadow warning -#if defined(__clang__) - _Pragma("clang diagnostic push") - _Pragma("clang diagnostic ignored \"-Wshadow\"") -// boost -#include -#include -#include -#include -#include -#include -#include -#include -#include -// fairmq -#include "logger_def.h" - _Pragma("clang diagnostic pop") -#elif defined(__GNUC__) || defined(__GNUG__) - _Pragma("GCC diagnostic push") - _Pragma("GCC diagnostic ignored \"-Wshadow\"") -// boost -#include -#include -#include -#include -#include -#include -#include -#include -#include -// fairmq -#include "logger_def.h" - _Pragma("GCC diagnostic pop") -#endif - - - - -// Note : the following types and values must be defined in the included logger_def.h : -// 1- custom_severity_level -// 2- SEVERITY_THRESHOLD -// 3- tag_console -// 4- tag_file - -// Note : operation enum temporary : (until we replace it with c++11 lambda expression) -namespace log_op -{ - enum operation - { - EQUAL, - GREATER_THAN, - GREATER_EQ_THAN, - LESS_THAN, - LESS_EQ_THAN - }; -} - - -// declaration of the init function for the global logger -void init_log_console(); -void init_log_file( const std::string& filename, - custom_severity_level threshold=SEVERITY_THRESHOLD, - log_op::operation=log_op::GREATER_EQ_THAN, - const std::string& id="" - ); - -void init_new_file( const std::string& filename, - custom_severity_level threshold, - log_op::operation op - ); - -void set_global_log_level( log_op::operation op=log_op::GREATER_EQ_THAN, - custom_severity_level threshold=SEVERITY_THRESHOLD ); -void set_global_log_level_operation( log_op::operation op=log_op::GREATER_EQ_THAN, - custom_severity_level threshold=SEVERITY_THRESHOLD ); -// register a global logger (declaration) -BOOST_LOG_GLOBAL_LOGGER(global_logger, boost::log::sources::severity_logger_mt) - -BOOST_LOG_ATTRIBUTE_KEYWORD(fairmq_logger_timestamp, "TimeStamp", boost::posix_time::ptime) -BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", custom_severity_level) - - -template -void init_log_formatter(const boost::log::record_view &view, boost::log::formatting_ostream &os) -{ - os << "[" ; - - if(std::is_same::value) - os<<"\033[01;36m"; - - auto date_time_formatter = - boost::log::expressions::stream - << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%H:%M:%S"); - date_time_formatter(view, os); - - if(std::is_same::value) - os<<"\033[0m"; - - os << "]" - << "[" - << view.attribute_values()["Severity"].extract() - << "] " - //<< " - " - << view.attribute_values()["Message"].extract(); -} - - - -// helper macros - -// global macros (core). Level filters are set globally here, that is to all register sinks -#define LOG(severity) BOOST_LOG_SEV(global_logger::get(),custom_severity_level::severity) -#define MQLOG(severity) BOOST_LOG_SEV(global_logger::get(),custom_severity_level::severity) -#define SET_LOG_LEVEL(loglevel) boost::log::core::get()->set_filter(severity >= custom_severity_level::loglevel); -#define SET_LOG_FILTER(op,loglevel) set_global_log_level(log_op::op,custom_severity_level::loglevel) - -// local init macros (sinks) -// Notes : when applying a filter to the sink, and then to the core, the resulting filter will -// be the intersection of the two sets defined by the two filters, i.e., core and sinks -// filename : path to file name without extension -#define INIT_LOG_FILE(filename) init_log_file(filename); -#define INIT_LOG_FILE_LVL(filename,loglevel) init_log_file(filename,custom_severity_level::loglevel); -#define INIT_LOG_FILE_FILTER(filename,op,loglevel) init_log_file(filename,custom_severity_level::loglevel,log_op::op); -//INIT_LOG_FILE_FILTER_MP : add id to log filename for multiprocess -#define INIT_LOG_FILE_FILTER_MP(filename,op,loglevel,id) init_log_file(filename,custom_severity_level::loglevel,log_op::GREATER_EQ_THAN,id); - -// create new file without formatting -#define INIT_NEW_FILE(filename,op,loglevel) init_new_file(filename,custom_severity_level::loglevel,log_op::op); - - - -#endif /* LOGGER_OLDBOOST_VERSION_H */ - diff --git a/fairmq/logger/run/testLogger.cxx b/fairmq/logger/run/testLogger.cxx index ba3f187d..e84428c1 100644 --- a/fairmq/logger/run/testLogger.cxx +++ b/fairmq/logger/run/testLogger.cxx @@ -72,7 +72,8 @@ int main() test_set_level(); INIT_LOG_FILE_FILTER("test_another_log_file",EQUAL,INFO);// init and add another sink to the core test_set_level(); - + reinit_logger(false); + test_set_level(); return 0; } diff --git a/fairmq/options/FairMQProgOptions.cxx b/fairmq/options/FairMQProgOptions.cxx index 99583658..58b0f932 100644 --- a/fairmq/options/FairMQProgOptions.cxx +++ b/fairmq/options/FairMQProgOptions.cxx @@ -68,8 +68,8 @@ int FairMQProgOptions::ParseAll(const int argc, char** argv, bool allowUnregiste } else { - LOG(ERROR)<<" verbosity level '"<(&fVerboseLvl)->default_value("INFO"), "Verbosity level : \n" + ("verbose", po::value(&fVerboseLvl)->default_value("DEBUG"), "Verbosity level : \n" " TRACE \n" " DEBUG \n" " RESULTS \n"