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