1
0
Fork 0
mirror of https://github.com/polybar/polybar.git synced 2024-11-25 13:55:47 -05:00
polybar/include/components/logger.hpp

150 lines
3 KiB
C++
Raw Normal View History

2016-06-14 23:32:35 -04:00
#pragma once
#include <cstdio>
#include <map>
#include <string>
2016-12-22 23:18:58 -05:00
#include <thread>
2016-06-14 23:32:35 -04:00
#include "common.hpp"
#include "settings.hpp"
2016-06-14 23:32:35 -04:00
2017-01-10 23:10:51 -05:00
#ifndef STDOUT_FILENO
#define STDOUT_FILENO 1
#endif
#ifndef STDERR_FILENO
#define STDERR_FILENO 2
#endif
2016-11-19 00:22:44 -05:00
POLYBAR_NS
2016-06-14 23:32:35 -04:00
2017-01-19 05:11:28 -05:00
enum class loglevel {
2016-06-14 23:32:35 -04:00
NONE = 0,
ERROR,
WARNING,
INFO,
TRACE,
};
class logger {
public:
2016-12-09 03:40:46 -05:00
using make_type = const logger&;
static make_type make(loglevel level = loglevel::NONE);
2016-12-09 03:02:47 -05:00
2016-11-02 15:22:45 -04:00
explicit logger(loglevel level);
2016-06-14 23:32:35 -04:00
2016-12-09 06:22:58 -05:00
static loglevel parse_verbosity(const string& name, loglevel fallback = loglevel::NONE);
void verbosity(loglevel&& level);
2016-06-14 23:32:35 -04:00
#ifdef DEBUG_LOGGER // {{{
2016-06-14 23:32:35 -04:00
template <typename... Args>
void trace(string message, Args... args) const {
2016-06-14 23:32:35 -04:00
output(loglevel::TRACE, message, args...);
}
2017-01-18 23:38:42 -05:00
#ifdef DEBUG_LOGGER_VERBOSE
template <typename... Args>
void trace_x(string message, Args... args) const {
output(loglevel::TRACE, message, args...);
}
#else
template <typename... Args>
void trace_x(Args...) const {}
#endif
#else
template <typename... Args>
void trace(Args...) const {}
template <typename... Args>
void trace_x(Args...) const {}
#endif // }}}
2016-06-14 23:32:35 -04:00
/**
* Output an info message
*/
template <typename... Args>
void info(string message, Args... args) const {
output(loglevel::INFO, message, args...);
}
/**
* Output a warning message
*/
template <typename... Args>
void warn(string message, Args... args) const {
output(loglevel::WARNING, message, args...);
}
/**
* Output an error message
*/
template <typename... Args>
void err(string message, Args... args) const {
output(loglevel::ERROR, message, args...);
}
protected:
template <typename T>
decltype(auto) convert(T&& arg) const {
return forward<T>(arg);
}
2016-06-14 23:32:35 -04:00
/**
2016-12-22 23:18:58 -05:00
* Convert string
2016-06-14 23:32:35 -04:00
*/
2016-12-23 09:54:06 -05:00
const char* convert(string arg) const; // NOLINT
2016-12-22 23:18:58 -05:00
/**
* Convert thread id
*/
size_t convert(const std::thread::id arg) const;
2016-06-14 23:32:35 -04:00
/**
* Write the log message to the output channel
* if the defined verbosity level allows it
*/
template <typename... Args>
void output(loglevel level, string format, Args... values) const {
if (level > m_level) {
2016-06-14 23:32:35 -04:00
return;
}
2016-06-14 23:32:35 -04:00
#if defined(__clang__) // {{{
2016-06-14 23:32:35 -04:00
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wformat-security"
#elif defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-security"
#endif // }}}
dprintf(m_fd, (m_prefixes.at(level) + format + m_suffixes.at(level) + "\n").c_str(), convert(values)...);
#if defined(__clang__) // {{{
2016-06-14 23:32:35 -04:00
#pragma clang diagnostic pop
#elif defined(__GNUC__)
#pragma GCC diagnostic pop
#endif // }}}
2016-06-14 23:32:35 -04:00
}
private:
/**
* Logger verbosity level
*/
loglevel m_level{loglevel::TRACE};
2016-06-14 23:32:35 -04:00
/**
* File descriptor used when writing the log messages
*/
int m_fd{STDERR_FILENO};
2016-06-14 23:32:35 -04:00
/**
* Loglevel specific prefixes
*/
std::map<loglevel, string> m_prefixes;
2016-06-14 23:32:35 -04:00
/**
* Loglevel specific suffixes
*/
std::map<loglevel, string> m_suffixes;
2016-06-14 23:32:35 -04:00
};
2016-11-19 00:22:44 -05:00
POLYBAR_NS_END