Determine log level dynamically
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
The log level can now be set by environment variable `XWIM_LOGLEVEL`. Alternatively a default log level per build type (determined by NDEBUG flag) is used.
This commit is contained in:
parent
c842c02c6f
commit
53a15e5a7f
4 changed files with 83 additions and 9 deletions
|
@ -116,7 +116,7 @@ likely move to GitHub as it's main repository.
|
||||||
|
|
||||||
If you want to contribute, you can either issue a pull request on it's Github
|
If you want to contribute, you can either issue a pull request on it's Github
|
||||||
mirror (will be cherry picked into the main repository) or send patches to
|
mirror (will be cherry picked into the main repository) or send patches to
|
||||||
`dev [at] friedl [dot] net`.
|
dev[at]friedl[dot]net.
|
||||||
|
|
||||||
If you are interested in a long-term co-maintainership you can also drop me a
|
If you are interested in a long-term co-maintainership you can also drop me a
|
||||||
mail for an account on https://git.friedl.net.
|
mail for an account on https://git.friedl.net.
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include <spdlog/common.h>
|
#include <spdlog/common.h>
|
||||||
#include <spdlog/spdlog.h>
|
|
||||||
namespace logger = spdlog;
|
namespace logger = spdlog;
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
@ -7,12 +6,13 @@ namespace logger = spdlog;
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
#include "util/log.hpp"
|
||||||
#include "archive.hpp"
|
#include "archive.hpp"
|
||||||
#include "spec.hpp"
|
#include "spec.hpp"
|
||||||
#include "fileformats.hpp"
|
#include "fileformats.hpp"
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
logger::set_level(logger::level::trace);
|
xwim::log::init();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
std::filesystem::path filepath{argv[1]};
|
std::filesystem::path filepath{argv[1]};
|
||||||
|
|
|
@ -2,13 +2,8 @@ xwim_src = ['main.cpp',
|
||||||
'archive.cpp',
|
'archive.cpp',
|
||||||
'archive_sys.cpp']
|
'archive_sys.cpp']
|
||||||
|
|
||||||
xwim_inc = ['archive.hpp',
|
|
||||||
'spec.hpp',
|
|
||||||
'archive_sys.hpp',
|
|
||||||
'fileformats.hpp']
|
|
||||||
|
|
||||||
xwim_libs = [dependency('libarchive', required: true),
|
xwim_libs = [dependency('libarchive', required: true),
|
||||||
dependency('fmt', required: true),
|
dependency('fmt', required: true),
|
||||||
dependency('spdlog', required: true)]
|
dependency('spdlog', required: true)]
|
||||||
|
|
||||||
executable('xwim', xwim_src, xwim_inc, dependencies: xwim_libs)
|
executable('xwim', xwim_src, dependencies: xwim_libs)
|
||||||
|
|
79
src/util/log.hpp
Normal file
79
src/util/log.hpp
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <spdlog/common.h>
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
#ifdef NDEBUG
|
||||||
|
#define XWIM_LOGLEVEL SPDLOG_LEVEL_ERROR
|
||||||
|
#else
|
||||||
|
#define XWIM_LOGLEVEL SPDLOG_LEVEL_DEBUG
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace xwim {
|
||||||
|
namespace log {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get log level from XWIM_LOGLEVEL environment variable.
|
||||||
|
* For valid values see SPDLOG_LEVEL_NAMES in spdlog/common.h
|
||||||
|
*
|
||||||
|
* @returns spdlog::level::level_enum::off if no valid XWIM_LOGLEVEL defined
|
||||||
|
*/
|
||||||
|
spdlog::level::level_enum _init_from_env() {
|
||||||
|
char* env_lvl = std::getenv("XWIM_LOGLEVEL");
|
||||||
|
if (!env_lvl) {
|
||||||
|
return spdlog::level::level_enum::off;
|
||||||
|
}
|
||||||
|
|
||||||
|
spdlog::level::level_enum lvl = spdlog::level::from_str(env_lvl);
|
||||||
|
|
||||||
|
//`::from_str` returns `off` if no match found
|
||||||
|
if (spdlog::level::level_enum::off == lvl) {
|
||||||
|
spdlog::debug("No environment definition for log level"); // uses default
|
||||||
|
// logger/level
|
||||||
|
}
|
||||||
|
|
||||||
|
return lvl;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get log level from compile time definition.
|
||||||
|
*
|
||||||
|
* @return spdlog::level::level_enum::error for release builds (-DNDEBUG)
|
||||||
|
* spdlog::level::level_enum::debug for debug builds
|
||||||
|
*/
|
||||||
|
spdlog::level::level_enum _init_from_compile() {
|
||||||
|
return static_cast<spdlog::level::level_enum>(XWIM_LOGLEVEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine the log level from various sources at runtime.
|
||||||
|
*
|
||||||
|
* The log level is determined from sources in the following order (first
|
||||||
|
* wins):
|
||||||
|
* 1. The `level` argument
|
||||||
|
* 2. The XWIM_LOGLEVEL environment variable
|
||||||
|
* 3. The default for the build type (-DNDEBUG)
|
||||||
|
* -> ERROR for release builds
|
||||||
|
* -> DEBUG for debug builds
|
||||||
|
*
|
||||||
|
* The determined level is then set for the default logger via
|
||||||
|
* `spdlog::set_level`.
|
||||||
|
*/
|
||||||
|
void init(spdlog::level::level_enum level = spdlog::level::level_enum::off) {
|
||||||
|
if (spdlog::level::level_enum::off != level) {
|
||||||
|
spdlog::set_level(level);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
level = _init_from_env();
|
||||||
|
if (spdlog::level::level_enum::off != level) {
|
||||||
|
spdlog::set_level(level);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return spdlog::set_level(_init_from_compile());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace log
|
||||||
|
} // namespace xwim
|
Loading…
Reference in a new issue