X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/01d2ec474c4c1828c229830ba4e4961de5f0527d..2d1f6b9a46d52289c1b52de4f0a7698f0085711a:/src/xbt/log.cpp diff --git a/src/xbt/log.cpp b/src/xbt/log.cpp index 7b1a327bc4..8113f3691d 100644 --- a/src/xbt/log.cpp +++ b/src/xbt/log.cpp @@ -1,17 +1,19 @@ /* log - a generic logging facility in the spirit of log4j */ -/* Copyright (c) 2004-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "src/xbt_modinter.h" #include "src/xbt/log_private.hpp" +#include "src/xbt_modinter.h" #include "xbt/asserts.h" #include "xbt/dynar.h" #include "xbt/str.h" +#include "xbt/string.hpp" #include +#include #include #include #include @@ -35,18 +37,15 @@ struct xbt_log_setting_t { xbt_log_appender_t appender = nullptr; }; -static std::vector xbt_log_settings; - -const char *xbt_log_priority_names[8] = { - "NONE", - "TRACE", - "DEBUG", - "VERBOSE", - "INFO", - "WARNING", - "ERROR", - "CRITICAL" -}; +// This function is here to avoid static initialization order fiasco +static auto& xbt_log_settings() +{ + static std::vector value; + return value; +} + +constexpr std::array xbt_log_priority_names{ + {"NONE", "TRACE", "DEBUG", "VERBOSE", "INFO", "WARNING", "ERROR", "CRITICAL"}}; s_xbt_log_category_t _XBT_LOGV(XBT_LOG_ROOT_CAT) = { nullptr /*parent */, @@ -68,15 +67,15 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(log, xbt, "Loggings from the logging mechanism i which were already created (damnit. Too slow little beetle) */ void xbt_log_preinit(void) { - xbt_log_default_appender = xbt_log_appender_file_new(nullptr); + xbt_log_default_appender = xbt_log_appender_stream(stderr); xbt_log_default_layout = xbt_log_layout_simple_new(nullptr); _XBT_LOGV(XBT_LOG_ROOT_CAT).appender = xbt_log_default_appender; _XBT_LOGV(XBT_LOG_ROOT_CAT).layout = xbt_log_default_layout; log_cat_init_mutex = new std::recursive_mutex(); } -static void xbt_log_help(void); -static void xbt_log_help_categories(void); +static void xbt_log_help(); +static void xbt_log_help_categories(); /** @brief Get all logging settings from the command line * @@ -88,7 +87,7 @@ void xbt_log_init(int *argc, char **argv) int j = 1; int parse_args = 1; // Stop parsing the parameters once we found '--' - xbt_log_control_set("xbt_help.threshold:VERBOSE xbt_help.fmt:%m%n"); + xbt_log_control_set("xbt_help.app:stdout xbt_help.threshold:VERBOSE xbt_help.fmt:%m%n"); /* Set logs and init log submodule */ for (int i = 1; i < *argc; i++) { @@ -122,10 +121,8 @@ void xbt_log_init(int *argc, char **argv) } } -static void log_cat_exit(xbt_log_category_t cat) +static void log_cat_exit(const s_xbt_log_category_t* cat) { - xbt_log_category_t child; - if (cat->appender) { if (cat->appender->free_) cat->appender->free_(cat->appender); @@ -137,7 +134,7 @@ static void log_cat_exit(xbt_log_category_t cat) xbt_free(cat->layout); } - for (child = cat->firstChild; child != nullptr; child = child->nextSibling) + for (auto const* child = cat->firstChild; child != nullptr; child = child->nextSibling) log_cat_exit(child); } @@ -156,34 +153,34 @@ static constexpr size_t XBT_LOG_DYNAMIC_BUFFER_SIZE = 4096; void _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...) { - xbt_log_category_t cat = ev->cat; + const xbt_log_category_s* cat = ev->cat; xbt_assert(ev->priority >= 0, "Negative logging priority naturally forbidden"); - xbt_assert(static_cast(ev->priority) < sizeof(xbt_log_priority_names)/sizeof(xbt_log_priority_names[0]), + xbt_assert(static_cast(ev->priority) < xbt_log_priority_names.size(), "Priority %d is greater than the biggest allowed value", ev->priority); - while (1) { - xbt_log_appender_t appender = cat->appender; + while (true) { + const s_xbt_log_appender_t* appender = cat->appender; if (appender != nullptr) { xbt_assert(cat->layout, "No valid layout for the appender of category %s", cat->name); /* First, try with a static buffer */ - int done = 0; - char buff[XBT_LOG_STATIC_BUFFER_SIZE]; - ev->buffer = buff; - ev->buffer_size = sizeof buff; + bool done = false; + std::array buff; + ev->buffer = buff.data(); + ev->buffer_size = buff.size(); va_start(ev->ap, fmt); done = cat->layout->do_layout(cat->layout, ev, fmt); va_end(ev->ap); + ev->buffer = nullptr; // Calm down, static analyzers, this pointer to local array won't leak out of the scope. if (done) { - appender->do_append(appender, buff); + appender->do_append(appender, buff.data()); } else { - /* The static buffer was too small, use a dynamically expanded one */ ev->buffer_size = XBT_LOG_DYNAMIC_BUFFER_SIZE; ev->buffer = static_cast(xbt_malloc(ev->buffer_size)); - while (1) { + while (true) { va_start(ev->ap, fmt); done = cat->layout->do_layout(cat->layout, ev, fmt); va_end(ev->ap); @@ -282,7 +279,7 @@ int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority if (XBT_LOG_ISENABLED(log, xbt_log_priority_debug)) { std::string res; - xbt_log_category_t cpp = category->parent->firstChild; + const xbt_log_category_s* cpp = category->parent->firstChild; while (cpp) { res += std::string(" ") + cpp->name; cpp = cpp->nextSibling; @@ -294,11 +291,11 @@ int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority } /* Apply the control */ - auto iset = std::find_if(begin(xbt_log_settings), end(xbt_log_settings), + auto iset = std::find_if(begin(xbt_log_settings()), end(xbt_log_settings()), [category](const xbt_log_setting_t& s) { return s.catname == category->name; }); - if (iset != xbt_log_settings.end()) { + if (iset != xbt_log_settings().end()) { _xbt_log_cat_apply_set(category, *iset); - xbt_log_settings.erase(iset); + xbt_log_settings().erase(iset); } else { XBT_DEBUG("Category '%s': inherited threshold = %s (=%d)", category->name, xbt_log_priority_names[category->threshold], category->threshold); @@ -340,7 +337,7 @@ void xbt_log_parent_set(xbt_log_category_t cat, xbt_log_category_t parent) cat->isThreshInherited = 1; } -static void _set_inherited_thresholds(xbt_log_category_t cat) +static void _set_inherited_thresholds(const s_xbt_log_category_t* cat) { xbt_log_category_t child = cat->firstChild; @@ -405,15 +402,11 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string) }else if (i < xbt_log_priority_infinite) { set.thresh = (e_xbt_log_priority_t)i; } else { - THROWF(arg_error, 0, - "Unknown priority name: %s (must be one of: trace,debug,verbose,info,warning,error,critical)", value); + throw std::invalid_argument(simgrid::xbt::string_printf( + "Unknown priority name: %s (must be one of: trace,debug,verbose,info,warning,error,critical)", value)); } } else if (strncmp(option, "additivity", option_len) == 0) { - if (strcasecmp(value, "ON") == 0 || strcasecmp(value, "YES") == 0 || strcmp(value, "1") == 0) { - set.additivity = 1; - } else { - set.additivity = 0; - } + set.additivity = (strcasecmp(value, "ON") == 0 || strcasecmp(value, "YES") == 0 || strcmp(value, "1") == 0); } else if (strncmp(option, "appender", option_len) == 0) { if (strncmp(value, "file:", 5) == 0) { set.appender = xbt_log_appender_file_new(value + 5); @@ -421,8 +414,12 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string) set.appender = xbt_log_appender2_file_new(value + 9, 1); } else if (strncmp(value, "splitfile:", 10) == 0) { set.appender = xbt_log_appender2_file_new(value + 10, 0); + } else if (strcmp(value, "stderr") == 0) { + set.appender = xbt_log_appender_stream(stderr); + } else if (strcmp(value, "stdout") == 0) { + set.appender = xbt_log_appender_stream(stdout); } else { - THROWF(arg_error, 0, "Unknown appender log type: '%s'", value); + throw std::invalid_argument(simgrid::xbt::string_printf("Unknown appender log type: '%s'", value)); } } else if (strncmp(option, "fmt", option_len) == 0) { set.fmt = std::string(value); @@ -438,18 +435,15 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string) static xbt_log_category_t _xbt_log_cat_searchsub(xbt_log_category_t cat, const char* name) { - xbt_log_category_t child; - xbt_log_category_t res; - XBT_DEBUG("Search '%s' into '%s' (firstChild='%s'; nextSibling='%s')", name, cat->name, (cat->firstChild ? cat->firstChild->name : "none"), (cat->nextSibling ? cat->nextSibling->name : "none")); if (strcmp(cat->name, name) == 0) return cat; - for (child = cat->firstChild; child != nullptr; child = child->nextSibling) { + for (xbt_log_category_t child = cat->firstChild; child != nullptr; child = child->nextSibling) { XBT_DEBUG("Dig into %s", child->name); - res = _xbt_log_cat_searchsub(child, name); + xbt_log_category_t res = _xbt_log_cat_searchsub(child, name); if (res) return res; } @@ -511,7 +505,7 @@ void xbt_log_control_set(const char *control_string) } else { XBT_DEBUG("Store for further application"); XBT_DEBUG("push %p to the settings", &set); - xbt_log_settings.emplace_back(std::move(set)); + xbt_log_settings().emplace_back(std::move(set)); } } xbt_dynar_free(&set_strings); @@ -549,7 +543,7 @@ void xbt_log_additivity_set(xbt_log_category_t cat, int additivity) cat->additivity = additivity; } -static void xbt_log_help(void) +static void xbt_log_help() { XBT_HELP( "Description of the logging output:\n" @@ -578,7 +572,7 @@ static void xbt_log_help(void) " -> %%p: Priority name (LOG4J compatible)\n" "\n" " -> %%h: Hostname (SimGrid extension)\n" - " -> %%P: Process name (SimGrid extension)\n" + " -> %%a: Actor name (SimGrid extension)\n" " -> %%t: Thread \"name\" (LOG4J compatible -- actually the address of the thread in memory)\n" " -> %%i: Process PID (SimGrid extension -- this is a 'i' as in 'i'dea)\n" "\n" @@ -598,6 +592,17 @@ static void xbt_log_help(void) " -> %%d: date (UNIX-like epoch)\n" " -> %%r: application age (time elapsed since the beginning of the application)\n" "\n" + " Category appender: --log=CATEGORY_NAME.app:APPENDER\n" + " APPENDER may be:\n" + " -> stdout or stderr: standard output streams\n" + " -> file:NAME: append to file with given name\n" + " -> splitfile:SIZE:NAME: append to files with maximum size SIZE per file.\n" + " NAME may contain the %% wildcard as a placeholder for the file number.\n" + " -> rollfile:SIZE:NAME: append to file with maximum size SIZE.\n" + "\n" + " Category additivity: --log=CATEGORY_NAME.add:VALUE\n" + " VALUE: '0', '1', 'no', 'yes', 'on', or 'off'\n" + "\n" " Miscellaneous:\n" " --help-log-categories Display the current hierarchy of log categories.\n" " --log=no_loc Don't print file names in messages (for tesh tests).\n"); @@ -620,7 +625,7 @@ static void xbt_log_help_categories_rec(xbt_log_category_t category, const std:: cats.push_back(cat); std::sort(begin(cats), end(cats), - [](xbt_log_category_t a, xbt_log_category_t b) { return strcmp(a->name, b->name) < 0; }); + [](const s_xbt_log_category_t* a, const s_xbt_log_category_t* b) { return strcmp(a->name, b->name) < 0; }); for (auto const& cat : cats) { XBT_HELP("%s%s: %s", this_prefix.c_str(), cat->name, cat->description); @@ -630,7 +635,7 @@ static void xbt_log_help_categories_rec(xbt_log_category_t category, const std:: } } -static void xbt_log_help_categories(void) +static void xbt_log_help_categories() { XBT_HELP("Current log category hierarchy:"); xbt_log_help_categories_rec(&_XBT_LOGV(XBT_LOG_ROOT_CAT), " ");