blob: 36768d401dce2085b669ab8a0b971b096984254d [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>
10
11#include <base/basictypes.h>
12#include <base/lazy_instance.h>
Ben Chanbc49ac72012-04-10 19:59:45 -070013#include <gtest/gtest_prod.h>
14
Ben Chanbc49ac72012-04-10 19:59:45 -070015namespace shill {
16
17// A class that enables logging based on scope and verbose level. It is not
Christopher Wileyb691efd2012-08-09 13:51:51 -070018// intended to be used directly but via the SLOG() macros in shill/logging.h
Ben Chanbc49ac72012-04-10 19:59:45 -070019class ScopeLogger {
20 public:
21 // Logging scopes.
22 //
23 // Update kScopeNames in scope_logger.cc after changing this enumerated type.
Ben Chanfad4a0b2012-04-18 15:49:59 -070024 // These scope identifiers are sorted by their scope names alphabetically.
Ben Chanbc49ac72012-04-10 19:59:45 -070025 enum Scope {
26 kCellular = 0,
27 kConnection,
28 kCrypto,
Ben Chanfad4a0b2012-04-18 15:49:59 -070029 kDaemon,
Ben Chanbc49ac72012-04-10 19:59:45 -070030 kDBus,
31 kDevice,
Ben Chanfad4a0b2012-04-18 15:49:59 -070032 kDHCP,
33 kDNS,
Ben Chanbc49ac72012-04-10 19:59:45 -070034 kEthernet,
Ben Chanfad4a0b2012-04-18 15:49:59 -070035 kHTTP,
36 kHTTPProxy,
Ben Chanbc49ac72012-04-10 19:59:45 -070037 kInet,
Paul Stewart6c72c972012-07-27 11:29:20 -070038 kLink,
Ben Chanbc49ac72012-04-10 19:59:45 -070039 kManager,
40 kMetrics,
41 kModem,
42 kPortal,
Ben Chanfad4a0b2012-04-18 15:49:59 -070043 kPower,
Ben Chanbc49ac72012-04-10 19:59:45 -070044 kProfile,
Ben Chanfad4a0b2012-04-18 15:49:59 -070045 kProperty,
46 kResolver,
47 kRoute,
Ben Chanbc49ac72012-04-10 19:59:45 -070048 kRTNL,
49 kService,
50 kStorage,
51 kTask,
52 kVPN,
53 kWiFi,
Darin Petkov096b3472012-05-15 10:26:22 +020054 kWiMax,
Ben Chanbc49ac72012-04-10 19:59:45 -070055 kNumScopes
56 };
57
58 // Returns a singleton of this class.
59 static ScopeLogger *GetInstance();
60
61 ~ScopeLogger();
62
63 // Returns true if logging is enabled for |scope| and |verbose_level|, i.e.
64 // scope_enable_[|scope|] is true and |verbose_level| <= |verbose_level_|
65 bool IsLogEnabled(Scope scope, int verbose_level) const;
66
67 // Returns a string comprising the names, separated by commas, of all scopes.
68 std::string GetAllScopeNames() const;
69
70 // Returns a string comprising the names, separated by plus signs, of all
71 // scopes that are enabled for logging.
72 std::string GetEnabledScopeNames() const;
73
74 // Enables/disables scopes as specified by |expression|.
75 //
76 // |expression| is a string comprising a sequence of scope names, each
77 // prefixed by a plus '+' or minus '-' sign. A scope prefixed by a plus
78 // sign is enabled for logging, whereas a scope prefixed by a minus sign
79 // is disabled for logging. Scopes that are not mentioned in |expression|
80 // remain the same state.
81 //
82 // To allow resetting the state of all scopes, an exception is made for the
83 // first scope name in the sequence, which may not be prefixed by any sign.
84 // That is considered as an implicit plus sign for that scope and also
85 // indicates that all scopes are first disabled before enabled by
86 // |expression|.
87 //
88 // If |expression| is an empty string, all scopes are disabled. Any unknown
89 // scope name found in |expression| is ignored.
90 void EnableScopesByName(const std::string &expression);
91
92 // Sets the verbose level for all scopes to |verbose_level|.
93 void set_verbose_level(int verbose_level) { verbose_level_ = verbose_level; }
94
95 private:
96 // Required for constructing LazyInstance<ScopeLogger>.
97 friend struct base::DefaultLazyInstanceTraits<ScopeLogger>;
98 friend class ScopeLoggerTest;
99 FRIEND_TEST(ScopeLoggerTest, GetEnabledScopeNames);
100 FRIEND_TEST(ScopeLoggerTest, SetScopeEnabled);
101 FRIEND_TEST(ScopeLoggerTest, SetVerboseLevel);
102
103 // Disables logging for all scopes.
104 void DisableAllScopes();
105
106 // Enables or disables logging for |scope|.
107 void SetScopeEnabled(Scope scope, bool enabled);
108
109 // Boolean values to indicate whether logging is enabled for each scope.
110 std::bitset<kNumScopes> scope_enabled_;
111
112 // Verbose level that is applied to all scopes.
113 int verbose_level_;
114
115 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeLogger);
116};
117
118} // namespace shill
119
120#endif // SHILL_SCOPE_LOGGER_H_