1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef LOGGER_LEVEL_IMPL_H
#define LOGGER_LEVEL_IMPL_H
#include <log4cplus/logger.h>
#include <log4cplus/version.h>
#include <log/logger_level.h>
namespace isc {
namespace log {
/// \brief Implementation aspects of logging levels
///
/// This extends the log4cplus level set to allow 100 debug levels.
///
/// First some terminology, as the use of the term "level" gets confusing. The
/// code and comments here use the term "level" in two contexts:
///
/// Logging level: The category of messages to log. By default log4cplus
/// defines the following logging levels: OFF_LOG_LEVEL, FATAL_LOG_LEVEL,
/// ERROR_LOG_LEVEL, WARN_LOG_LEVEL, INFO_LOG_LEVEL, DEBUG_LOG_LEVEL,
/// TRACE_LOG_LEVEL, ALL_LOG_LEVEL (which here will be abbreviated OFF, FATAL
/// etc.). Within the context of Kea, OFF, TRACE and ALL are not used
/// and the idea of DEBUG has been extended, as will be seen below. In
/// Kea terms, this is known as "severity"; the "logging level" usage will
/// usually be used when talking about log4cplus aspects of the idea (as
/// log4cplus uses that terminology).
///
/// Debug level: This is a number that ranges from 0 to 99 and is used by the
/// application to control the detail of debug output. A value of 0 gives the
/// highest-level debug output; a value of 99 gives the most verbose and most
/// detailed. Debug messages (or whatever debug level) are only ever output
/// when the logging level is set to DEBUG. (Note that the numbers 0 and 99
/// are not hard-coded - they are the constants MIN_DEBUG_LEVEL and
/// MAX_DEBUG_LEVEL.)
///
/// With log4cplus, the various logging levels have a numeric value associated
/// with them, such that FATAL > ERROR > WARNING etc. This suggests that the
/// idea of debug levels can be incorporated into the existing logging level
/// scheme by assigning them appropriate numeric values, i.e.
///
/// WARNING > INFO > DEBUG > DEBUG - 1 > DEBUG - 2 > ... > DEBUG - 99
///
/// Setting a numeric level of DEBUG enables the basic messages; setting higher
/// debug levels (corresponding to lower numeric logging levels) will enable
/// progressively more messages. The lowest debug level (0) is chosen such that
/// it corresponds to the default level of DEBUG.
///
/// This class comprises nothing more than static methods to aid the conversion
/// of logging levels between log4cplus and Kea, and to register those
/// levels with log4cplus.
class LoggerLevelImpl {
public:
typedef log4cplus::tstring LogLevelString;
/// \brief Convert Kea level to log4cplus logging level
///
/// Converts the Kea severity level into a log4cplus logging level.
/// If the severity is DEBUG, the current Kea debug level is taken
/// into account when doing the conversion.
///
/// \param level Kea severity and debug level
///
/// \return Equivalent log4cplus logging level.
static
log4cplus::LogLevel convertFromBindLevel(const isc::log::Level& level);
/// \brief Convert log4cplus logging level to Kea logging level
///
/// Converts the log4cplus log level into a Kea severity level.
/// The log4cplus log level may be non-standard in which case it is
/// encoding a Kea debug level as well.
///
/// \param loglevel log4cplus log level
///
/// \return Equivalent Kea severity and debug level
static
isc::log::Level convertToBindLevel(const log4cplus::LogLevel loglevel);
/// \brief Convert string to log4cplus logging level
///
/// Kea extends the set of logging levels in log4cplus with a group
/// of debug levels. These are given names DEBUG0 through DEBUG99 (with
/// DEBUG0 being equivalent to DEBUG, the standard log level. If the name
/// is DEBUGn but n lies outside the range of debug levels, debug level
/// specifies is coerced to the nearest valid value. If the string is just
/// not recognized, a NOT_SET_LOG_LEVEL is returned.
///
/// \param level String representing the logging level.
///
/// \return Corresponding log4cplus log level
static
log4cplus::LogLevel logLevelFromString(const log4cplus::tstring& level);
/// \brief Convert log level to string
///
/// If the log level is one of the extended debug levels, the string DEBUG
/// is returned, otherwise the empty string.
///
/// \param level Extended logging level
///
/// \return Equivalent string.
#if LOG4CPLUS_VERSION < LOG4CPLUS_MAKE_VERSION(2, 0, 0)
static LogLevelString logLevelToString(log4cplus::LogLevel level);
#else
static const LogLevelString& logLevelToString(log4cplus::LogLevel level);
#endif
/// \brief Initialize extended logging levels
///
/// This must be called once, after log4cplus has been initialized. It
/// registers the level/string converter functions.
static void init();
};
} // namespace log
} // namespace isc
#endif // LOGGER_LEVEL_IMPL_H
|