1 // 2 // Copyright (C) 2012 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #ifndef SHILL_LOGGING_H_ 18 #define SHILL_LOGGING_H_ 19 20 #include <base/logging.h> 21 22 #include "shill/scope_logger.h" 23 24 // How to use: 25 // 26 // The SLOG macro and its variants are similar to the VLOG macros 27 // defined in base/logging.h, except that the SLOG macros take an additional 28 // |scope| argument to enable logging only if |scope| is enabled. 29 // 30 // Like VLOG, SLOG macros internally map verbosity to LOG severity using 31 // negative values, i.e. SLOG(scope, 1) corresponds to LOG(-1). 32 // 33 // Example usages: 34 // SLOG(Service, 1) << "Printed when the 'service' scope is enabled and " 35 // "the verbose level is greater than or equal to 1"; 36 // 37 // SLOG_IF(Service, 1, (size > 1024)) 38 // << "Printed when the 'service' scope is enabled, the verbose level " 39 // "is greater than or equal to 1, and size is more than 1024"; 40 // 41 42 #define GET_MACRO_OVERLOAD2(arg1, arg2, arg3, macro_name, ...) macro_name 43 44 #define SLOG_IS_ON(scope, verbose_level) \ 45 ::shill::ScopeLogger::GetInstance()->IsLogEnabled( \ 46 ::shill::ScopeLogger::k##scope, verbose_level) 47 48 #define SLOG_STREAM(verbose_level) \ 49 ::logging::LogMessage(__FILE__, __LINE__, -verbose_level).stream() 50 51 #define SLOG_2ARG(object, verbose_level) \ 52 LAZY_STREAM(SLOG_STREAM(verbose_level), \ 53 ::shill::ScopeLogger::GetInstance()->IsLogEnabled( \ 54 Logging::kModuleLogScope, verbose_level)) \ 55 << (object ? Logging::ObjectID(object) : "(anon)") << " " 56 57 #define SLOG_3ARG(scope, object, verbose_level) \ 58 LAZY_STREAM(SLOG_STREAM(verbose_level), \ 59 ::shill::ScopeLogger::GetInstance()->IsLogEnabled( \ 60 ::shill::ScopeLogger::k##scope, verbose_level)) \ 61 << (object ? Logging::ObjectID(object) : "(anon)") << " " 62 63 #define SLOG(...) \ 64 GET_MACRO_OVERLOAD2(__VA_ARGS__, SLOG_3ARG, SLOG_2ARG)(__VA_ARGS__) 65 66 #define SLOG_IF(scope, verbose_level, condition) \ 67 LAZY_STREAM(SLOG_STREAM(verbose_level), \ 68 SLOG_IS_ON(scope, verbose_level) && (condition)) 69 70 #define SPLOG_STREAM(verbose_level) \ 71 ::logging::ErrnoLogMessage(__FILE__, __LINE__, -verbose_level, \ 72 ::logging::GetLastSystemErrorCode()).stream() 73 74 #define SPLOG(scope, verbose_level) \ 75 LAZY_STREAM(SPLOG_STREAM(verbose_level), SLOG_IS_ON(scope, verbose_level)) 76 77 #define SPLOG_IF(scope, verbose_level, condition) \ 78 LAZY_STREAM(SPLOG_STREAM(verbose_level), \ 79 SLOG_IS_ON(scope, verbose_level) && (condition)) 80 81 namespace base { 82 83 class CommandLine; 84 85 } // namespace base 86 87 namespace shill { 88 89 namespace switches { 90 91 // Command line switches used to setup logging. 92 // Clients may use this to display useful help messages. 93 94 // Logging level: 95 // 0 = LOG(INFO), 1 = LOG(WARNING), 2 = LOG(ERROR), 96 // -1 = SLOG(..., 1), -2 = SLOG(..., 2), etc. 97 extern const char kLogLevel[]; 98 // Scopes to enable for SLOG()-based logging. 99 extern const char kLogScopes[]; 100 101 } // namespace switches 102 103 // Looks for the command line switches |kLogLevelSwitch| and |kLogScopesSwitch| 104 // in |cl| and accordingly sets log scopes and levels. 105 void SetLogLevelFromCommandLine(base::CommandLine* cl); 106 107 } // namespace shill 108 109 #endif // SHILL_LOGGING_H_ 110