Skip to content

Commit aa167c2

Browse files
committed
Logger: distinguish between LOGF and LOGP
The former now has printf-like syntax, the latter uses the native python / fmt syntax.
1 parent b7b982c commit aa167c2

3 files changed

Lines changed: 45 additions & 6 deletions

File tree

Framework/Core/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,8 @@ FairLogger.
333333
...
334334
335335
LOG(INFO) << "some message"; // streamer based API
336-
LOGF(INFO, "{}", "some message"); // fmt based API
336+
LOGF(INFO, "%s", "some message"); // printf based API
337+
LOGP(INFO, "{}", "some message"); // python / fmt based API
337338
O2INFO("{}", "some message); // same but with less typing.
338339
```
339340

Framework/Logger/include/Framework/Logger.h

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,52 @@
1717
#include <fairlogger/Logger.h>
1818
#if __has_include(<fmt/format.h>)
1919
#include <fmt/format.h>
20-
#define LOGF(level, ...) LOG(level) << fmt::format(__VA_ARGS__)
20+
#include <fmt/printf.h>
21+
FMT_BEGIN_NAMESPACE
22+
template <typename S, typename Char = FMT_CHAR(S)>
23+
inline int vfprintf(fair::Logger& logger,
24+
const S& format,
25+
basic_format_args<typename basic_printf_context_t<
26+
internal::basic_buffer<Char>>::type>
27+
args)
28+
{
29+
basic_memory_buffer<Char> buffer;
30+
printf(buffer, to_string_view(format), args);
31+
logger << std::string_view(buffer.data(), buffer.size());
32+
return static_cast<int>(buffer.size());
33+
}
34+
35+
template <typename S, typename... Args>
36+
inline FMT_ENABLE_IF_T(internal::is_string<S>::value, int)
37+
fprintf(fair::Logger& logger,
38+
const S& format_str, const Args&... args)
39+
{
40+
internal::check_format_string<Args...>(format_str);
41+
typedef internal::basic_buffer<FMT_CHAR(S)> buffer;
42+
typedef typename basic_printf_context_t<buffer>::type context;
43+
format_arg_store<context, Args...> as{ args... };
44+
return vfprintf(logger, to_string_view(format_str),
45+
basic_format_args<context>(as));
46+
}
47+
48+
FMT_END_NAMESPACE
49+
50+
#define LOGF(severity, ...) \
51+
for (bool fairLOggerunLikelyvariable = false; fair::Logger::Logging(fair::Severity::severity) && !fairLOggerunLikelyvariable; fairLOggerunLikelyvariable = true) \
52+
fmt::fprintf(fair::Logger(fair::Severity::severity, __FILE__, CONVERTTOSTRING(__LINE__), __FUNCTION__).Log(), __VA_ARGS__)
53+
#define LOGP(level, ...) LOG(level) << fmt::format(__VA_ARGS__)
2154
#else
2255
#define O2_FIRST_ARG(N, ...) N
2356
#define LOGF(level, ...) LOG(level) << O2_FIRST_ARG(__VA_ARGS__)
57+
#define LOGP(level, ...) LOG(level) << O2_FIRST_ARG(__VA_ARGS__)
2458
#endif
2559
#define O2DEBUG(...) LOGF(debug, __VA_ARGS__)
2660
#define O2INFO(...) LOGF(info, __VA_ARGS__)
2761
#define O2ERROR(...) LOGF(error, __VA_ARGS__)
2862
#elif __has_include(<fmt/format.h>)
2963
#include <fmt/format.h>
3064
#define LOGF(level, ...) fmt::printf(__VA_ARGS__)
65+
#define LOGP(level, ...) fmt::print(__VA_ARGS__)
3166
#define O2DEBUG(...) LOGF("dummy", __VA_ARGS__)
3267
#define O2INFO(...) LOGF("dummy", __VA_ARGS__)
3368
#define O2ERROR(...) LOGF("dummy", __VA_ARGS__)

Framework/Logger/test/unittest_Logger.cxx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@
1717

1818
BOOST_AUTO_TEST_CASE(TestLogF)
1919
{
20-
LOGF(error, "{}", "Hello world");
21-
LOGF(info, "{}", "Hello world");
22-
LOGF(error, "{:03.2f}", 1000.30343f);
23-
LOGF(error, "{1} {0}", "world", "Hello");
20+
LOGF(error, "%s", "Hello world");
21+
LOGF(info, "%s", "Hello world");
22+
LOGF(error, "%.2f", 1000.30343f);
23+
LOGP(error, "{}", "Hello world");
24+
LOGP(info, "{}", "Hello world");
25+
LOGP(error, "{:03.2f}", 1000.30343f);
26+
LOGP(error, "{1} {0}", "world", "Hello");
2427
O2ERROR("{}", "Hello world");
2528
O2INFO("{}", "Hello world");
2629
}

0 commit comments

Comments
 (0)