blob: d5c26f90deefc2306b8d8ac2a2d4c86346ad1017 [file] [log] [blame]
Ben Chanbc49ac72012-04-10 19:59:45 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SHILL_SCOPE_LOGGER_H_
6#define SHILL_SCOPE_LOGGER_H_
7
8#include <bitset>
9#include <string>
Alex Vakulenkoa41ab512014-07-23 14:24:23 -070010#include <vector>
Ben Chanbc49ac72012-04-10 19:59:45 -070011
Ben Chanbc49ac72012-04-10 19:59:45 -070012#include <base/lazy_instance.h>
Ben Chancc67c522014-09-03 07:19:18 -070013#include <base/macros.h>
Ben Chanbc49ac72012-04-10 19:59:45 -070014#include <gtest/gtest_prod.h>
15
Paul Stewart5581d072012-12-17 17:30:20 -080016#include "shill/callbacks.h"
17
Ben Chanbc49ac72012-04-10 19:59:45 -070018namespace shill {
19
20// A class that enables logging based on scope and verbose level. It is not
Christopher Wileyb691efd2012-08-09 13:51:51 -070021// intended to be used directly but via the SLOG() macros in shill/logging.h
Ben Chanbc49ac72012-04-10 19:59:45 -070022class ScopeLogger {
23 public:
24 // Logging scopes.
25 //
26 // Update kScopeNames in scope_logger.cc after changing this enumerated type.
Ben Chanfad4a0b2012-04-18 15:49:59 -070027 // These scope identifiers are sorted by their scope names alphabetically.
Ben Chanbc49ac72012-04-10 19:59:45 -070028 enum Scope {
29 kCellular = 0,
30 kConnection,
31 kCrypto,
Ben Chanfad4a0b2012-04-18 15:49:59 -070032 kDaemon,
Ben Chanbc49ac72012-04-10 19:59:45 -070033 kDBus,
34 kDevice,
Ben Chanfad4a0b2012-04-18 15:49:59 -070035 kDHCP,
36 kDNS,
Ben Chanbc49ac72012-04-10 19:59:45 -070037 kEthernet,
Ben Chanfad4a0b2012-04-18 15:49:59 -070038 kHTTP,
39 kHTTPProxy,
Ben Chanbc49ac72012-04-10 19:59:45 -070040 kInet,
Paul Stewart6c72c972012-07-27 11:29:20 -070041 kLink,
Ben Chanbc49ac72012-04-10 19:59:45 -070042 kManager,
43 kMetrics,
44 kModem,
45 kPortal,
Ben Chanfad4a0b2012-04-18 15:49:59 -070046 kPower,
mukesh agrawal9da07772013-05-15 14:15:17 -070047 kPPP,
Garret Kelly2dc218e2015-01-30 11:16:34 -050048 kPPPoE,
Ben Chanbc49ac72012-04-10 19:59:45 -070049 kProfile,
Ben Chanfad4a0b2012-04-18 15:49:59 -070050 kProperty,
51 kResolver,
52 kRoute,
Ben Chanbc49ac72012-04-10 19:59:45 -070053 kRTNL,
54 kService,
55 kStorage,
56 kTask,
57 kVPN,
58 kWiFi,
Darin Petkov096b3472012-05-15 10:26:22 +020059 kWiMax,
Ben Chanbc49ac72012-04-10 19:59:45 -070060 kNumScopes
61 };
62
Paul Stewart5581d072012-12-17 17:30:20 -080063 typedef base::Callback<void(bool)> ScopeEnableChangedCallback;
64 typedef std::vector<ScopeEnableChangedCallback>ScopeEnableChangedCallbacks;
65
Ben Chanbc49ac72012-04-10 19:59:45 -070066 // Returns a singleton of this class.
Paul Stewart1a212a62015-06-16 13:13:10 -070067 static ScopeLogger* GetInstance();
Ben Chanbc49ac72012-04-10 19:59:45 -070068
69 ~ScopeLogger();
70
71 // Returns true if logging is enabled for |scope| and |verbose_level|, i.e.
72 // scope_enable_[|scope|] is true and |verbose_level| <= |verbose_level_|
73 bool IsLogEnabled(Scope scope, int verbose_level) const;
74
Paul Stewart5581d072012-12-17 17:30:20 -080075 // Returns true if logging is enabled for |scope| at any verbosity level.
76 bool IsScopeEnabled(Scope scope) const;
77
Ben Chanbc49ac72012-04-10 19:59:45 -070078 // Returns a string comprising the names, separated by commas, of all scopes.
79 std::string GetAllScopeNames() const;
80
81 // Returns a string comprising the names, separated by plus signs, of all
82 // scopes that are enabled for logging.
83 std::string GetEnabledScopeNames() const;
84
85 // Enables/disables scopes as specified by |expression|.
86 //
87 // |expression| is a string comprising a sequence of scope names, each
88 // prefixed by a plus '+' or minus '-' sign. A scope prefixed by a plus
89 // sign is enabled for logging, whereas a scope prefixed by a minus sign
90 // is disabled for logging. Scopes that are not mentioned in |expression|
91 // remain the same state.
92 //
93 // To allow resetting the state of all scopes, an exception is made for the
94 // first scope name in the sequence, which may not be prefixed by any sign.
95 // That is considered as an implicit plus sign for that scope and also
96 // indicates that all scopes are first disabled before enabled by
97 // |expression|.
98 //
99 // If |expression| is an empty string, all scopes are disabled. Any unknown
100 // scope name found in |expression| is ignored.
Paul Stewart1a212a62015-06-16 13:13:10 -0700101 void EnableScopesByName(const std::string& expression);
Ben Chanbc49ac72012-04-10 19:59:45 -0700102
Paul Stewart5581d072012-12-17 17:30:20 -0800103 // Register for log scope enable/disable state changes for |scope|.
104 void RegisterScopeEnableChangedCallback(
105 Scope scope, ScopeEnableChangedCallback callback);
106
Ben Chanbc49ac72012-04-10 19:59:45 -0700107 // Sets the verbose level for all scopes to |verbose_level|.
108 void set_verbose_level(int verbose_level) { verbose_level_ = verbose_level; }
109
110 private:
111 // Required for constructing LazyInstance<ScopeLogger>.
112 friend struct base::DefaultLazyInstanceTraits<ScopeLogger>;
113 friend class ScopeLoggerTest;
114 FRIEND_TEST(ScopeLoggerTest, GetEnabledScopeNames);
115 FRIEND_TEST(ScopeLoggerTest, SetScopeEnabled);
116 FRIEND_TEST(ScopeLoggerTest, SetVerboseLevel);
117
118 // Disables logging for all scopes.
119 void DisableAllScopes();
120
121 // Enables or disables logging for |scope|.
122 void SetScopeEnabled(Scope scope, bool enabled);
123
124 // Boolean values to indicate whether logging is enabled for each scope.
125 std::bitset<kNumScopes> scope_enabled_;
126
127 // Verbose level that is applied to all scopes.
128 int verbose_level_;
129
Paul Stewart5581d072012-12-17 17:30:20 -0800130 // Hooks to notify interested parties of changes to log scopes.
131 ScopeEnableChangedCallbacks log_scope_callbacks_[kNumScopes];
132
Ben Chanbc49ac72012-04-10 19:59:45 -0700133 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeLogger);
134};
135
136} // namespace shill
137
138#endif // SHILL_SCOPE_LOGGER_H_