xref: /aosp_15_r20/external/cronet/base/vlog.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_VLOG_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_VLOG_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker #include <vector>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace logging {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker // A helper class containing all the settings for vlogging.
18*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT VlogInfo {
19*6777b538SAndroid Build Coastguard Worker  public:
20*6777b538SAndroid Build Coastguard Worker   static const int kDefaultVlogLevel;
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker   // |v_switch| gives the default maximal active V-logging level; 0 is
23*6777b538SAndroid Build Coastguard Worker   // the default.  Normally positive values are used for V-logging
24*6777b538SAndroid Build Coastguard Worker   // levels.
25*6777b538SAndroid Build Coastguard Worker   //
26*6777b538SAndroid Build Coastguard Worker   // |vmodule_switch| gives the per-module maximal V-logging levels to
27*6777b538SAndroid Build Coastguard Worker   // override the value given by |v_switch|.
28*6777b538SAndroid Build Coastguard Worker   // E.g. "my_module=2,foo*=3" would change the logging level for all
29*6777b538SAndroid Build Coastguard Worker   // code in source files "my_module.*" and "foo*.*" ("-inl" suffixes
30*6777b538SAndroid Build Coastguard Worker   // are also disregarded for this matching).
31*6777b538SAndroid Build Coastguard Worker   //
32*6777b538SAndroid Build Coastguard Worker   // |min_log_level| points to an int that stores the log level. If a valid
33*6777b538SAndroid Build Coastguard Worker   // |v_switch| is provided, it will set the log level, and the default
34*6777b538SAndroid Build Coastguard Worker   // vlog severity will be read from there.
35*6777b538SAndroid Build Coastguard Worker   //
36*6777b538SAndroid Build Coastguard Worker   // Any pattern containing a forward or backward slash will be tested
37*6777b538SAndroid Build Coastguard Worker   // against the whole pathname and not just the module.  E.g.,
38*6777b538SAndroid Build Coastguard Worker   // "*/foo/bar/*=2" would change the logging level for all code in
39*6777b538SAndroid Build Coastguard Worker   // source files under a "foo/bar" directory.
40*6777b538SAndroid Build Coastguard Worker   VlogInfo(const std::string& v_switch,
41*6777b538SAndroid Build Coastguard Worker            const std::string& vmodule_switch,
42*6777b538SAndroid Build Coastguard Worker            int* min_log_level);
43*6777b538SAndroid Build Coastguard Worker   VlogInfo(const VlogInfo&) = delete;
44*6777b538SAndroid Build Coastguard Worker   VlogInfo& operator=(const VlogInfo&) = delete;
45*6777b538SAndroid Build Coastguard Worker   ~VlogInfo();
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker   // Returns the vlog level for a given file (usually taken from
48*6777b538SAndroid Build Coastguard Worker   // __FILE__).
49*6777b538SAndroid Build Coastguard Worker   int GetVlogLevel(base::StringPiece file) const;
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker   // Returns a new VlogInfo based on |this| but with extra modules/levels added
52*6777b538SAndroid Build Coastguard Worker   // according to |vmodule_switch|.
53*6777b538SAndroid Build Coastguard Worker   VlogInfo* WithSwitches(const std::string& vmodule_switch) const;
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker  private:
56*6777b538SAndroid Build Coastguard Worker   void SetMaxVlogLevel(int level);
57*6777b538SAndroid Build Coastguard Worker   int GetMaxVlogLevel() const;
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   // VmodulePattern holds all the information for each pattern parsed
60*6777b538SAndroid Build Coastguard Worker   // from |vmodule_switch|.
61*6777b538SAndroid Build Coastguard Worker   struct VmodulePattern {
62*6777b538SAndroid Build Coastguard Worker     enum MatchTarget { MATCH_MODULE, MATCH_FILE };
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker     explicit VmodulePattern(const std::string& pattern);
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker     VmodulePattern();
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker     std::string pattern;
69*6777b538SAndroid Build Coastguard Worker     int vlog_level;
70*6777b538SAndroid Build Coastguard Worker     MatchTarget match_target;
71*6777b538SAndroid Build Coastguard Worker   };
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   VlogInfo(std::vector<VmodulePattern> vmodule_levels, int* min_log_level);
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   // Parses `VmodulePatterns` from a string, typically provided on the
76*6777b538SAndroid Build Coastguard Worker   // commandline.
77*6777b538SAndroid Build Coastguard Worker   static std::vector<VmodulePattern> ParseVmoduleLevels(
78*6777b538SAndroid Build Coastguard Worker       const std::string& vmodule_switch);
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker   const std::vector<VmodulePattern> vmodule_levels_;
81*6777b538SAndroid Build Coastguard Worker   raw_ptr<int> const min_log_level_;
82*6777b538SAndroid Build Coastguard Worker };
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker // Returns true if the string passed in matches the vlog pattern.  The
85*6777b538SAndroid Build Coastguard Worker // vlog pattern string can contain wildcards like * and ?.  ? matches
86*6777b538SAndroid Build Coastguard Worker // exactly one character while * matches 0 or more characters.  Also,
87*6777b538SAndroid Build Coastguard Worker // as a special case, a / or \ character matches either / or \.
88*6777b538SAndroid Build Coastguard Worker //
89*6777b538SAndroid Build Coastguard Worker // Examples:
90*6777b538SAndroid Build Coastguard Worker //   "kh?n" matches "khan" but not "khn" or "khaan"
91*6777b538SAndroid Build Coastguard Worker //   "kh*n" matches "khn", "khan", or even "khaaaaan"
92*6777b538SAndroid Build Coastguard Worker //   "/foo\bar" matches "/foo/bar", "\foo\bar", or "/foo\bar"
93*6777b538SAndroid Build Coastguard Worker //     (disregarding C escaping rules)
94*6777b538SAndroid Build Coastguard Worker BASE_EXPORT bool MatchVlogPattern(base::StringPiece string,
95*6777b538SAndroid Build Coastguard Worker                                   base::StringPiece vlog_pattern);
96*6777b538SAndroid Build Coastguard Worker 
97*6777b538SAndroid Build Coastguard Worker }  // namespace logging
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker #endif  // BASE_VLOG_H_
100