15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file overrides the logging macros in libjingle (talk/base/logging.h).
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead of using libjingle's logging implementation, the libjingle macros are
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mapped to the corresponding base/logging.h macro (chromium's VLOG).
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If this file is included outside of libjingle (e.g. in wrapper code) it
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should be included after base/logging.h (if any) or compiler error or
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unexpected behavior may occur (macros that have the same name in libjingle as
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in chromium will use the libjingle definition if this file is included
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// first).
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Setting the LoggingSeverity (and lower) that should be written to file should
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be done via command line by specifying the flags:
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --vmodule or --v please see base/logging.h for details on how to use them.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specifying what file to write to is done using InitLogging also in
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base/logging.h.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The macros and classes declared in here are not described as they are
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOT TO BE USED outside of libjingle.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef THIRD_PARTY_LIBJINGLE_OVERRIDES_TALK_BASE_LOGGING_H_
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define THIRD_PARTY_LIBJINGLE_OVERRIDES_TALK_BASE_LOGGING_H_
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "third_party/libjingle/source/talk/base/scoped_ref_ptr.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace talk_base {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ConstantLabel can be used to easily generate string names from constant
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// values.  This can be useful for logging descriptive names of error messages.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Usage:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   const ConstantLabel LIBRARY_ERRORS[] = {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     KLABEL(SOME_ERROR),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     KLABEL(SOME_OTHER_ERROR),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     ...
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     LASTLABEL
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   int err = LibraryFunc();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   LOG(LS_ERROR) << "LibraryFunc returned: "
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                 << ErrorName(err, LIBRARY_ERRORS);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ConstantLabel {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int value;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* label;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define KLABEL(x) { x, #x }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LASTLABEL { 0, 0 }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* FindLabel(int value, const ConstantLabel entries[]);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ErrorName(int err, const ConstantLabel* err_table);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that the non-standard LoggingSeverity aliases exist because they are
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// still in broad use.  The meanings of the levels are:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  LS_SENSITIVE: Information which should only be logged with the consent
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   of the user, due to privacy concerns.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  LS_VERBOSE: This level is for data which we do not want to appear in the
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   normal debug log, but should appear in diagnostic logs.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  LS_INFO: Chatty level used in debugging for all sorts of things, the default
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   in debug builds.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  LS_WARNING: Something that may warrant investigation.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  LS_ERROR: Something that should not have occurred.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that LoggingSeverity is mapped over to chromiums verbosity levels where
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// anything lower than or equal to the current verbosity level is written to
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file which is the opposite of logging severity in libjingle where higher
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// severity numbers than or equal to the current severity level are written to
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file. Also, note that the values are explicitly defined here for convenience
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// since the command line flag must be set using numerical values.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum LoggingSeverity { LS_ERROR = 1,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       LS_WARNING = 2,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       LS_INFO = 3,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       LS_VERBOSE = 4,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       LS_SENSITIVE = 5,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       INFO = LS_INFO,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       WARNING = LS_WARNING,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       LERROR = LS_ERROR };
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LogErrorContext assists in interpreting the meaning of an error value.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum LogErrorContext {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ERRCTX_NONE,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ERRCTX_ERRNO,     // System-local errno
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ERRCTX_HRESULT,   // Windows HRESULT
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ERRCTX_OSSTATUS,  // MacOS OSStatus
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Abbreviations for LOG_E macro
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ERRCTX_EN = ERRCTX_ERRNO,     // LOG_E(sev, EN, x)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ERRCTX_HR = ERRCTX_HRESULT,   // LOG_E(sev, HR, x)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ERRCTX_OS = ERRCTX_OSSTATUS,  // LOG_E(sev, OS, x)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Class that writes a log message to the logging delegate ("WebRTC logging
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// stream" in Chrome) and to Chrome's logging stream.
100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class DiagnosticLogMessage {
101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public:
102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DiagnosticLogMessage(const char* file, int line, LoggingSeverity severity,
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       bool log_to_chrome, LogErrorContext err_ctx, int err);
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DiagnosticLogMessage(const char* file, int line, LoggingSeverity severity,
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       bool log_to_chrome, LogErrorContext err_ctx, int err,
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       const char* module);
107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ~DiagnosticLogMessage();
108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CreateTimestamp();
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::ostream& stream() { return print_stream_; }
112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private:
114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const char* file_name_;
115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const int line_;
116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const LoggingSeverity severity_;
117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const bool log_to_chrome_;
118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string extra_;
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::ostringstream print_stream_;
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::ostringstream print_stream_with_timestamp_;
123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is used to explicitly ignore values in the conditional
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// logging macros.  This avoids compiler warnings like "value computed
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is not used" and "statement has no effect".
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LogMessageVoidify {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LogMessageVoidify() { }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This has to be an operator with a precedence lower than << but
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // higher than ?:
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void operator&(std::ostream&) { }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Logging Helpers
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LogMultilineState {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t unprintable_count_[2];
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LogMultilineState() {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unprintable_count_[0] = unprintable_count_[1] = 0;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When possible, pass optional state variable to track various data across
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multiple calls to LogMultiline.  Otherwise, pass NULL.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LogMultiline(LoggingSeverity level, const char* label, bool input,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const void* data, size_t len, bool hex_mode,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  LogMultilineState* state);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InitDiagnosticLoggingDelegateFunction(
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    void (*delegate)(const std::string&));
156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace talk_base
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Libjingle macros which are mapped over to their VLOG equivalent in
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base/logging.h
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LOGGING_INSIDE_LIBJINGLE)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define DIAGNOSTIC_LOG(sev, ctx, err, ...) \
167b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  talk_base::DiagnosticLogMessage( \
1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      __FILE__, __LINE__, sev, VLOG_IS_ON(sev), \
1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      talk_base::ERRCTX_ ## ctx, err, ##__VA_ARGS__).stream()
170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_CHECK_LEVEL(sev) VLOG_IS_ON(talk_base::sev)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_CHECK_LEVEL_V(sev) VLOG_IS_ON(sev)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define LOG_V(sev) DIAGNOSTIC_LOG(sev, NONE, 0)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef LOG
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define LOG(sev) DIAGNOSTIC_LOG(talk_base::sev, NONE, 0)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The _F version prefixes the message with the current function name.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__) && defined(_DEBUG)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_F(sev) LOG(sev) << __PRETTY_FUNCTION__ << ": "
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_F(sev) LOG(sev) << __FUNCTION__ << ": "
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_E(sev, ctx, err, ...) \
1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DIAGNOSTIC_LOG(talk_base::sev, ctx, err, ##__VA_ARGS__)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef LOG_ERRNO_EX
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_ERRNO_EX(sev, err) LOG_E(sev, ERRNO, err)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef LOG_ERRNO
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_ERRNO(sev) LOG_ERRNO_EX(sev, errno)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_GLE_EX(sev, err) LOG_E(sev, HRESULT, err)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_GLE(sev) LOG_GLE_EX(sev, GetLastError())
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_GLEM(sev, mod) LOG_E(sev, HRESULT, GetLastError(), mod)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_ERR_EX(sev, err) LOG_GLE_EX(sev, err)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_ERR(sev) LOG_GLE(sev)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LAST_SYSTEM_ERROR (::GetLastError())
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_ERR_EX(sev, err) LOG_ERRNO_EX(sev, err)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LOG_ERR(sev) LOG_ERRNO(sev)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LAST_SYSTEM_ERROR (errno)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_WIN
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLOG
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PLOG(sev, err) LOG_ERR_EX(sev, err)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // LOGGING_INSIDE_LIBJINGLE
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // THIRD_PARTY_LIBJINGLE_OVERRIDES_TALK_BASE_LOGGING_H_
212