OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 // This is a highly stripped-down version of libjingle's talk/base/logging.h. | |
12 // It is a thin wrapper around WEBRTC_TRACE, maintaining the libjingle log | |
13 // semantics to ease a transition to that format. | |
14 | |
15 // NOTE: LS_INFO maps to a new trace level which should be reserved for | |
16 // infrequent, non-verbose logs. The other levels below kTraceWarning have been | |
17 // rendered essentially useless due to their verbosity. Carefully consider the | |
18 // impact of adding a new LS_INFO log. If it will be logged at anything | |
19 // approaching a frame or packet frequency, use LS_VERBOSE if necessary, or | |
20 // preferably, do not log at all. | |
21 | |
22 // LOG(...) an ostream target that can be used to send formatted | |
23 // output to a variety of logging targets, such as debugger console, stderr, | |
24 // file, or any StreamInterface. | |
25 // The severity level passed as the first argument to the LOGging | |
26 // functions is used as a filter, to limit the verbosity of the logging. | |
27 // Static members of LogMessage documented below are used to control the | |
28 // verbosity and target of the output. | |
29 // There are several variations on the LOG macro which facilitate logging | |
30 // of common error conditions, detailed below. | |
31 | |
32 // LOG(sev) logs the given stream at severity "sev", which must be a | |
33 // compile-time constant of the LoggingSeverity type, without the namespace | |
34 // prefix. | |
35 // LOG_V(sev) Like LOG(), but sev is a run-time variable of the LoggingSeverity | |
36 // type (basically, it just doesn't prepend the namespace). | |
37 // LOG_F(sev) Like LOG(), but includes the name of the current function. | |
38 | |
39 #ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_LOGGING_H_ | |
40 #define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_LOGGING_H_ | |
41 | |
42 #include <sstream> | |
43 | |
44 namespace webrtc { | |
45 | |
46 ////////////////////////////////////////////////////////////////////// | |
47 | |
48 // Note that the non-standard LoggingSeverity aliases exist because they are | |
49 // still in broad use. The meanings of the levels are: | |
50 // LS_SENSITIVE: Information which should only be logged with the consent | |
51 // of the user, due to privacy concerns. | |
52 // LS_VERBOSE: This level is for data which we do not want to appear in the | |
53 // normal debug log, but should appear in diagnostic logs. | |
54 // LS_INFO: Chatty level used in debugging for all sorts of things, the default | |
55 // in debug builds. | |
56 // LS_WARNING: Something that may warrant investigation. | |
57 // LS_ERROR: Something that should not have occurred. | |
58 enum LoggingSeverity { | |
59 LS_SENSITIVE, LS_VERBOSE, LS_INFO, LS_WARNING, LS_ERROR | |
60 }; | |
61 | |
62 class LogMessage { | |
63 public: | |
64 LogMessage(const char* file, int line, LoggingSeverity sev); | |
65 ~LogMessage(); | |
66 | |
67 static bool Loggable(LoggingSeverity sev); | |
68 std::ostream& stream() { return print_stream_; } | |
69 | |
70 private: | |
71 // The ostream that buffers the formatted message before output | |
72 std::ostringstream print_stream_; | |
73 | |
74 // The severity level of this message | |
75 LoggingSeverity severity_; | |
76 }; | |
77 | |
78 ////////////////////////////////////////////////////////////////////// | |
79 // Macros which automatically disable logging when WEBRTC_LOGGING == 0 | |
80 ////////////////////////////////////////////////////////////////////// | |
81 | |
82 #ifndef LOG | |
83 // The following non-obvious technique for implementation of a | |
84 // conditional log stream was stolen from google3/base/logging.h. | |
85 | |
86 // This class is used to explicitly ignore values in the conditional | |
87 // logging macros. This avoids compiler warnings like "value computed | |
88 // is not used" and "statement has no effect". | |
89 | |
90 class LogMessageVoidify { | |
91 public: | |
92 LogMessageVoidify() { } | |
93 // This has to be an operator with a precedence lower than << but | |
94 // higher than ?: | |
95 void operator&(std::ostream&) { } | |
96 }; | |
97 | |
98 #if defined(WEBRTC_RESTRICT_LOGGING) | |
99 // This should compile away logs matching the following condition. | |
100 #define RESTRICT_LOGGING_PRECONDITION(sev) \ | |
101 sev < webrtc::LS_INFO ? (void) 0 : | |
102 #else | |
103 #define RESTRICT_LOGGING_PRECONDITION(sev) | |
104 #endif | |
105 | |
106 #define LOG_SEVERITY_PRECONDITION(sev) \ | |
107 RESTRICT_LOGGING_PRECONDITION(sev) !(webrtc::LogMessage::Loggable(sev)) \ | |
108 ? (void) 0 \ | |
109 : webrtc::LogMessageVoidify() & | |
110 | |
111 #define LOG(sev) \ | |
112 LOG_SEVERITY_PRECONDITION(webrtc::sev) \ | |
113 webrtc::LogMessage(__FILE__, __LINE__, webrtc::sev).stream() | |
114 | |
115 // The _V version is for when a variable is passed in. It doesn't do the | |
116 // namespace concatination. | |
117 #define LOG_V(sev) \ | |
118 LOG_SEVERITY_PRECONDITION(sev) \ | |
119 webrtc::LogMessage(__FILE__, __LINE__, sev).stream() | |
120 | |
121 // The _F version prefixes the message with the current function name. | |
122 #if (defined(__GNUC__) && !defined(NDEBUG)) || defined(WANT_PRETTY_LOG_F) | |
123 #define LOG_F(sev) LOG(sev) << __PRETTY_FUNCTION__ << ": " | |
124 #else | |
125 #define LOG_F(sev) LOG(sev) << __FUNCTION__ << ": " | |
126 #endif | |
127 | |
128 #endif // LOG | |
129 | |
130 } // namespace webrtc | |
131 | |
132 #endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_LOGGING_H_ | |
OLD | NEW |