 |
clutchlog
0.13
|
Go to the documentation of this file.
9 #include <experimental/filesystem>
10 namespace fs = std::experimental::filesystem;
13 namespace fs = std::filesystem;
27 #if __has_include(<execinfo.h>) && __has_include(<stdlib.h>) && __has_include(<libgen.h>)
31 #define CLUTCHLOG_HAVE_UNIX_SYSINFO 1
33 #define CLUTCHLOG_HAVE_UNIX_SYSINFO 0
37 #if __has_include(<sys/ioctl.h>) && __has_include(<stdio.h>) && __has_include(<unistd.h>)
38 #include <sys/ioctl.h>
41 #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 1
43 #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 0
50 #ifndef WITH_CLUTCHLOG
52 #define WITH_CLUTCHLOG
65 #ifndef CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG
66 #define CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG clutchlog::level::progress
68 #endif // CLUTCHLOG_DEFAULT_DEPTH_BUILT
76 #define CLUTCHLOC __FILE__, __FUNCTION__, __LINE__
81 #define CLUTCHLOG( LEVEL, WHAT ) do { \
82 auto& clutchlog__logger = clutchlog::logger(); \
83 std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
84 clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC); \
86 #else // not Debug build.
87 #define CLUTCHLOG( LEVEL, WHAT ) do { \
88 if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
89 auto& clutchlog__logger = clutchlog::logger(); \
90 std::ostringstream clutchlog__msg ; clutchlog__msg << WHAT; \
91 clutchlog__logger.log(clutchlog::level::LEVEL, clutchlog__msg.str(), CLUTCHLOC); \
98 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
99 auto& clutchlog__logger = clutchlog::logger(); \
100 clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
101 CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
103 #else // not Debug build.
104 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do { \
105 if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
106 auto& clutchlog__logger = clutchlog::logger(); \
107 clutchlog__logger.dump(clutchlog::level::LEVEL, std::begin(CONTAINER), std::end(CONTAINER), \
108 CLUTCHLOC, FILENAME, CLUTCHDUMP_DEFAULT_SEP); \
115 #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
116 auto& clutchlog__logger = clutchlog::logger(); \
117 clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
118 if(clutchlog__scope.matches) { \
122 #else // not Debug build.
123 #define CLUTCHFUNC( LEVEL, FUNC, ... ) do { \
124 if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
125 auto& clutchlog__logger = clutchlog::logger(); \
126 clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
127 if(clutchlog__scope.matches) { \
136 #define CLUTCHCODE( LEVEL, ... ) do { \
137 auto& clutchlog__logger = clutchlog::logger(); \
138 clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
139 if(clutchlog__scope.matches) { \
143 #else // not Debug build.
144 #define CLUTCHCODE( LEVEL, CODE ) do { \
145 if(clutchlog::level::LEVEL <= CLUTCHLOG_DEFAULT_DEPTH_BUILT_NODEBUG) { \
146 auto& clutchlog__logger = clutchlog::logger(); \
147 clutchlog::scope_t clutchlog__scope = clutchlog__logger.locate(clutchlog::level::LEVEL, CLUTCHLOC); \
148 if(clutchlog__scope.matches) { \
157 #else // not WITH_CLUTCHLOG
159 #define CLUTCHLOG( LEVEL, WHAT ) do {} while(0)
160 #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do {} while(0)
161 #define CLUTCHFUNC( LEVEL, FUNC, ... ) do {} while(0)
162 #define CLUTCHCODE( LEVEL, CODE ) do {} while(0)
163 #endif // WITH_CLUTCHLOG
169 #ifdef WITH_CLUTCHLOG
186 #ifndef CLUTCHLOG_DEFAULT_FORMAT
187 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 // Enables: name, depth and depth_marks
189 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1 // Enables: hfill
190 #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func} @ {file}:{line}\n"
192 #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
195 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
196 #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg} {hfill} {func} @ {file}:{line}\n"
198 #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func} @ {file}:{line}\n"
203 #ifndef CLUTCHLOG_DEFAULT_FORMAT
204 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
206 #define CLUTCHLOG_DEFAULT_FORMAT "[{name}] {level_letter}:{depth_marks} {msg} {hfill} {func}\n"
208 #define CLUTCHLOG_DEFAULT_FORMAT "{level_letter} {msg}\t\t\t\t\t{func}\n"
216 #ifndef CLUTCHDUMP_DEFAULT_FORMAT
217 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
219 #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth}) @ {file}:{line}"
221 #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func} @ {file}:{line}"
223 #endif // CLUTCHDUMP_DEFAULT_FORMAT
225 #ifndef CLUTCHDUMP_DEFAULT_FORMAT
226 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
228 #define CLUTCHDUMP_DEFAULT_FORMAT "# [{name}] {level} in {func} (at depth {depth})"
230 #define CLUTCHDUMP_DEFAULT_FORMAT "# {level} in {func}"
232 #endif // CLUTCHDUMP_DEFAULT_FORMAT
237 #ifndef CLUTCHDUMP_DEFAULT_SEP
238 #define CLUTCHDUMP_DEFAULT_SEP "\n"
240 #endif // CLUTCHDUMP_DEFAULT_SEP
244 #ifndef CLUTCHLOG_DEFAULT_DEPTH_MARK
245 #define CLUTCHLOG_DEFAULT_DEPTH_MARK ">"
247 #endif // CLUTCHLOG_DEFAULT_DEPTH_MARK
251 #ifndef CLUTCHLOG_STRIP_CALLS
252 #define CLUTCHLOG_STRIP_CALLS 5
254 #endif // CLUTCHLOG_STRIP_CALLS
258 #ifndef CLUTCHLOG_DEFAULT_HFILL_MARK
259 #define CLUTCHLOG_DEFAULT_HFILL_MARK '.'
261 #endif // CLUTCHLOG_DEFAULT_HFILL_MARK
266 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
267 #ifndef CLUTCHLOG_DEFAULT_HFILL_MAX
268 #define CLUTCHLOG_DEFAULT_HFILL_MAX 300
270 #ifndef CLUTCHLOG_DEFAULT_HFILL_MIN
271 #define CLUTCHLOG_DEFAULT_HFILL_MIN 150
303 enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
425 bright_magenta = 105,
433 friend std::ostream&
operator<<(std::ostream& os,
const std::tuple<fg,bg,typo>& fbs)
436 std::vector<short> codes; codes.reserve(3);
437 if(f != fg::none) { codes.push_back(
static_cast<short>(f));}
438 if(b != bg::none) { codes.push_back(
static_cast<short>(b));}
439 if(s != typo::none) { codes.push_back(
static_cast<short>(s));}
440 if(codes.size() == 0) {
446 for(
size_t i=1; i < codes.size(); ++i) {
447 os <<
";" << codes[i];
457 if(s != typo::none) {
458 os <<
"\033[" <<
static_cast<short>(s) <<
"m";
487 virtual bool is_set()
const = 0;
490 virtual std::ostream&
print_on( std::ostream& os)
const = 0;
496 os <<
"\033[" <<
static_cast<short>(c.
type) <<
";" <<
static_cast<short>(c.mode) <<
";";
592 :
color(
ansi::colors_16M, t),
red(r), green(g), blue(b) {}
603 assert(srgb.size() == 7);
604 if(srgb.size() != 7) {
610 if(srgb.at(0) ==
'#') {
613 std::istringstream(srgb.substr(0+i,2)) >> std::hex >>
red;
614 std::istringstream(srgb.substr(2+i,2)) >> std::hex >> green;
615 std::istringstream(srgb.substr(4+i,2)) >> std::hex >> blue;
617 assert(-1 <=
red and
red <= 255);
618 assert(-1 <= green and green <= 255);
619 assert(-1 <= blue and blue <= 255);
623 bool is_set()
const {
return red > -1 and green > -1 and blue > -1;}
628 os <<
red <<
";" << green <<
";" << blue;
718 fmt(
const short fr,
const short fg,
const short fb,
719 const short gr,
const short gg,
const short gb,
723 const short gr,
const short gg,
const short gb,
726 fmt(
const short fr,
const short fg,
const short fb,
729 fmt(
const short fr,
const short fg,
const short fb,
733 fmt(
const std::string& f,
const std::string& b,
typo s = typo::none)
735 fmt(
fg,
const std::string& b,
typo s = typo::none)
737 fmt(
const std::string& f,
bg,
typo s = typo::none)
739 fmt(
const std::string& f,
typo s = typo::none)
797 std::ostringstream os;
799 fmt reset(fmt::typo::reset);
809 std::ostringstream os;
822 void operator=(
clutchlog const&) =
delete;
829 {level::critical,
"Critical"},
830 {level::error ,
"Error"},
831 {level::warning ,
"Warning"},
832 {level::progress,
"Progress"},
833 {level::note ,
"Note"},
834 {level::info ,
"Info"},
835 {level::debug ,
"Debug"},
836 {level::xdebug ,
"XDebug"}
839 {level::critical,
"Crit"},
840 {level::error ,
"Erro"},
841 {level::warning ,
"Warn"},
842 {level::progress,
"Prog"},
843 {level::note ,
"Note"},
844 {level::info ,
"Info"},
845 {level::debug ,
"Dbug"},
846 {level::xdebug ,
"XDbg"}
849 {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
850 {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
851 {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
852 {level::progress,fmt()},
853 {level::note ,fmt()},
854 {level::info ,fmt()},
855 {level::debug ,fmt()},
856 {level::xdebug ,fmt()}
860 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
862 _hfill_fmt(fmt::fg::none),
867 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
868 _depth(std::numeric_limits<size_t>::max() -
_strip_calls),
880 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
882 ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
902 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
914 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
918 std::string _depth_mark;
929 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
931 static const size_t _max_buffer = 4096;
934 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
960 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
961 void depth(
size_t d) {_depth = d;}
964 size_t depth()
const {
return _depth;}
967 void depth_mark(
const std::string mark) {_depth_mark = mark;}
969 std::string depth_mark()
const {
return _depth_mark;}
976 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
977 void hfill_mark(
const char mark) {_hfill_char = mark;}
980 char hfill_mark()
const {
return _hfill_char;}
982 void hfill_style(fmt
style) {_hfill_fmt =
style;}
987 template<
class ... FMT>
988 void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
990 fmt hfill_style()
const {
return _hfill_fmt;}
992 void hfill_max(
const size_t nmax) {_hfill_max = nmax;}
994 size_t hfill_max() {
return _hfill_max;}
996 void hfill_min(
const size_t nmin) {_hfill_min = nmin;}
998 size_t hfill_min() {
return _hfill_min;}
1018 return ilevel->second;
1020 throw std::out_of_range(
"'" + name +
"' is not a valid log level name");
1033 const std::string& in_file,
1034 const std::string& in_function=
".*",
1035 const std::string& in_line=
".*"
1047 template<
class ... FMT>
1067 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
1088 const std::string&
file,
1089 const std::string&
func,
1097 scope.stage = stage;
1098 if(not (scope.stage <=
_stage)) {
1103 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
1107 void *buffer[_max_buffer];
1108 stack_depth = backtrace(buffer, _max_buffer);
1109 scope.depth = stack_depth;
1118 std::ostringstream sline; sline <<
line;
1122 and std::regex_search(sline.str(),
_in_line);
1125 scope.matches = scope.there;
1138 const std::string& form,
1139 const std::string& mark,
1140 const std::string& tag
1197 const std::regex re(mark);
1198 return std::regex_replace(form, re, tag);
1203 const std::string& form,
1204 const std::string& mark,
1208 std::ostringstream stag; stag << tag;
1209 return replace(form, mark, stag.str());
1215 const std::string& what,
1217 const std::string& name,
1220 const std::string&
file,
1221 const std::string&
func,
1229 row =
replace(row,
"\\{msg\\}", what);
1235 std::string letter(1,
_level_word.at(stage).at(0));
1236 row =
replace(row,
"\\{level_letter\\}", letter);
1240 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
1241 row =
replace(row,
"\\{name\\}", name);
1244 std::ostringstream chevrons;
1246 chevrons << _depth_mark;
1248 row =
replace(row,
"\\{depth_marks\\}", chevrons.str());
1253 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
1255 const std::string raw_row =
replace(row,
"\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]",
"");
1256 const std::string hfill_tag =
"{hfill}";
1257 const size_t hfill_pos = row.find(hfill_tag);
1258 const size_t raw_hfill_pos = raw_row.find(hfill_tag);
1259 const size_t nb_columns = std::max(std::min((
size_t)_nb_columns, _hfill_max), _hfill_min);
1260 if(hfill_pos != std::string::npos) {
1261 assert(raw_hfill_pos != std::string::npos);
1262 if(nb_columns > 0) {
1263 const size_t left_len = raw_hfill_pos;
1264 const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
1265 if(right_len+left_len > nb_columns) {
1267 if(right_len < nb_columns) {
1269 const std::string hfill(std::max((
size_t)0, nb_columns-right_len), _hfill_char);
1270 const std::string hfill_styled = _hfill_fmt(hfill);
1271 row =
replace(row,
"\\{hfill\\}",
"\n"+hfill_styled);
1274 const std::string hfill(1, _hfill_char);
1275 const std::string hfill_styled = _hfill_fmt(hfill);
1276 row =
replace(row,
"\\{hfill\\}",
"\n"+hfill_styled);
1280 const std::string hfill(std::max((
size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
1281 const std::string hfill_styled = _hfill_fmt(hfill);
1282 row =
replace(row,
"\\{hfill\\}", hfill_styled);
1286 const std::string hfill(1, _hfill_char);
1287 const std::string hfill_styled = _hfill_fmt(hfill);
1288 row =
replace(row,
"\\{hfill\\}", hfill_styled);
1293 const std::string hfill(1, _hfill_char);
1294 const std::string hfill_styled = _hfill_fmt(hfill);
1295 row =
replace(row,
"\\{hfill\\}", hfill_styled);
1303 const std::string& what,
1304 const std::string&
file,
const std::string&
func,
size_t line
1310 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
1313 line, scope.depth );
1328 const In container_begin,
const In container_end,
1329 const std::string&
file,
const std::string&
func,
size_t line,
1330 const std::string& filename_template =
"dump_{n}.dat",
1337 const std::string tag =
"\\{n\\}";
1338 const std::regex re(tag);
1339 std::string outfile =
"";
1342 if(std::regex_search(filename_template, re)) {
1346 outfile =
replace(filename_template, tag, n);
1348 }
while( fs::exists( outfile ) );
1352 outfile = filename_template;
1355 std::ofstream fd(outfile);
1358 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
1361 line, scope.depth );
1370 std::copy(container_begin, container_end,
1371 std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
1382 #else // not WITH_CLUTCHLOG
1391 #pragma GCC diagnostic push
1392 #pragma GCC diagnostic ignored "-Wreturn-type"
1397 enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
1401 enum class typo { reset, bold, underline, inverse, none}
style;
1402 enum class fg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none}
fore;
1403 enum class bg { black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white, none }
back;
1405 friend std::ostream&
operator<<(std::ostream&,
const std::tuple<fg,bg,typo>&) {}
1412 virtual bool is_set()
const = 0;
1413 virtual std::ostream&
print_on( std::ostream&)
const = 0;
1416 struct color_256 :
public color {
1421 std::ostream&
print_on( std::ostream&)
const {}
1423 struct fg_256 :
public color_256 {
1428 struct bg_256 :
public color_256 {
1433 struct color_16M :
public color {
1434 short red, green, blue;
1438 bool is_set()
const {
return red > -1 and green > -1 and blue > -1;}
1439 std::ostream&
print_on( std::ostream&)
const {}
1441 struct fg_16M :
public color_16M {
1447 struct bg_16M :
public color_16M {
1464 fmt(
const short fr,
const short fg,
const short fb,
1465 const short gr,
const short gg,
const short gb,
1466 typo s = typo::none)
1469 const short gr,
const short gg,
const short gb,
1470 typo s = typo::none)
1472 fmt(
const short fr,
const short fg,
const short fb,
1475 fmt(
const short fr,
const short fg,
const short fb,
1476 typo s = typo::none)
1479 fmt(
const std::string& f,
const std::string& b,
typo s = typo::none)
1481 fmt(
fg,
const std::string& b,
typo s = typo::none)
1483 fmt(
const std::string& f,
bg,
typo s = typo::none)
1485 fmt(
const std::string& f,
typo s = typo::none)
1488 std::ostream&
print_on( std::ostream&)
const {}
1490 friend std::ostream&
operator<<(std::ostream&,
const fmt&) {}
1491 std::string
operator()(
const std::string&)
const {}
1492 std::string
str()
const {}
1496 void operator=(
clutchlog const&) =
delete;
1509 void format(
const std::string&) {}
1510 std::string
format()
const {}
1515 void out(std::ostream&) {}
1516 std::ostream&
out() {}
1518 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
1519 void depth(
size_t) {}
1520 size_t depth()
const {}
1522 void depth_mark(
const std::string) {}
1523 std::string depth_mark()
const {}
1524 void strip_calls(
const size_t) {}
1525 size_t strip_calls()
const {}
1527 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
1528 void hfill_mark(
const char) {}
1529 char hfill_mark()
const {}
1530 void hfill_fmt(fmt) {}
1531 fmt hfill_fmt()
const {}
1532 void hfill_min(
const size_t) {}
1533 size_t hfill_min() {}
1534 void hfill_max(
const size_t) {}
1535 size_t hfill_max() {}
1541 const std::map<std::string,level>
levels()
const {}
1544 void file(std::string) {}
1545 void func(std::string) {}
1546 void line(std::string) {}
1548 #pragma GCC diagnostic push
1549 #pragma GCC diagnostic ignored "-Wunused-parameter"
1552 const std::string& in_function=
".*",
1553 const std::string& in_line=
".*"
1556 #pragma GCC diagnostic pop
1557 template<
class ... FMT>
1596 const std::string&,
const std::string&,
size_t
1604 const std::string&,
const std::string&,
size_t,
1610 #pragma GCC diagnostic pop
1611 #endif // WITH_CLUTCHLOG
1613 #endif // CLUTCHLOG_H
friend std::ostream & operator<<(std::ostream &os, const std::tuple< fg, bg, typo > &fbs)
Output stream operator for a 3-tuple of 16-colors mode tags.
static std::string default_depth_mark
Default mark for stack depth.
std::string _format_log
Current format of the standard output.
color_16M(ground t, const std::string &srgb)
Hex triplet string constructor.
std::map< level, fmt > _level_fmt
Dictionary of level identifier to their format.
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
enum clutchlog::fmt::bg back
Background color.
std::string str() const
Return the formatting code as a string.
Foreground in 256-colors mode.
void line(std::string line)
Set the regular expression filtering the line location.
friend std::ostream & operator<<(std::ostream &os, const color &c)
Print the actually encoded escaped color sequence on the given stream.
friend std::ostream & operator<<(std::ostream &os, const typo &s)
Output stream operator for a typo tag alone, in 16-colors mode.
static std::string dump_default_format
Default format of the comment line in file dump.
void out(std::ostream &out)
Set the output stream on which to print.
bool is_set() const
Returns true if the underying representation encodes an existing color.
fg_16M(const fg &)
Conversion constructor from 16-colors mode.
static std::string dump_default_sep
Default item separator for dump.
std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
Substitute all tags in the format string with the corresponding information and apply the style corre...
Background in 256-colors mode.
#define CLUTCHLOG_DEFAULT_DEPTH_MARK
Compile-time default mark for stack depth.
static unsigned int default_strip_calls
Number of call stack levels to remove from depth display by default.
static size_t default_hfill_min
Default minimum width (number of characters) at which to fill for right-aligning the right part of me...
std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
Replace mark by tag in form.
color_256(ground t)
Constructor.
clutchlog::fmt::bg_16M back_16M
Current background in 16M-colors mode.
Interface class for colors representation.
@ colors_16
16 colors mode.
background in 256-colors mode.
static char default_hfill_char
Default character used as a filling for right-align the right part of messages with "{hfill}".
bool matches
Everything is compatible.
enum clutchlog::fmt::typo style
Typographic style.
Abstract base class for 16M colors objects (24-bits ANSI).
fg_256(const fg &)
Conversion constructor from 16-colors mode.
void format_comment(const std::string &format)
Set the template string for dumps.
bg_16M(const std::string &srgb)
Hex triplet string constructor.
void file(std::string file)
Set the regular expression filtering the file location.
scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
Gather information on the current location of the call.
clutchlog::fmt::fg_16M fore_16M
Current foreground in 16M-colors mode.
Abstract base class for 256 colors objects (8-bits ANSI).
fmt()
Empty constructor, only useful for a no-op formatter.
void style(level stage, fmt style)
Set the style (color and typo) of the given log level, passing a fmt instance.
void threshold(level l)
Set the log level (below which logs are not printed) with an identifier.
level threshold() const
Get the log level below which logs are not printed.
virtual bool is_set() const =0
Should return true if the underying representation encodes an existing color.
std::map< level, std::string > _level_short
dictionary of level identifier to their 4-letters representation.
level
Available log levels.
color_256(ground t, const short i)
Constructor.
std::ostream & print_on(std::ostream &os) const
Print the color index on the given stream.
color_16M(ground t)
Constructor.
static size_t default_hfill_max
Default maximum width (number of characters) for which to fill for right-aligning the right part of m...
std::regex _in_func
Current function location filter.
static std::string default_format
Default format of the messages.
bg_16M(short r, short g, short b)
Numeric triplet constructor.
static clutchlog & logger()
Get the logger instance.
Foreground in 256-colors mode.
void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
Dump a serializable container after a comment line with log information.
clutchlog::fmt::fg_256 fore_256
Current foreground in 256-colors mode.
enum clutchlog::fmt::fg fore
Foreground color.
enum clutchlog::fmt::color::ground type
Type of color (foreground or background).
Color and style formatter for ANSI terminal escape sequences.
short index
The encoded color index in 4-bits ANSI.
bg_256()
Empty constructor: no color.
void func(std::string func)
Set the regular expression filtering the function location.
std::string format() const
Get the template string.
std::regex _in_file
Current file location filter.
void style(level stage, FMT... styles)
Set the style (color and typo) of the given log level.
bg_256(const bg &)
Conversion constructor from 16-colors mode.
fg_16M()
Empty constructor: no color.
level level_of(const std::string name)
Return the log level tag corresponding to the given pre-configured name.
const std::map< level, std::string > _level_word
Dictionary of level identifier to their string representation.
std::string operator()(const std::string &msg) const
Format the given string with the currently encoded format.
color_16M(ground t, short r, short g, short b)
Numeric triplet constructor.
std::ostream & print_on(std::ostream &os) const
Print the color RGB triplet on the given stream.
bg
Background color codes.
#define CLUTCHLOG_DEFAULT_FORMAT
Compile-time default format of the messages (debug mode: with absolute location).
std::regex _in_line
Current line location filter.
fg_256(const short f)
Constructor.
@ colors_256
256 colors mode.
enum clutchlog::fmt::ansi mode
Current ANSI color mode.
std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
Replace mark by tag in form, converting tag to its string representation first.
std::string format_comment() const
Get the template string for dumps.
fg_256()
Empty constructor: no color.
@ colors_16M
16 millions ("true") colors mode.
std::string _format_dump
Current format of the file output.
#define CLUTCHDUMP_DEFAULT_SEP
Compile-time default item separator for dump.
bg_256(const short b)
Constructor.
ground
Codes for representing foreground or background.
Structure holding a location matching.
#define CLUTCHLOG_DEFAULT_HFILL_MARK
Character used as a filling for right-align the right part of messages with "{hfill}".
std::ostream & print_on(std::ostream &os) const
Print the currently encoded format escape code on the given output stream.
bool is_set() const
Returns true if the underying representation encodes an existing color.
std::ostream * _out
Standard output.
std::ostream & out()
Get the output stream on which to print.
void threshold(const std::string &l)
Set the log level (below which logs are not printed) with a string.
virtual std::ostream & print_on(std::ostream &os) const =0
Should print the underlying representation on the given stream.
const std::map< std::string, level > & levels() const
Get the map of available log levels string representations toward their identifier....
size_t _strip_calls
Current number of call stack levels to remove from depth display.
level stage
Current log level.
bool there
Location is compatible.
fg_16M(const std::string &srgb)
Hex triplet string constructor.
#define CLUTCHLOG_STRIP_CALLS
Compile-time number of call stack levels to remove from depth display by default.
friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
Output stream overload.
bg_16M(const bg &)
Conversion constructor from 16-colors mode.
bg_16M()
Empty constructor: no color.
std::map< std::string, level > _word_level
Dictionary of level string to their identifier.
level _stage
Current log level.
fmt style(level stage) const
Get the configured fmt instance of the given log level.
typo
Typographic style codes.
void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
Set the regular expressions filtering the location.
#define CLUTCHLOG_HAVE_UNIX_SYSINFO
True if POSIX headers necessary for stack depth management are available.
The single class which holds everything.
ansi
ANSI code configuring the available number of colors.
fg_16M(short r, short g, short b)
Numeric triplet constructor.
fg
Foreground color codes.
short red
The encoded RGB indices.
#define CLUTCHDUMP_DEFAULT_FORMAT
Compile-time default format of the comment line in file dump.
color(ansi a, ground g)
Constructor.
clutchlog::fmt::bg_256 back_256
Current background in 256-colors mode.