Coverage Report

Created: 2025-11-16 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/PcapPlusPlus/Common++/header/Logger.h
Line
Count
Source
1
#pragma once
2
3
#include <cstdio>
4
#include <cstdint>
5
#include <memory>
6
#include <array>
7
#include <mutex>
8
#include <ostream>
9
#include <sstream>
10
#include <functional>
11
#include "DeprecationUtils.h"
12
#include "ObjectPool.h"
13
14
#ifndef LOG_MODULE
15
19.1M
# define LOG_MODULE UndefinedLogModule
16
#endif
17
18
// Use __FILE_NAME__ to avoid leaking complete full path
19
#ifdef __FILE_NAME__
20
148k
# define PCAPPP_FILENAME __FILE_NAME__
21
#else
22
# define PCAPPP_FILENAME __FILE__
23
#endif
24
25
/// @file
26
27
// Compile time log levels.
28
// Allows for conditional removal of unwanted log calls at compile time.
29
#define PCPP_LOG_LEVEL_OFF 0
30
#define PCPP_LOG_LEVEL_ERROR 1
31
#define PCPP_LOG_LEVEL_WARN 2
32
#define PCPP_LOG_LEVEL_INFO 3
33
#define PCPP_LOG_LEVEL_DEBUG 4
34
35
// All log messages built via a PCPP_LOG_* macro below the PCPP_ACTIVE_LOG_LEVEL will be removed at compile time.
36
// Uses the PCPP_ACTIVE_LOG_LEVEL if it is defined, otherwise defaults to PCAP_LOG_LEVEL_DEBUG
37
#ifndef PCPP_ACTIVE_LOG_LEVEL
38
# define PCPP_ACTIVE_LOG_LEVEL PCPP_LOG_LEVEL_DEBUG
39
#endif  // !PCPP_ACTIVE_LOG_LEVEL
40
41
/// @namespace pcpp
42
/// @brief The main namespace for the PcapPlusPlus lib
43
namespace pcpp
44
{
45
  /// Cross-platform and thread-safe version of strerror
46
  /// @param errnum Value of errno
47
  /// @return String representation of the error number
48
  std::string getErrorString(int errnum);
49
50
  /// An enum representing all PcapPlusPlus modules
51
  enum LogModule : uint8_t
52
  {
53
    UndefinedLogModule,
54
    CommonLogModuleIpUtils,          ///< IP Utils module (Common++)
55
    CommonLogModuleTablePrinter,     ///< Table printer module (Common++)
56
    CommonLogModuleGenericUtils,     ///< Generic Utils (Common++)
57
    PacketLogModuleRawPacket,        ///< RawPacket module (Packet++)
58
    PacketLogModulePacket,           ///< Packet module (Packet++)
59
    PacketLogModuleLayer,            ///< Layer module (Packet++)
60
    PacketLogModuleAsn1Codec,        ///< Asn1Codec module (Packet++)
61
    PacketLogModuleArpLayer,         ///< ArpLayer module (Packet++)
62
    PacketLogModuleEthLayer,         ///< EthLayer module (Packet++)
63
    PacketLogModuleIPv4Layer,        ///< IPv4Layer module (Packet++)
64
    PacketLogModuleIPv6Layer,        ///< IPv6Layer module (Packet++)
65
    PacketLogModulePayloadLayer,     ///< PayloadLayer module (Packet++)
66
    PacketLogModuleTcpLayer,         ///< TcpLayer module (Packet++)
67
    PacketLogModuleUdpLayer,         ///< UdpLayer module (Packet++)
68
    PacketLogModuleVlanLayer,        ///< VlanLayer module (Packet++)
69
    PacketLogModuleHttpLayer,        ///< HttpLayer module (Packet++)
70
    PacketLogModulePPPoELayer,       ///< PPPoELayer module (Packet++)
71
    PacketLogModuleDnsLayer,         ///< DnsLayer module (Packet++)
72
    PacketLogModuleMplsLayer,        ///< MplsLayer module (Packet++)
73
    PacketLogModuleIcmpLayer,        ///< IcmpLayer module (Packet++)
74
    PacketLogModuleIcmpV6Layer,      ///< IcmpV6Layer module (Packet++)
75
    PacketLogModuleGreLayer,         ///< GreLayer module (Packet++)
76
    PacketLogModuleSSLLayer,         ///< SSLLayer module (Packet++)
77
    PacketLogModuleSllLayer,         ///< SllLayer module (Packet++)
78
    PacketLogModuleSll2Layer,        ///< Sll2Layer module (Packet++)
79
    PacketLogModuleNflogLayer,       ///< NflogLayer module (Packet++)
80
    PacketLogModuleDhcpLayer,        ///< DhcpLayer module (Packet++)
81
    PacketLogModuleDhcpV6Layer,      ///< DhcpV6Layer module (Packet++)
82
    PacketLogModuleIgmpLayer,        ///< IgmpLayer module (Packet++)
83
    PacketLogModuleSipLayer,         ///< SipLayer module (Packet++)
84
    PacketLogModuleSdpLayer,         ///< SdpLayer module (Packet++)
85
    PacketLogModuleRadiusLayer,      ///< RadiusLayer module (Packet++)
86
    PacketLogModuleGtpLayer,         ///< GtpLayer module (Packet++)
87
    PacketLogModuleBgpLayer,         ///< GtpLayer module (Packet++)
88
    PacketLogModuleSSHLayer,         ///< SSHLayer module (Packet++)
89
    PacketLogModuleVrrpLayer,        ///< Vrrp Record module (Packet++)
90
    PacketLogModuleTcpReassembly,    ///< TcpReassembly module (Packet++)
91
    PacketLogModuleIPReassembly,     ///< IPReassembly module (Packet++)
92
    PacketLogModuleIPSecLayer,       ///< IPSecLayers module (Packet++)
93
    PacketLogModuleNtpLayer,         ///< NtpLayer module (Packet++)
94
    PacketLogModuleTelnetLayer,      ///< TelnetLayer module (Packet++)
95
    PacketLogModuleStpLayer,         ///< StpLayer module (Packet++)
96
    PacketLogModuleLLCLayer,         ///< LLCLayer module (Packet++)
97
    PacketLogModuleNdpLayer,         ///< NdpLayer module (Packet++)
98
    PacketLogModuleFtpLayer,         ///< FtpLayer module (Packet++)
99
    PacketLogModuleSomeIpLayer,      ///< SomeIpLayer module (Packet++)
100
    PacketLogModuleSomeIpSdLayer,    ///< SomeIpSdLayer module (Packet++)
101
    PacketLogModuleWakeOnLanLayer,   ///< WakeOnLanLayer module (Packet++)
102
    PacketLogModuleSmtpLayer,        ///< SmtpLayer module (Packet++)
103
    PacketLogModuleWireGuardLayer,   ///< WireGuardLayer module (Packet++)
104
    PacketLogModuleDoIpLayer,        ///< DoipLayer module (Packet++)
105
    PcapLogModuleWinPcapLiveDevice,  ///< WinPcapLiveDevice module (Pcap++)
106
    PcapLogModuleRemoteDevice,       ///< WinPcapRemoteDevice module (Pcap++)
107
    PcapLogModuleLiveDevice,         ///< PcapLiveDevice module (Pcap++)
108
    PcapLogModuleFileDevice,         ///< FileDevice module (Pcap++)
109
    PcapLogModulePfRingDevice,       ///< PfRingDevice module (Pcap++)
110
    PcapLogModuleMBufRawPacket,      ///< MBufRawPacket module (Pcap++)
111
    PcapLogModuleDpdkDevice,         ///< DpdkDevice module (Pcap++)
112
    PcapLogModuleKniDevice,          ///< KniDevice module (Pcap++)
113
    PcapLogModuleXdpDevice,          ///< XdpDevice module (Pcap++)
114
    PcapLogModuleNetworkUtils,       ///< Network Utils module (Pcap++)
115
    NumOfLogModules
116
  };
117
118
  /// @struct LogSource
119
  /// Represents the source of a log message.
120
  /// Contains information about the source file, function, line number, and the log module.
121
  struct LogSource
122
  {
123
    /// Default constructor for LogSource.
124
8
    constexpr LogSource() = default;
125
126
    /// Constructor for LogSource with only the log module.
127
    /// @param logModule The log module.
128
    explicit constexpr LogSource(LogModule logModule) : logModule(logModule)
129
0
    {}
130
131
    /// Constructor for LogSource with all parameters.
132
    /// @param logModule The log module.
133
    /// @param file The source file.
134
    /// @param function The source function.
135
    /// @param line The line number.
136
    constexpr LogSource(LogModule logModule, const char* file, const char* function, int line)
137
148k
        : file(file), function(function), line(line), logModule(logModule)
138
148k
    {}
139
140
    const char* file = nullptr;               /**< The source file. */
141
    const char* function = nullptr;           /**< The source function. */
142
    int line = 0;                             /**< The line number. */
143
    LogModule logModule = UndefinedLogModule; /**< The log module. */
144
  };
145
146
  /// An enum representing the log level. Currently 4 log levels are supported: Off, Error, Info and Debug. Info is
147
  /// the default log level
148
  enum class LogLevel : uint8_t
149
  {
150
    Off = PCPP_LOG_LEVEL_OFF,      ///< No log messages are emitted.
151
    Error = PCPP_LOG_LEVEL_ERROR,  ///< Error level logs are emitted.
152
    Warn = PCPP_LOG_LEVEL_WARN,    ///< Warning level logs and above are emitted.
153
    Info = PCPP_LOG_LEVEL_INFO,    ///< Info level logs and above are emitted.
154
    Debug = PCPP_LOG_LEVEL_DEBUG   ///< Debug level logs and above are emitted.
155
  };
156
157
  inline std::ostream& operator<<(std::ostream& ostr, LogLevel lvl)
158
0
  {
159
0
    return ostr << static_cast<std::underlying_type_t<LogLevel>>(lvl);
160
0
  }
161
162
  // Forward declaration
163
  class Logger;
164
165
  namespace internal
166
  {
167
    /// @class LogContext
168
    /// @brief A context encapsulating the details of a single log message to be passed to the Logger.
169
    class LogContext
170
    {
171
    public:
172
      friend class pcpp::Logger;
173
174
      /// @brief Creates a context with an empty message with Info level and no source.
175
8
      LogContext() = default;
176
177
      /// @brief Creates a context with an empty message with the given level and source.
178
      /// @param level The log level for this message.
179
      /// @param source The log source.
180
0
      explicit LogContext(LogLevel level, LogSource const& source = {}) : m_Source(source), m_Level(level)
181
0
      {}
182
183
      /// @brief Initializes the context with an empty message and the given level and source.
184
      /// @param level The log level for this message.
185
      /// @param source The log source.
186
      void init(LogLevel level, LogSource const& source)
187
148k
      {
188
148k
        m_Source = source;
189
148k
        m_Level = level;
190
148k
        m_Stream.clear();
191
148k
        m_Stream.str({});
192
148k
      }
193
194
      /// @brief Appends to the message.
195
      /// @param value The value to append.
196
      /// @return A reference to this context.
197
      template <class T> LogContext& operator<<(T const& value)
198
231k
      {
199
231k
        m_Stream << value;
200
231k
        return *this;
201
231k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [54]>(char const (&) [54])
Line
Count
Source
198
3.56k
      {
199
3.56k
        m_Stream << value;
200
3.56k
        return *this;
201
3.56k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
198
956
      {
199
956
        m_Stream << value;
200
956
        return *this;
201
956
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [2]>(char const (&) [2])
Line
Count
Source
198
264
      {
199
264
        m_Stream << value;
200
264
        return *this;
201
264
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [52]>(char const (&) [52])
Line
Count
Source
198
30
      {
199
30
        m_Stream << value;
200
30
        return *this;
201
30
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [46]>(char const (&) [46])
Line
Count
Source
198
7.43k
      {
199
7.43k
        m_Stream << value;
200
7.43k
        return *this;
201
7.43k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [4]>(char const (&) [4])
Line
Count
Source
198
692
      {
199
692
        m_Stream << value;
200
692
        return *this;
201
692
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [256]>(char const (&) [256])
Line
Count
Source
198
692
      {
199
692
        m_Stream << value;
200
692
        return *this;
201
692
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [21]>(char const (&) [21])
Line
Count
Source
198
235
      {
199
235
        m_Stream << value;
200
235
        return *this;
201
235
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <int>(int const&)
Line
Count
Source
198
50.5k
      {
199
50.5k
        m_Stream << value;
200
50.5k
        return *this;
201
50.5k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [31]>(char const (&) [31])
Line
Count
Source
198
31.4k
      {
199
31.4k
        m_Stream << value;
200
31.4k
        return *this;
201
31.4k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [18]>(char const (&) [18])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [14]>(char const (&) [14])
Line
Count
Source
198
622
      {
199
622
        m_Stream << value;
200
622
        return *this;
201
622
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [13]>(char const (&) [13])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [47]>(char const (&) [47])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [32]>(char const (&) [32])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [55]>(char const (&) [55])
Line
Count
Source
198
4.24k
      {
199
4.24k
        m_Stream << value;
200
4.24k
        return *this;
201
4.24k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [33]>(char const (&) [33])
Line
Count
Source
198
671
      {
199
671
        m_Stream << value;
200
671
        return *this;
201
671
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [107]>(char const (&) [107])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [44]>(char const (&) [44])
Line
Count
Source
198
942
      {
199
942
        m_Stream << value;
200
942
        return *this;
201
942
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [35]>(char const (&) [35])
Line
Count
Source
198
1.32k
      {
199
1.32k
        m_Stream << value;
200
1.32k
        return *this;
201
1.32k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [49]>(char const (&) [49])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char const*>(char const* const&)
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [30]>(char const (&) [30])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [22]>(char const (&) [22])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [26]>(char const (&) [26])
Line
Count
Source
198
372
      {
199
372
        m_Stream << value;
200
372
        return *this;
201
372
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [36]>(char const (&) [36])
Line
Count
Source
198
2
      {
199
2
        m_Stream << value;
200
2
        return *this;
201
2
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [15]>(char const (&) [15])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [17]>(char const (&) [17])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [94]>(char const (&) [94])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <pcpp::LinkLayerType>(pcpp::LinkLayerType const&)
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [3]>(char const (&) [3])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [24]>(char const (&) [24])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [27]>(char const (&) [27])
Line
Count
Source
198
1.32k
      {
199
1.32k
        m_Stream << value;
200
1.32k
        return *this;
201
1.32k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [37]>(char const (&) [37])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [41]>(char const (&) [41])
Line
Count
Source
198
942
      {
199
942
        m_Stream << value;
200
942
        return *this;
201
942
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [48]>(char const (&) [48])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [56]>(char const (&) [56])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [59]>(char const (&) [59])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [45]>(char const (&) [45])
Line
Count
Source
198
10.7k
      {
199
10.7k
        m_Stream << value;
200
10.7k
        return *this;
201
10.7k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [23]>(char const (&) [23])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [43]>(char const (&) [43])
Line
Count
Source
198
20.4k
      {
199
20.4k
        m_Stream << value;
200
20.4k
        return *this;
201
20.4k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [28]>(char const (&) [28])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [40]>(char const (&) [40])
Line
Count
Source
198
27.7k
      {
199
27.7k
        m_Stream << value;
200
27.7k
        return *this;
201
27.7k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [20]>(char const (&) [20])
Line
Count
Source
198
162
      {
199
162
        m_Stream << value;
200
162
        return *this;
201
162
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [38]>(char const (&) [38])
Line
Count
Source
198
1.64k
      {
199
1.64k
        m_Stream << value;
200
1.64k
        return *this;
201
1.64k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <unsigned short>(unsigned short const&)
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [70]>(char const (&) [70])
Line
Count
Source
198
33
      {
199
33
        m_Stream << value;
200
33
        return *this;
201
33
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <unsigned long>(unsigned long const&)
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [42]>(char const (&) [42])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [50]>(char const (&) [50])
Line
Count
Source
198
4.17k
      {
199
4.17k
        m_Stream << value;
200
4.17k
        return *this;
201
4.17k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [72]>(char const (&) [72])
Line
Count
Source
198
2.39k
      {
199
2.39k
        m_Stream << value;
200
2.39k
        return *this;
201
2.39k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [77]>(char const (&) [77])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [86]>(char const (&) [86])
Line
Count
Source
198
2.37k
      {
199
2.37k
        m_Stream << value;
200
2.37k
        return *this;
201
2.37k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [76]>(char const (&) [76])
Line
Count
Source
198
1.36k
      {
199
1.36k
        m_Stream << value;
200
1.36k
        return *this;
201
1.36k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [85]>(char const (&) [85])
Line
Count
Source
198
45
      {
199
45
        m_Stream << value;
200
45
        return *this;
201
45
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [75]>(char const (&) [75])
Line
Count
Source
198
1.43k
      {
199
1.43k
        m_Stream << value;
200
1.43k
        return *this;
201
1.43k
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [84]>(char const (&) [84])
Line
Count
Source
198
15
      {
199
15
        m_Stream << value;
200
15
        return *this;
201
15
      }
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [69]>(char const (&) [69])
Line
Count
Source
198
1.43k
      {
199
1.43k
        m_Stream << value;
200
1.43k
        return *this;
201
1.43k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [73]>(char const (&) [73])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [83]>(char const (&) [83])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [87]>(char const (&) [87])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [57]>(char const (&) [57])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [92]>(char const (&) [92])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [82]>(char const (&) [82])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [8]>(char const (&) [8])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <pcpp::DhcpV6OptionType>(pcpp::DhcpV6OptionType const&)
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [98]>(char const (&) [98])
Line
Count
Source
198
15.5k
      {
199
15.5k
        m_Stream << value;
200
15.5k
        return *this;
201
15.5k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [16]>(char const (&) [16])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [19]>(char const (&) [19])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [96]>(char const (&) [96])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [51]>(char const (&) [51])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [60]>(char const (&) [60])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [64]>(char const (&) [64])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [12]>(char const (&) [12])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [53]>(char const (&) [53])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [141]>(char const (&) [141])
Line
Count
Source
198
1.35k
      {
199
1.35k
        m_Stream << value;
200
1.35k
        return *this;
201
1.35k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [68]>(char const (&) [68])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [29]>(char const (&) [29])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [122]>(char const (&) [122])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [138]>(char const (&) [138])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [103]>(char const (&) [103])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [95]>(char const (&) [95])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <std::__1::ios_base& (std::__1::ios_base&)>(std::__1::ios_base& ( const&)(std::__1::ios_base&))
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <unsigned int>(unsigned int const&)
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [67]>(char const (&) [67])
Line
Count
Source
198
4.19k
      {
199
4.19k
        m_Stream << value;
200
4.19k
        return *this;
201
4.19k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [7]>(char const (&) [7])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [81]>(char const (&) [81])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [91]>(char const (&) [91])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [5]>(char const (&) [5])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <unsigned char>(unsigned char const&)
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <pcpp::IPAddress::AddressType>(pcpp::IPAddress::AddressType const&)
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [9]>(char const (&) [9])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <pcpp::IPAddress>(pcpp::IPAddress const&)
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [65]>(char const (&) [65])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [108]>(char const (&) [108])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [25]>(char const (&) [25])
Line
Count
Source
198
27.7k
      {
199
27.7k
        m_Stream << value;
200
27.7k
        return *this;
201
27.7k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [34]>(char const (&) [34])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [74]>(char const (&) [74])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [10]>(char const (&) [10])
pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [39]>(char const (&) [39])
Line
Count
Source
198
2.35k
      {
199
2.35k
        m_Stream << value;
200
2.35k
        return *this;
201
2.35k
      }
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [58]>(char const (&) [58])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [63]>(char const (&) [63])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [1]>(char const (&) [1])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [6]>(char const (&) [6])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [117]>(char const (&) [117])
Unexecuted instantiation: pcpp::internal::LogContext& pcpp::internal::LogContext::operator<< <char [88]>(char const (&) [88])
202
203
    private:
204
      std::ostringstream m_Stream;
205
      LogSource m_Source;
206
      LogLevel m_Level = LogLevel::Info;
207
    };
208
  }  // namespace internal
209
210
  /// @class Logger
211
  /// PcapPlusPlus logger manager.
212
  /// PcapPlusPlus uses this logger to output both error and debug logs.
213
  /// There are currently 3 log levels: Logger#Error, Logger#Info and Logger#Debug.
214
  ///
215
  /// PcapPlusPlus is divided into modules (described in #LogModule enum). The user can set the log level got each
216
  /// module or to all modules at once. The default is Logger#Info which outputs only error messages. Changing log
217
  /// level for modules can be done dynamically while the application is running.
218
  ///
219
  /// The logger also exposes a method to retrieve the last error log message.
220
  ///
221
  /// Logs are printed to console by default in a certain format. The user can set a different print function to
222
  /// change the format or to print to other media (such as files, etc.).
223
  ///
224
  /// PcapPlusPlus logger is a singleton which can be reached from anywhere in the code.
225
  ///
226
  /// Note: Logger#Info level logs are currently only used in DPDK devices to set DPDK log level to RTE_LOG_NOTICE.
227
  class Logger
228
  {
229
  public:
230
    Logger(const Logger&) = delete;
231
    Logger& operator=(const Logger&) = delete;
232
233
    // Deprecated, Use the LogLevel in the pcpp namespace instead.
234
    using LogLevel = pcpp::LogLevel;
235
    PCPP_DEPRECATED("Use the LogLevel in the pcpp namespace instead.")
236
    static const LogLevel Error = LogLevel::Error;
237
    PCPP_DEPRECATED("Use the LogLevel in the pcpp namespace instead.")
238
    static const LogLevel Info = LogLevel::Info;
239
    PCPP_DEPRECATED("Use the LogLevel in the pcpp namespace instead.")
240
    static const LogLevel Debug = LogLevel::Debug;
241
242
    /// @typedef LogPrinter
243
    /// Log printer callback. Used for printing the logs in a custom way.
244
    /// @param[in] logLevel The log level for this log message
245
    /// @param[in] logMessage The log message
246
    /// @param[in] file The source file in PcapPlusPlus code the log message is coming from
247
    /// @param[in] method The method in PcapPlusPlus code the log message is coming from
248
    /// @param[in] line The line in PcapPlusPlus code the log message is coming from
249
    /// @remarks The printer callback should support being called from multiple threads simultaneously.
250
    using LogPrinter = std::function<void(LogLevel logLevel, const std::string& logMessage, const std::string& file,
251
                                          const std::string& method, const int line)>;
252
253
    /// A static method for converting the log level enum to a string.
254
    /// @param[in] logLevel A log level enum
255
    /// @return The log level as a string
256
    static std::string logLevelAsString(LogLevel logLevel);
257
258
    /// Get the log level for a certain module
259
    /// @param[in] module PcapPlusPlus module
260
    /// @return The log level set for this module
261
    LogLevel getLogLevel(LogModule module)
262
0
    {
263
0
      return m_LogModulesArray[module];
264
0
    }
265
266
    /// Set the log level for a certain PcapPlusPlus module
267
    /// @param[in] module PcapPlusPlus module
268
    /// @param[in] level The log level to set the module to
269
    void setLogLevel(LogModule module, LogLevel level)
270
0
    {
271
0
      m_LogModulesArray[module] = level;
272
0
    }
273
274
    /// Check whether a certain module is set to debug log level
275
    /// @param[in] module PcapPlusPlus module
276
    /// @return True if this module log level is "debug". False otherwise
277
    bool isDebugEnabled(LogModule module) const
278
72.1k
    {
279
72.1k
      return m_LogModulesArray[module] == LogLevel::Debug;
280
72.1k
    }
281
282
    /// @brief Check whether a log level should be emitted by the logger.
283
    /// @param level The level of the log message.
284
    /// @param module PcapPlusPlus module
285
    /// @return True if the message should be emitted. False otherwise.
286
    bool shouldLog(LogLevel level, LogModule module) const
287
19.8M
    {
288
19.8M
      return level != LogLevel::Off && m_LogModulesArray[module] >= level;
289
19.8M
    }
290
291
    /// Set all PcapPlusPlus modules to a certain log level
292
    /// @param[in] level The log level to set all modules to
293
    void setAllModulesToLogLevel(LogLevel level)
294
0
    {
295
0
      for (int i = 1; i < NumOfLogModules; i++)
296
0
      {
297
0
        m_LogModulesArray[i] = level;
298
0
      }
299
0
    }
300
301
    /// Set a custom log printer.
302
    /// @param[in] printer A log printer function that will be called for every log message
303
    void setLogPrinter(LogPrinter printer)
304
0
    {
305
0
      m_LogPrinter = printer;
306
0
    }
307
308
    /// Set the log printer back to the default printer
309
    void resetLogPrinter();
310
311
    /// @return Get the last error message
312
    std::string getLastError() const
313
0
    {
314
0
      return m_LastError;
315
0
    }
316
317
    /// Suppress logs in all PcapPlusPlus modules
318
    void suppressLogs()
319
10.5k
    {
320
10.5k
      m_LogsEnabled = false;
321
10.5k
    }
322
323
    /// Enable logs in all PcapPlusPlus modules
324
    void enableLogs()
325
0
    {
326
0
      m_LogsEnabled = true;
327
0
    }
328
329
    /// Get an indication if logs are currently enabled.
330
    /// @return True if logs are currently enabled, false otherwise
331
    bool logsEnabled() const
332
0
    {
333
0
      return m_LogsEnabled;
334
0
    }
335
336
    /// @brief Controls if the logger should use a pool of LogContext objects.
337
    ///
338
    /// If enabled is set to false, preallocate and maxPoolSize are ignored.
339
    /// @param enabled True to enable context pooling, false to disable.
340
    /// @param preallocate The number of LogContext objects to preallocate in the pool.
341
    /// @param maxPoolSize The maximum number of LogContext objects to keep in the pool.
342
    /// @remarks Disabling the pooling clears the pool.
343
    void useContextPooling(bool enabled, std::size_t preallocate = 2, std::size_t maxPoolSize = 10)
344
0
    {
345
0
      m_UseContextPooling = enabled;
346
0
347
0
      if (m_UseContextPooling)
348
0
      {
349
0
        m_LogContextPool.setMaxSize(maxPoolSize);
350
0
351
0
        if (preallocate > 0)
352
0
        {
353
0
          m_LogContextPool.preallocate(preallocate);
354
0
        }
355
0
      }
356
0
      else
357
0
      {
358
0
        // Clear the pool if we're disabling pooling.
359
0
        m_LogContextPool.clear();
360
0
      }
361
0
    }
362
363
    /// Get access to Logger singleton
364
    /// @todo: make this singleton thread-safe/
365
    /// @return a pointer to the Logger singleton
366
    static Logger& getInstance()
367
19.9M
    {
368
19.9M
      static Logger instance;
369
19.9M
      return instance;
370
19.9M
    }
371
372
    /// @brief Creates a new LogContext with Info level and no source.
373
    /// @return A new LogContext.
374
    std::unique_ptr<internal::LogContext> createLogContext();
375
376
    /// @brief Creates a new LogContext with the given level and source.
377
    /// @param level The log level for this message.
378
    /// @param source The log source.
379
    /// @return A new LogContext.
380
    std::unique_ptr<internal::LogContext> createLogContext(LogLevel level, LogSource const& source = {});
381
382
    /// @brief Directly emits a log message bypassing all level checks.
383
    /// @param source The log source.
384
    /// @param level The log level for this message. This is only used for the log printer.
385
    /// @param message The log message.
386
    void emit(LogSource const& source, LogLevel level, std::string const& message);
387
388
    /// @brief Directly emits a log message bypassing all level checks.
389
    /// @param message The log message.
390
    void emit(std::unique_ptr<internal::LogContext> message);
391
392
  private:
393
    bool m_LogsEnabled;
394
    std::array<LogLevel, NumOfLogModules> m_LogModulesArray{};
395
    LogPrinter m_LogPrinter;
396
397
    static thread_local std::string m_LastError;
398
399
    bool m_UseContextPooling = true;
400
    // Keep a maximum of 10 LogContext objects in the pool.
401
    internal::DynamicObjectPool<internal::LogContext> m_LogContextPool{ 10, 2 };
402
403
    // private c'tor - this class is a singleton
404
    Logger();
405
  };
406
407
}  // namespace pcpp
408
409
#define PCPP_LOG(level, message)                                                                                       \
410
19.8M
  do                                                                                                                 \
411
19.8M
  {                                                                                                                  \
412
19.8M
    auto& logger = pcpp::Logger::getInstance();                                                                    \
413
19.8M
    if (logger.shouldLog(level, LOG_MODULE))                                                                       \
414
19.8M
    {                                                                                                              \
415
148k
      auto ctx =                                                                                                 \
416
148k
          logger.createLogContext(level, pcpp::LogSource(LOG_MODULE, PCAPPP_FILENAME, __FUNCTION__, __LINE__));  \
417
148k
      (*ctx) << message;                                                                                         \
418
148k
      logger.emit(std::move(ctx));                                                                               \
419
148k
    }                                                                                                              \
420
19.8M
  } while (0)
421
422
#if PCPP_ACTIVE_LOG_LEVEL >= PCPP_LOG_LEVEL_DEBUG
423
19.7M
# define PCPP_LOG_DEBUG(message) PCPP_LOG(pcpp::LogLevel::Debug, message)
424
#else
425
# define PCPP_LOG_DEBUG(message) (void)0
426
#endif
427
428
#if PCPP_ACTIVE_LOG_LEVEL >= PCPP_LOG_LEVEL_WARN
429
# define PCPP_LOG_WARN(message) PCPP_LOG(pcpp::LogLevel::Warn, message)
430
#else
431
# define PCPP_LOG_WARN(message) (void)0
432
#endif
433
434
#if PCPP_ACTIVE_LOG_LEVEL >= PCPP_LOG_LEVEL_INFO
435
# define PCPP_LOG_INFO(message) PCPP_LOG(pcpp::LogLevel::Info, message)
436
#else
437
# define PCPP_LOG_INFO(message) (void)0
438
#endif
439
440
#if PCPP_ACTIVE_LOG_LEVEL >= PCPP_LOG_LEVEL_ERROR
441
148k
# define PCPP_LOG_ERROR(message) PCPP_LOG(pcpp::LogLevel::Error, message)
442
#else
443
# define PCPP_LOG_ERROR(message) (void)0
444
#endif