Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 1 | // Copyright (c) 2011 The Chromium 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 BASE_VLOG_H_ |
| 6 | #define BASE_VLOG_H_ |
| 7 | |
| 8 | #include <cstddef> |
| 9 | #include <string> |
| 10 | #include <vector> |
| 11 | |
| 12 | #include "base/base_export.h" |
| 13 | #include "base/basictypes.h" |
| 14 | #include "base/string_piece.h" |
| 15 | |
| 16 | namespace logging { |
| 17 | |
| 18 | // A helper class containing all the settings for vlogging. |
| 19 | class BASE_EXPORT VlogInfo { |
| 20 | public: |
| 21 | static const int kDefaultVlogLevel; |
| 22 | |
| 23 | // |v_switch| gives the default maximal active V-logging level; 0 is |
| 24 | // the default. Normally positive values are used for V-logging |
| 25 | // levels. |
| 26 | // |
| 27 | // |vmodule_switch| gives the per-module maximal V-logging levels to |
| 28 | // override the value given by |v_switch|. |
| 29 | // E.g. "my_module=2,foo*=3" would change the logging level for all |
| 30 | // code in source files "my_module.*" and "foo*.*" ("-inl" suffixes |
| 31 | // are also disregarded for this matching). |
| 32 | // |
| 33 | // |log_severity| points to an int that stores the log level. If a valid |
| 34 | // |v_switch| is provided, it will set the log level, and the default |
| 35 | // vlog severity will be read from there.. |
| 36 | // |
| 37 | // Any pattern containing a forward or backward slash will be tested |
| 38 | // against the whole pathname and not just the module. E.g., |
| 39 | // "*/foo/bar/*=2" would change the logging level for all code in |
| 40 | // source files under a "foo/bar" directory. |
| 41 | VlogInfo(const std::string& v_switch, |
| 42 | const std::string& vmodule_switch, |
| 43 | int* min_log_level); |
| 44 | ~VlogInfo(); |
| 45 | |
| 46 | // Returns the vlog level for a given file (usually taken from |
| 47 | // __FILE__). |
| 48 | int GetVlogLevel(const base::StringPiece& file) const; |
| 49 | |
| 50 | private: |
| 51 | void SetMaxVlogLevel(int level); |
| 52 | int GetMaxVlogLevel() const; |
| 53 | |
| 54 | // VmodulePattern holds all the information for each pattern parsed |
| 55 | // from |vmodule_switch|. |
| 56 | struct VmodulePattern; |
| 57 | std::vector<VmodulePattern> vmodule_levels_; |
| 58 | int* min_log_level_; |
| 59 | |
| 60 | DISALLOW_COPY_AND_ASSIGN(VlogInfo); |
| 61 | }; |
| 62 | |
| 63 | // Returns true if the string passed in matches the vlog pattern. The |
| 64 | // vlog pattern string can contain wildcards like * and ?. ? matches |
| 65 | // exactly one character while * matches 0 or more characters. Also, |
| 66 | // as a special case, a / or \ character matches either / or \. |
| 67 | // |
| 68 | // Examples: |
| 69 | // "kh?n" matches "khan" but not "khn" or "khaan" |
| 70 | // "kh*n" matches "khn", "khan", or even "khaaaaan" |
| 71 | // "/foo\bar" matches "/foo/bar", "\foo\bar", or "/foo\bar" |
| 72 | // (disregarding C escaping rules) |
| 73 | BASE_EXPORT bool MatchVlogPattern(const base::StringPiece& string, |
| 74 | const base::StringPiece& vlog_pattern); |
| 75 | |
| 76 | } // namespace logging |
| 77 | |
| 78 | #endif // BASE_VLOG_H_ |