147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2012 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// This file overrides the logging macros in libjingle (webrtc/base/logging.h).
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Instead of using libjingle's logging implementation, the libjingle macros are
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// mapped to the corresponding base/logging.h macro (chromium's VLOG).
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// If this file is included outside of libjingle (e.g. in wrapper code) it
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// should be included after base/logging.h (if any) or compiler error or
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// unexpected behavior may occur (macros that have the same name in libjingle as
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// in chromium will use the libjingle definition if this file is included
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// first).
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Setting the LoggingSeverity (and lower) that should be written to file should
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// be done via command line by specifying the flags:
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// --vmodule or --v please see base/logging.h for details on how to use them.
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Specifying what file to write to is done using InitLogging also in
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// base/logging.h.
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The macros and classes declared in here are not described as they are
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// NOT TO BE USED outside of libjingle.
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef THIRD_PARTY_LIBJINGLE_OVERRIDES_WEBRTC_BASE_LOGGING_H_
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define THIRD_PARTY_LIBJINGLE_OVERRIDES_WEBRTC_BASE_LOGGING_H_
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <sstream>
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <string>
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "base/logging.h"
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "third_party/webrtc/base/scoped_ref_ptr.h"
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// ConstantLabel can be used to easily generate string names from constant
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// values.  This can be useful for logging descriptive names of error messages.
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Usage:
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   const ConstantLabel LIBRARY_ERRORS[] = {
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     KLABEL(SOME_ERROR),
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     KLABEL(SOME_OTHER_ERROR),
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     ...
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//     LASTLABEL
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   }
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   int err = LibraryFunc();
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   LOG(LS_ERROR) << "LibraryFunc returned: "
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//                 << ErrorName(err, LIBRARY_ERRORS);
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstruct ConstantLabel {
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int value;
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  const char* label;
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define KLABEL(x) { x, #x }
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LASTLABEL { 0, 0 }
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst char* FindLabel(int value, const ConstantLabel entries[]);
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstd::string ErrorName(int err, const ConstantLabel* err_table);
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//////////////////////////////////////////////////////////////////////
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Note that the non-standard LoggingSeverity aliases exist because they are
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// still in broad use.  The meanings of the levels are:
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//  LS_SENSITIVE: Information which should only be logged with the consent
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   of the user, due to privacy concerns.
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//  LS_VERBOSE: This level is for data which we do not want to appear in the
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   normal debug log, but should appear in diagnostic logs.
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//  LS_INFO: Chatty level used in debugging for all sorts of things, the default
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   in debug builds.
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//  LS_WARNING: Something that may warrant investigation.
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//  LS_ERROR: Something that should not have occurred.
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Note that LoggingSeverity is mapped over to chromiums verbosity levels where
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// anything lower than or equal to the current verbosity level is written to
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// file which is the opposite of logging severity in libjingle where higher
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// severity numbers than or equal to the current severity level are written to
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// file. Also, note that the values are explicitly defined here for convenience
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// since the command line flag must be set using numerical values.
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgenum LoggingSeverity { LS_ERROR = 1,
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       LS_WARNING = 2,
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       LS_INFO = 3,
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       LS_VERBOSE = 4,
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       LS_SENSITIVE = 5,
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       INFO = LS_INFO,
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       WARNING = LS_WARNING,
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       LERROR = LS_ERROR };
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// LogErrorContext assists in interpreting the meaning of an error value.
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgenum LogErrorContext {
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ERRCTX_NONE,
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ERRCTX_ERRNO,     // System-local errno
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ERRCTX_HRESULT,   // Windows HRESULT
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ERRCTX_OSSTATUS,  // MacOS OSStatus
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Abbreviations for LOG_E macro
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ERRCTX_EN = ERRCTX_ERRNO,     // LOG_E(sev, EN, x)
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ERRCTX_HR = ERRCTX_HRESULT,   // LOG_E(sev, HR, x)
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ERRCTX_OS = ERRCTX_OSSTATUS,  // LOG_E(sev, OS, x)
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Class that writes a log message to the logging delegate ("WebRTC logging
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// stream" in Chrome) and to Chrome's logging stream.
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass DiagnosticLogMessage {
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DiagnosticLogMessage(const char* file, int line, LoggingSeverity severity,
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       bool log_to_chrome, LogErrorContext err_ctx, int err);
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DiagnosticLogMessage(const char* file, int line, LoggingSeverity severity,
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       bool log_to_chrome, LogErrorContext err_ctx, int err,
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                       const char* module);
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ~DiagnosticLogMessage();
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void CreateTimestamp();
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  std::ostream& stream() { return print_stream_; }
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private:
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  const char* file_name_;
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  const int line_;
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  const LoggingSeverity severity_;
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  const bool log_to_chrome_;
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  std::string extra_;
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  std::ostringstream print_stream_;
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// This class is used to explicitly ignore values in the conditional
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// logging macros.  This avoids compiler warnings like "value computed
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// is not used" and "statement has no effect".
13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass LogMessageVoidify {
13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  LogMessageVoidify() { }
13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // This has to be an operator with a precedence lower than << but
13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // higher than ?:
13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void operator&(std::ostream&) { }
13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//////////////////////////////////////////////////////////////////////
14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Logging Helpers
14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//////////////////////////////////////////////////////////////////////
14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass LogMultilineState {
14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  size_t unprintable_count_[2];
14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  LogMultilineState() {
14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    unprintable_count_[0] = unprintable_count_[1] = 0;
15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
153cd27c3bdf4f9a3feedfa785211bfb81fb9ffc54fglaznev@webrtc.orgclass LogMessage {
154cd27c3bdf4f9a3feedfa785211bfb81fb9ffc54fglaznev@webrtc.org public:
155cd27c3bdf4f9a3feedfa785211bfb81fb9ffc54fglaznev@webrtc.org  static void LogToDebug(int min_sev);
156cd27c3bdf4f9a3feedfa785211bfb81fb9ffc54fglaznev@webrtc.org};
157cd27c3bdf4f9a3feedfa785211bfb81fb9ffc54fglaznev@webrtc.org
15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// When possible, pass optional state variable to track various data across
15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// multiple calls to LogMultiline.  Otherwise, pass NULL.
16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid LogMultiline(LoggingSeverity level, const char* label, bool input,
16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                  const void* data, size_t len, bool hex_mode,
16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                  LogMultilineState* state);
16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// TODO(grunell): Change name to InitDiagnosticLoggingDelegate or
16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// InitDiagnosticLogging. Change also in init_webrtc.h/cc.
16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// TODO(grunell): typedef the delegate function.
16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid InitDiagnosticLoggingDelegateFunction(
16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void (*delegate)(const std::string&));
16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid SetExtraLoggingInit(
17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    void (*function)(void (*delegate)(const std::string&)));
17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//////////////////////////////////////////////////////////////////////
17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Libjingle macros which are mapped over to their VLOG equivalent in
17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// base/logging.h
17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//////////////////////////////////////////////////////////////////////
17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(LOGGING_INSIDE_WEBRTC)
18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define DIAGNOSTIC_LOG(sev, ctx, err, ...) \
18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rtc::DiagnosticLogMessage( \
18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      __FILE__, __LINE__, sev, VLOG_IS_ON(sev), \
18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      rtc::ERRCTX_ ## ctx, err, ##__VA_ARGS__).stream()
18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_CHECK_LEVEL(sev) VLOG_IS_ON(rtc::sev)
18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_CHECK_LEVEL_V(sev) VLOG_IS_ON(sev)
18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_V(sev) DIAGNOSTIC_LOG(sev, NONE, 0)
19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef LOG
19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG(sev) DIAGNOSTIC_LOG(rtc::sev, NONE, 0)
19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The _F version prefixes the message with the current function name.
19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(__GNUC__) && defined(_DEBUG)
19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_F(sev) LOG(sev) << __PRETTY_FUNCTION__ << ": "
19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else
19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_F(sev) LOG(sev) << __FUNCTION__ << ": "
19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_E(sev, ctx, err, ...) \
20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DIAGNOSTIC_LOG(rtc::sev, ctx, err, ##__VA_ARGS__)
20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef LOG_ERRNO_EX
20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERRNO_EX(sev, err) LOG_E(sev, ERRNO, err)
20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef LOG_ERRNO
20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERRNO(sev) LOG_ERRNO_EX(sev, errno)
20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN)
20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_GLE_EX(sev, err) LOG_E(sev, HRESULT, err)
21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_GLE(sev) LOG_GLE_EX(sev, GetLastError())
21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_GLEM(sev, mod) LOG_E(sev, HRESULT, GetLastError(), mod)
21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR_EX(sev, err) LOG_GLE_EX(sev, err)
21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR(sev) LOG_GLE(sev)
21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LAST_SYSTEM_ERROR (::GetLastError())
21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else
21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR_EX(sev, err) LOG_ERRNO_EX(sev, err)
21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LOG_ERR(sev) LOG_ERRNO(sev)
21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define LAST_SYSTEM_ERROR (errno)
21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // OS_WIN
22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#undef PLOG
22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define PLOG(sev, err) LOG_ERR_EX(sev, err)
22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // LOGGING_INSIDE_WEBRTC
22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // THIRD_PARTY_LIBJINGLE_OVERRIDES_WEBRTC_BASE_LOGGING_H_
227