ifm3d
log.h
1 // -*- c++ -*-
2 /*
3  * Copyright 2023-present ifm electronic, gmbh
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef IFM3D_COMMON_LOGGING_LOG_H
8 #define IFM3D_COMMON_LOGGING_LOG_H
9 
10 #include <cstring>
11 
12 #include <ifm3d/common/logging/log_entry.h>
13 #include <ifm3d/common/logging/log_level.h>
14 #include <ifm3d/common/logging/logger.h>
15 
16 #include <fmt/format.h>
17 
18 #ifdef _MSC_VER
19 # define LOG_GET_FUNC() __FUNCTION__
20 #else
21 # define LOG_GET_FUNC() __PRETTY_FUNCTION__
22 #endif
23 
24 #ifndef IFM3D_COMMON_LOGGING_STRIP_PREFIX
25 # define IFM3D_COMMON_LOGGING_STRIP_PREFIX ""
26 #endif
27 
28 namespace ifm3d
29 {
30  constexpr std::size_t
31  _log_strlen(const char* str)
32  {
33  std::size_t len = 0;
34  while (str[len] != '\0')
35  {
36  ++len;
37  }
38  return len;
39  }
40 
41  constexpr bool
42  _log_starts_with(const char* str, const char* prefix)
43  {
44  std::size_t i = 0;
45  while (prefix[i] != '\0')
46  {
47  if (str[i] != prefix[i])
48  {
49  return false;
50  }
51  ++i;
52  }
53  return true;
54  }
55 
56  constexpr const char*
57  _log_strip_prefix(const char* ptr, const char* prefix)
58  {
59  return _log_starts_with(ptr, prefix) ? ptr + _log_strlen(prefix) : ptr;
60  }
61 }
62 
63 // NOLINTNEXTLINE(*-macro-usage)
64 #define LOG_GET_FILE() \
65  ::ifm3d::_log_strip_prefix(__FILE__, IFM3D_COMMON_LOGGING_STRIP_PREFIX)
66 // NOLINTNEXTLINE(*-macro-usage)
67 #define LOG_GET_LINE() __LINE__
68 
69 // NOLINTNEXTLINE(*-macro-usage,readability-identifier-naming)
70 #define LOG_IF_(condition) \
71  if (!(condition)) \
72  { \
73  ; \
74  } \
75  else
76 
77 #define LOG(log_level, msg, ...) \
78  LOG_IF_(::ifm3d::Logger::Get().ShouldLog(log_level)) \
79  { \
80  ::ifm3d::Logger::Get().Write( \
81  ::ifm3d::LogEntry(::fmt::format(msg, ##__VA_ARGS__), \
82  log_level, \
83  LOG_GET_FILE(), \
84  LOG_GET_FUNC(), \
85  LOG_GET_LINE())); \
86  }
87 
88 #define LOG_VERBOSE(fmt, ...) \
89  LOG(::ifm3d::LogLevel::Verbose, fmt, ##__VA_ARGS__)
90 #define LOG_DEBUG(fmt, ...) LOG(::ifm3d::LogLevel::Debug, fmt, ##__VA_ARGS__)
91 #define LOG_INFO(fmt, ...) LOG(::ifm3d::LogLevel::Info, fmt, ##__VA_ARGS__)
92 #define LOG_WARNING(fmt, ...) \
93  LOG(::ifm3d::LogLevel::Warning, fmt, ##__VA_ARGS__)
94 #define LOG_ERROR(fmt, ...) LOG(::ifm3d::LogLevel::Error, fmt, ##__VA_ARGS__)
95 #define LOG_CRITICAL(fmt, ...) \
96  LOG(::ifm3d::LogLevel::Critical, fmt, ##__VA_ARGS__)
97 
98 #endif // IFM3D_COMMON_LOGGING_LOG_H