blob: 486d9232d7012b274d6dc1af0c9ae9e0d47e6b3d [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>
Paul Stewart5581d072012-12-17 17:30:20 -08009#include <vector>
Ben Chanbc49ac72012-04-10 19:59:45 -070010#include <string>
11
12#include <base/basictypes.h>
13#include <base/lazy_instance.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,
Ben Chanbc49ac72012-04-10 19:59:45 -070047 kProfile,
Ben Chanfad4a0b2012-04-18 15:49:59 -070048 kProperty,
49 kResolver,
50 kRoute,
Ben Chanbc49ac72012-04-10 19:59:45 -070051 kRTNL,
52 kService,
53 kStorage,
54 kTask,
55 kVPN,
56 kWiFi,
Darin Petkov096b3472012-05-15 10:26:22 +020057 kWiMax,
Ben Chanbc49ac72012-04-10 19:59:45 -070058 kNumScopes
59 };
60
Paul Stewart5581d072012-12-17 17:30:20 -080061 typedef base::Callback<void(bool)> ScopeEnableChangedCallback;
62 typedef std::vector<ScopeEnableChangedCallback>ScopeEnableChangedCallbacks;
63
Ben Chanbc49ac72012-04-10 19:59:45 -070064 // Returns a singleton of this class.
65 static ScopeLogger *GetInstance();
66
67 ~ScopeLogger();
68
69 // Returns true if logging is enabled for |scope| and |verbose_level|, i.e.
70 // scope_enable_[|scope|] is true and |verbose_level| <= |verbose_level_|
71 bool IsLogEnabled(Scope scope, int verbose_level) const;
72
Paul Stewart5581d072012-12-17 17:30:20 -080073 // Returns true if logging is enabled for |scope| at any verbosity level.
74 bool IsScopeEnabled(Scope scope) const;
75
Ben Chanbc49ac72012-04-10 19:59:45 -070076 // Returns a string comprising the names, separated by commas, of all scopes.
77 std::string GetAllScopeNames() const;
78
79 // Returns a string comprising the names, separated by plus signs, of all
80 // scopes that are enabled for logging.
81 std::string GetEnabledScopeNames() const;
82
83 // Enables/disables scopes as specified by |expression|.
84 //
85 // |expression| is a string comprising a sequence of scope names, each
86 // prefixed by a plus '+' or minus '-' sign. A scope prefixed by a plus
87 // sign is enabled for logging, whereas a scope prefixed by a minus sign
88 // is disabled for logging. Scopes that are not mentioned in |expression|
89 // remain the same state.
90 //
91 // To allow resetting the state of all scopes, an exception is made for the
92 // first scope name in the sequence, which may not be prefixed by any sign.
93 // That is considered as an implicit plus sign for that scope and also
94 // indicates that all scopes are first disabled before enabled by
95 // |expression|.
96 //
97 // If |expression| is an empty string, all scopes are disabled. Any unknown
98 // scope name found in |expression| is ignored.
99 void EnableScopesByName(const std::string &expression);
100
Paul Stewart5581d072012-12-17 17:30:20 -0800101 // Register for log scope enable/disable state changes for |scope|.
102 void RegisterScopeEnableChangedCallback(
103 Scope scope, ScopeEnableChangedCallback callback);
104
Ben Chanbc49ac72012-04-10 19:59:45 -0700105 // Sets the verbose level for all scopes to |verbose_level|.
106 void set_verbose_level(int verbose_level) { verbose_level_ = verbose_level; }
107
108 private:
109 // Required for constructing LazyInstance<ScopeLogger>.
110 friend struct base::DefaultLazyInstanceTraits<ScopeLogger>;
111 friend class ScopeLoggerTest;
112 FRIEND_TEST(ScopeLoggerTest, GetEnabledScopeNames);
113 FRIEND_TEST(ScopeLoggerTest, SetScopeEnabled);
114 FRIEND_TEST(ScopeLoggerTest, SetVerboseLevel);
115
116 // Disables logging for all scopes.
117 void DisableAllScopes();
118
119 // Enables or disables logging for |scope|.
120 void SetScopeEnabled(Scope scope, bool enabled);
121
122 // Boolean values to indicate whether logging is enabled for each scope.
123 std::bitset<kNumScopes> scope_enabled_;
124
125 // Verbose level that is applied to all scopes.
126 int verbose_level_;
127
Paul Stewart5581d072012-12-17 17:30:20 -0800128 // Hooks to notify interested parties of changes to log scopes.
129 ScopeEnableChangedCallbacks log_scope_callbacks_[kNumScopes];
130
Ben Chanbc49ac72012-04-10 19:59:45 -0700131 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeLogger);
132};
133
134} // namespace shill
135
136#endif // SHILL_SCOPE_LOGGER_H_