147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG(...) an ostream target that can be used to send formatted 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// output to a variety of logging targets, such as debugger console, stderr, 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// file, or any StreamInterface. 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The severity level passed as the first argument to the LOGging 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// functions is used as a filter, to limit the verbosity of the logging. 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Static members of LogMessage documented below are used to control the 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// verbosity and target of the output. 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// There are several variations on the LOG macro which facilitate logging 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// of common error conditions, detailed below. 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG(sev) logs the given stream at severity "sev", which must be a 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// compile-time constant of the LoggingSeverity type, without the namespace 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// prefix. 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG_V(sev) Like LOG(), but sev is a run-time variable of the LoggingSeverity 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// type (basically, it just doesn't prepend the namespace). 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG_F(sev) Like LOG(), but includes the name of the current function. 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG_T(sev) Like LOG(), but includes the this pointer. 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG_T_F(sev) Like LOG_F(), but includes the this pointer. 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG_GLE(M)(sev [, mod]) attempt to add a string description of the 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// HRESULT returned by GetLastError. The "M" variant allows searching of a 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// DLL's string table for the error description. 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG_ERRNO(sev) attempts to add a string description of an errno-derived 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// error. errno and associated facilities exist on both Windows and POSIX, 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// but on Windows they only apply to the C/C++ runtime. 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG_ERR(sev) is an alias for the platform's normal error system, i.e. _GLE on 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Windows and _ERRNO on POSIX. 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// (The above three also all have _EX versions that let you specify the error 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// code, rather than using the last one.) 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG_E(sev, ctx, err, ...) logs a detailed error interpreted using the 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// specified context. 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG_CHECK_LEVEL(sev) (and LOG_CHECK_LEVEL_V(sev)) can be used as a test 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// before performing expensive or sensitive operations whose sole purpose is 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// to output logging data at the desired level. 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Lastly, PLOG(sev, err) is an alias for LOG_ERR_EX. 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_LOGGING_H_ 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_LOGGING_H_ 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef HAVE_CONFIG_H 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "config.h" // NOLINT 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <list> 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <sstream> 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <string> 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <utility> 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/basictypes.h" 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/criticalsection.h" 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass StreamInterface; 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// ConstantLabel can be used to easily generate string names from constant 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// values. This can be useful for logging descriptive names of error messages. 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Usage: 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// const ConstantLabel LIBRARY_ERRORS[] = { 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// KLABEL(SOME_ERROR), 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// KLABEL(SOME_OTHER_ERROR), 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// ... 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LASTLABEL 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// } 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// int err = LibraryFunc(); 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LOG(LS_ERROR) << "LibraryFunc returned: " 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// << ErrorName(err, LIBRARY_ERRORS); 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstruct ConstantLabel { int value; const char * label; }; 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define KLABEL(x) { x, #x } 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define TLABEL(x, y) { x, y } 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LASTLABEL { 0, 0 } 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst char * FindLabel(int value, const ConstantLabel entries[]); 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstd::string ErrorName(int err, const ConstantLabel* err_table); 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org////////////////////////////////////////////////////////////////////// 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Note that the non-standard LoggingSeverity aliases exist because they are 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// still in broad use. The meanings of the levels are: 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LS_SENSITIVE: Information which should only be logged with the consent 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// of the user, due to privacy concerns. 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LS_VERBOSE: This level is for data which we do not want to appear in the 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// normal debug log, but should appear in diagnostic logs. 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LS_INFO: Chatty level used in debugging for all sorts of things, the default 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// in debug builds. 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LS_WARNING: Something that may warrant investigation. 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LS_ERROR: Something that should not have occurred. 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgenum LoggingSeverity { LS_SENSITIVE, LS_VERBOSE, LS_INFO, LS_WARNING, LS_ERROR, 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org INFO = LS_INFO, 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WARNING = LS_WARNING, 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LERROR = LS_ERROR }; 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LogErrorContext assists in interpreting the meaning of an error value. 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgenum LogErrorContext { 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ERRCTX_NONE, 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ERRCTX_ERRNO, // System-local errno 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ERRCTX_HRESULT, // Windows HRESULT 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ERRCTX_OSSTATUS, // MacOS OSStatus 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Abbreviations for LOG_E macro 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ERRCTX_EN = ERRCTX_ERRNO, // LOG_E(sev, EN, x) 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ERRCTX_HR = ERRCTX_HRESULT, // LOG_E(sev, HR, x) 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ERRCTX_OS = ERRCTX_OSSTATUS, // LOG_E(sev, OS, x) 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass LogMessage { 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static const int NO_LOGGING; 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static const uint32 WARN_SLOW_LOGS_DELAY = 50; // ms 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LogMessage(const char* file, int line, LoggingSeverity sev, 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LogErrorContext err_ctx = ERRCTX_NONE, int err = 0, 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const char* module = NULL); 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ~LogMessage(); 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static inline bool Loggable(LoggingSeverity sev) { return (sev >= min_sev_); } 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::ostream& stream() { return print_stream_; } 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the time at which this function was called for the first time. 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The time will be used as the logging start time. 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // If this is not called externally, the LogMessage ctor also calls it, in 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // which case the logging start time will be the time of the first LogMessage 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // instance is created. 13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static uint32 LogStartTime(); 13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the wall clock equivalent of |LogStartTime|, in seconds from the 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // epoch. 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static uint32 WallClockStartTime(); 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // These are attributes which apply to all logging channels 14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // LogContext: Display the file and line number of the message 14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void LogContext(int min_sev); 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // LogThreads: Display the thread identifier of the current thread 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void LogThreads(bool on = true); 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // LogTimestamps: Display the elapsed time of the program 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void LogTimestamps(bool on = true); 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // These are the available logging channels 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Debug: Debug console on Windows, otherwise stderr 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void LogToDebug(int min_sev); 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static int GetLogToDebug() { return dbg_sev_; } 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Stream: Any non-blocking stream interface. LogMessage takes ownership of 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // the stream. Multiple streams may be specified by using AddLogToStream. 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // LogToStream is retained for backwards compatibility; when invoked, it 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // will discard any previously set streams and install the specified stream. 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // GetLogToStream gets the severity for the specified stream, of if none 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // is specified, the minimum stream severity. 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // RemoveLogToStream removes the specified stream, without destroying it. 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void LogToStream(StreamInterface* stream, int min_sev); 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static int GetLogToStream(StreamInterface* stream = NULL); 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void AddLogToStream(StreamInterface* stream, int min_sev); 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void RemoveLogToStream(StreamInterface* stream); 16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Testing against MinLogSeverity allows code to avoid potentially expensive 16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // logging operations by pre-checking the logging level. 16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static int GetMinLogSeverity() { return min_sev_; } 16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void SetDiagnosticMode(bool f) { is_diagnostic_mode_ = f; } 17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static bool IsDiagnosticMode() { return is_diagnostic_mode_; } 17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Parses the provided parameter stream to configure the options above. 17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Useful for configuring logging from the command line. If file logging 17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // is enabled, it is output to the specified filename. 17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void ConfigureLogging(const char* params, const char* filename); 17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Convert the string to a LS_ value; also accept numeric values. 17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static int ParseLogSeverity(const std::string& value); 18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::list<std::pair<StreamInterface*, int> > StreamList; 18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Updates min_sev_ appropriately when debug sinks change. 18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void UpdateMinLogSeverity(); 18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // These assist in formatting some parts of the debug output. 18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static const char* Describe(LoggingSeverity sev); 18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static const char* DescribeFile(const char* file); 19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // These write out the actual log messages. 19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void OutputToDebug(const std::string& msg, LoggingSeverity severity_); 19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static void OutputToStream(StreamInterface* stream, const std::string& msg); 19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The ostream that buffers the formatted message before output 19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::ostringstream print_stream_; 19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The severity level of this message 19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LoggingSeverity severity_; 20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // String data generated in the constructor, that should be appended to 20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // the message before output. 20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::string extra_; 20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // If time it takes to write to stream is more than this, log one 20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // additional warning about it. 20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org uint32 warn_slow_logs_delay_; 20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Global lock for the logging subsystem 21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static CriticalSection crit_; 21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // dbg_sev_ is the thresholds for those output targets 21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // min_sev_ is the minimum (most verbose) of those levels, and is used 21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // as a short-circuit in the logging macros to identify messages that won't 21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // be logged. 21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // ctx_sev_ is the minimum level at which file context is displayed 21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static int min_sev_, dbg_sev_, ctx_sev_; 21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The output streams and their associated severities 22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static StreamList streams_; 22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Flags for formatting options 22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static bool thread_, timestamp_; 22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // are we in diagnostic mode (as defined by the app)? 22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static bool is_diagnostic_mode_; 22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(LogMessage); 22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org////////////////////////////////////////////////////////////////////// 23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Logging Helpers 23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org////////////////////////////////////////////////////////////////////// 23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass LogMultilineState { 23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t unprintable_count_[2]; 23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LogMultilineState() { 23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org unprintable_count_[0] = unprintable_count_[1] = 0; 24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// When possible, pass optional state variable to track various data across 24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// multiple calls to LogMultiline. Otherwise, pass NULL. 24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid LogMultiline(LoggingSeverity level, const char* label, bool input, 24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const void* data, size_t len, bool hex_mode, 24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LogMultilineState* state); 24847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef LOG 25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The following non-obvious technique for implementation of a 25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// conditional log stream was stolen from google3/base/logging.h. 25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// This class is used to explicitly ignore values in the conditional 25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// logging macros. This avoids compiler warnings like "value computed 25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// is not used" and "statement has no effect". 25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass LogMessageVoidify { 25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 26047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LogMessageVoidify() { } 26147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // This has to be an operator with a precedence lower than << but 26247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // higher than ?: 26347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void operator&(std::ostream&) { } 26447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 26547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 26647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_SEVERITY_PRECONDITION(sev) \ 26747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org !(rtc::LogMessage::Loggable(sev)) \ 26847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ? (void) 0 \ 26947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org : rtc::LogMessageVoidify() & 27047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 27147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG(sev) \ 27247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_SEVERITY_PRECONDITION(rtc::sev) \ 27347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::LogMessage(__FILE__, __LINE__, rtc::sev).stream() 27447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 27547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The _V version is for when a variable is passed in. It doesn't do the 27647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// namespace concatination. 27747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_V(sev) \ 27847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_SEVERITY_PRECONDITION(sev) \ 27947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::LogMessage(__FILE__, __LINE__, sev).stream() 28047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 28147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The _F version prefixes the message with the current function name. 28247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if (defined(__GNUC__) && defined(_DEBUG)) || defined(WANT_PRETTY_LOG_F) 28347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_F(sev) LOG(sev) << __PRETTY_FUNCTION__ << ": " 28447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_T_F(sev) LOG(sev) << this << ": " << __PRETTY_FUNCTION__ << ": " 28547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else 28647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_F(sev) LOG(sev) << __FUNCTION__ << ": " 28747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_T_F(sev) LOG(sev) << this << ": " << __FUNCTION__ << ": " 28847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 28947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 29047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_CHECK_LEVEL(sev) \ 29147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::LogCheckLevel(rtc::sev) 29247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_CHECK_LEVEL_V(sev) \ 29347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::LogCheckLevel(sev) 29447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool LogCheckLevel(LoggingSeverity sev) { 29547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return (LogMessage::GetMinLogSeverity() <= sev); 29647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 29747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 29847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_E(sev, ctx, err, ...) \ 29947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_SEVERITY_PRECONDITION(rtc::sev) \ 30047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::LogMessage(__FILE__, __LINE__, rtc::sev, \ 30147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::ERRCTX_ ## ctx, err , ##__VA_ARGS__) \ 30247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org .stream() 30347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 30447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_T(sev) LOG(sev) << this << ": " 30547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 30647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERRNO_EX(sev, err) \ 30747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_E(sev, ERRNO, err) 30847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERRNO(sev) \ 30947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_ERRNO_EX(sev, errno) 31047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 31147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 31247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_GLE_EX(sev, err) \ 31347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_E(sev, HRESULT, err) 31447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_GLE(sev) \ 31547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_GLE_EX(sev, GetLastError()) 31647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_GLEM(sev, mod) \ 31747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_E(sev, HRESULT, GetLastError(), mod) 31847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR_EX(sev, err) \ 31947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_GLE_EX(sev, err) 32047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR(sev) \ 32147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_GLE(sev) 32247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LAST_SYSTEM_ERROR \ 32347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org (::GetLastError()) 32447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif __native_client__ 32547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR_EX(sev, err) \ 32647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(sev) 32747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR(sev) \ 32847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(sev) 32947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LAST_SYSTEM_ERROR \ 33047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org (0) 33147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif defined(WEBRTC_POSIX) 33247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR_EX(sev, err) \ 33347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_ERRNO_EX(sev, err) 33447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR(sev) \ 33547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_ERRNO(sev) 33647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LAST_SYSTEM_ERROR \ 33747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org (errno) 33847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_WIN 33947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 34047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define PLOG(sev, err) \ 34147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG_ERR_EX(sev, err) 34247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 34347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// TODO(?): Add an "assert" wrapper that logs in the same manner. 34447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 34547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // LOG 34647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 34747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 34847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 34947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_LOGGING_H_ 350