133 lines
5.0 KiB
C
133 lines
5.0 KiB
C
|
/*
|
||
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
||
|
*
|
||
|
* Use of this source code is governed by a BSD-style license
|
||
|
* that can be found in the LICENSE file in the root of the source
|
||
|
* tree. An additional intellectual property rights grant can be found
|
||
|
* in the file PATENTS. All contributing project authors may
|
||
|
* be found in the AUTHORS file in the root of the source tree.
|
||
|
*/
|
||
|
|
||
|
// This is a highly stripped-down version of libjingle's talk/base/logging.h.
|
||
|
// It is a thin wrapper around WEBRTC_TRACE, maintaining the libjingle log
|
||
|
// semantics to ease a transition to that format.
|
||
|
|
||
|
// NOTE: LS_INFO maps to a new trace level which should be reserved for
|
||
|
// infrequent, non-verbose logs. The other levels below kTraceWarning have been
|
||
|
// rendered essentially useless due to their verbosity. Carefully consider the
|
||
|
// impact of adding a new LS_INFO log. If it will be logged at anything
|
||
|
// approaching a frame or packet frequency, use LS_VERBOSE if necessary, or
|
||
|
// preferably, do not log at all.
|
||
|
|
||
|
// LOG(...) an ostream target that can be used to send formatted
|
||
|
// output to a variety of logging targets, such as debugger console, stderr,
|
||
|
// file, or any StreamInterface.
|
||
|
// The severity level passed as the first argument to the LOGging
|
||
|
// functions is used as a filter, to limit the verbosity of the logging.
|
||
|
// Static members of LogMessage documented below are used to control the
|
||
|
// verbosity and target of the output.
|
||
|
// There are several variations on the LOG macro which facilitate logging
|
||
|
// of common error conditions, detailed below.
|
||
|
|
||
|
// LOG(sev) logs the given stream at severity "sev", which must be a
|
||
|
// compile-time constant of the LoggingSeverity type, without the namespace
|
||
|
// prefix.
|
||
|
// LOG_V(sev) Like LOG(), but sev is a run-time variable of the LoggingSeverity
|
||
|
// type (basically, it just doesn't prepend the namespace).
|
||
|
// LOG_F(sev) Like LOG(), but includes the name of the current function.
|
||
|
|
||
|
#ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_LOGGING_H_
|
||
|
#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_LOGGING_H_
|
||
|
|
||
|
#include <sstream>
|
||
|
|
||
|
namespace webrtc {
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// Note that the non-standard LoggingSeverity aliases exist because they are
|
||
|
// still in broad use. The meanings of the levels are:
|
||
|
// LS_SENSITIVE: Information which should only be logged with the consent
|
||
|
// of the user, due to privacy concerns.
|
||
|
// LS_VERBOSE: This level is for data which we do not want to appear in the
|
||
|
// normal debug log, but should appear in diagnostic logs.
|
||
|
// LS_INFO: Chatty level used in debugging for all sorts of things, the default
|
||
|
// in debug builds.
|
||
|
// LS_WARNING: Something that may warrant investigation.
|
||
|
// LS_ERROR: Something that should not have occurred.
|
||
|
enum LoggingSeverity {
|
||
|
LS_SENSITIVE, LS_VERBOSE, LS_INFO, LS_WARNING, LS_ERROR
|
||
|
};
|
||
|
|
||
|
class LogMessage {
|
||
|
public:
|
||
|
LogMessage(const char* file, int line, LoggingSeverity sev);
|
||
|
~LogMessage();
|
||
|
|
||
|
static bool Loggable(LoggingSeverity sev);
|
||
|
std::ostream& stream() { return print_stream_; }
|
||
|
|
||
|
private:
|
||
|
// The ostream that buffers the formatted message before output
|
||
|
std::ostringstream print_stream_;
|
||
|
|
||
|
// The severity level of this message
|
||
|
LoggingSeverity severity_;
|
||
|
};
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
// Macros which automatically disable logging when WEBRTC_LOGGING == 0
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifndef LOG
|
||
|
// The following non-obvious technique for implementation of a
|
||
|
// conditional log stream was stolen from google3/base/logging.h.
|
||
|
|
||
|
// This class is used to explicitly ignore values in the conditional
|
||
|
// logging macros. This avoids compiler warnings like "value computed
|
||
|
// is not used" and "statement has no effect".
|
||
|
|
||
|
class LogMessageVoidify {
|
||
|
public:
|
||
|
LogMessageVoidify() { }
|
||
|
// This has to be an operator with a precedence lower than << but
|
||
|
// higher than ?:
|
||
|
void operator&(std::ostream&) { }
|
||
|
};
|
||
|
|
||
|
#if defined(WEBRTC_RESTRICT_LOGGING)
|
||
|
// This should compile away logs matching the following condition.
|
||
|
#define RESTRICT_LOGGING_PRECONDITION(sev) \
|
||
|
sev < webrtc::LS_INFO ? (void) 0 :
|
||
|
#else
|
||
|
#define RESTRICT_LOGGING_PRECONDITION(sev)
|
||
|
#endif
|
||
|
|
||
|
#define LOG_SEVERITY_PRECONDITION(sev) \
|
||
|
RESTRICT_LOGGING_PRECONDITION(sev) !(webrtc::LogMessage::Loggable(sev)) \
|
||
|
? (void) 0 \
|
||
|
: webrtc::LogMessageVoidify() &
|
||
|
|
||
|
#define LOG(sev) \
|
||
|
LOG_SEVERITY_PRECONDITION(webrtc::sev) \
|
||
|
webrtc::LogMessage(__FILE__, __LINE__, webrtc::sev).stream()
|
||
|
|
||
|
// The _V version is for when a variable is passed in. It doesn't do the
|
||
|
// namespace concatination.
|
||
|
#define LOG_V(sev) \
|
||
|
LOG_SEVERITY_PRECONDITION(sev) \
|
||
|
webrtc::LogMessage(__FILE__, __LINE__, sev).stream()
|
||
|
|
||
|
// The _F version prefixes the message with the current function name.
|
||
|
#if (defined(__GNUC__) && !defined(NDEBUG)) || defined(WANT_PRETTY_LOG_F)
|
||
|
#define LOG_F(sev) LOG(sev) << __PRETTY_FUNCTION__ << ": "
|
||
|
#else
|
||
|
#define LOG_F(sev) LOG(sev) << __FUNCTION__ << ": "
|
||
|
#endif
|
||
|
|
||
|
#endif // LOG
|
||
|
|
||
|
} // namespace webrtc
|
||
|
|
||
|
#endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_LOGGING_H_
|