1*9356374aSAndroid Build Coastguard Worker // Copyright 2022 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker //
15*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
16*9356374aSAndroid Build Coastguard Worker // File: log/globals.h
17*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
18*9356374aSAndroid Build Coastguard Worker //
19*9356374aSAndroid Build Coastguard Worker // This header declares global logging library configuration knobs.
20*9356374aSAndroid Build Coastguard Worker
21*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_LOG_GLOBALS_H_
22*9356374aSAndroid Build Coastguard Worker #define ABSL_LOG_GLOBALS_H_
23*9356374aSAndroid Build Coastguard Worker
24*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
25*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
26*9356374aSAndroid Build Coastguard Worker #include "absl/base/log_severity.h"
27*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/vlog_config.h"
28*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
29*9356374aSAndroid Build Coastguard Worker
30*9356374aSAndroid Build Coastguard Worker namespace absl {
31*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
32*9356374aSAndroid Build Coastguard Worker
33*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
34*9356374aSAndroid Build Coastguard Worker // Minimum Log Level
35*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
36*9356374aSAndroid Build Coastguard Worker //
37*9356374aSAndroid Build Coastguard Worker // Messages logged at or above this severity are directed to all registered log
38*9356374aSAndroid Build Coastguard Worker // sinks or skipped otherwise. This parameter can also be modified using
39*9356374aSAndroid Build Coastguard Worker // command line flag --minloglevel.
40*9356374aSAndroid Build Coastguard Worker // See absl/base/log_severity.h for descriptions of severity levels.
41*9356374aSAndroid Build Coastguard Worker
42*9356374aSAndroid Build Coastguard Worker // MinLogLevel()
43*9356374aSAndroid Build Coastguard Worker //
44*9356374aSAndroid Build Coastguard Worker // Returns the value of the Minimum Log Level parameter.
45*9356374aSAndroid Build Coastguard Worker // This function is async-signal-safe.
46*9356374aSAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT absl::LogSeverityAtLeast MinLogLevel();
47*9356374aSAndroid Build Coastguard Worker
48*9356374aSAndroid Build Coastguard Worker // SetMinLogLevel()
49*9356374aSAndroid Build Coastguard Worker //
50*9356374aSAndroid Build Coastguard Worker // Updates the value of Minimum Log Level parameter.
51*9356374aSAndroid Build Coastguard Worker // This function is async-signal-safe.
52*9356374aSAndroid Build Coastguard Worker void SetMinLogLevel(absl::LogSeverityAtLeast severity);
53*9356374aSAndroid Build Coastguard Worker
54*9356374aSAndroid Build Coastguard Worker namespace log_internal {
55*9356374aSAndroid Build Coastguard Worker
56*9356374aSAndroid Build Coastguard Worker // ScopedMinLogLevel
57*9356374aSAndroid Build Coastguard Worker //
58*9356374aSAndroid Build Coastguard Worker // RAII type used to temporarily update the Min Log Level parameter.
59*9356374aSAndroid Build Coastguard Worker class ScopedMinLogLevel final {
60*9356374aSAndroid Build Coastguard Worker public:
61*9356374aSAndroid Build Coastguard Worker explicit ScopedMinLogLevel(absl::LogSeverityAtLeast severity);
62*9356374aSAndroid Build Coastguard Worker ScopedMinLogLevel(const ScopedMinLogLevel&) = delete;
63*9356374aSAndroid Build Coastguard Worker ScopedMinLogLevel& operator=(const ScopedMinLogLevel&) = delete;
64*9356374aSAndroid Build Coastguard Worker ~ScopedMinLogLevel();
65*9356374aSAndroid Build Coastguard Worker
66*9356374aSAndroid Build Coastguard Worker private:
67*9356374aSAndroid Build Coastguard Worker absl::LogSeverityAtLeast saved_severity_;
68*9356374aSAndroid Build Coastguard Worker };
69*9356374aSAndroid Build Coastguard Worker
70*9356374aSAndroid Build Coastguard Worker } // namespace log_internal
71*9356374aSAndroid Build Coastguard Worker
72*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
73*9356374aSAndroid Build Coastguard Worker // Stderr Threshold
74*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
75*9356374aSAndroid Build Coastguard Worker //
76*9356374aSAndroid Build Coastguard Worker // Messages logged at or above this level are directed to stderr in
77*9356374aSAndroid Build Coastguard Worker // addition to other registered log sinks. This parameter can also be modified
78*9356374aSAndroid Build Coastguard Worker // using command line flag --stderrthreshold.
79*9356374aSAndroid Build Coastguard Worker // See absl/base/log_severity.h for descriptions of severity levels.
80*9356374aSAndroid Build Coastguard Worker
81*9356374aSAndroid Build Coastguard Worker // StderrThreshold()
82*9356374aSAndroid Build Coastguard Worker //
83*9356374aSAndroid Build Coastguard Worker // Returns the value of the Stderr Threshold parameter.
84*9356374aSAndroid Build Coastguard Worker // This function is async-signal-safe.
85*9356374aSAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT absl::LogSeverityAtLeast StderrThreshold();
86*9356374aSAndroid Build Coastguard Worker
87*9356374aSAndroid Build Coastguard Worker // SetStderrThreshold()
88*9356374aSAndroid Build Coastguard Worker //
89*9356374aSAndroid Build Coastguard Worker // Updates the Stderr Threshold parameter.
90*9356374aSAndroid Build Coastguard Worker // This function is async-signal-safe.
91*9356374aSAndroid Build Coastguard Worker void SetStderrThreshold(absl::LogSeverityAtLeast severity);
SetStderrThreshold(absl::LogSeverity severity)92*9356374aSAndroid Build Coastguard Worker inline void SetStderrThreshold(absl::LogSeverity severity) {
93*9356374aSAndroid Build Coastguard Worker absl::SetStderrThreshold(static_cast<absl::LogSeverityAtLeast>(severity));
94*9356374aSAndroid Build Coastguard Worker }
95*9356374aSAndroid Build Coastguard Worker
96*9356374aSAndroid Build Coastguard Worker // ScopedStderrThreshold
97*9356374aSAndroid Build Coastguard Worker //
98*9356374aSAndroid Build Coastguard Worker // RAII type used to temporarily update the Stderr Threshold parameter.
99*9356374aSAndroid Build Coastguard Worker class ScopedStderrThreshold final {
100*9356374aSAndroid Build Coastguard Worker public:
101*9356374aSAndroid Build Coastguard Worker explicit ScopedStderrThreshold(absl::LogSeverityAtLeast severity);
102*9356374aSAndroid Build Coastguard Worker ScopedStderrThreshold(const ScopedStderrThreshold&) = delete;
103*9356374aSAndroid Build Coastguard Worker ScopedStderrThreshold& operator=(const ScopedStderrThreshold&) = delete;
104*9356374aSAndroid Build Coastguard Worker ~ScopedStderrThreshold();
105*9356374aSAndroid Build Coastguard Worker
106*9356374aSAndroid Build Coastguard Worker private:
107*9356374aSAndroid Build Coastguard Worker absl::LogSeverityAtLeast saved_severity_;
108*9356374aSAndroid Build Coastguard Worker };
109*9356374aSAndroid Build Coastguard Worker
110*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
111*9356374aSAndroid Build Coastguard Worker // Log Backtrace At
112*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
113*9356374aSAndroid Build Coastguard Worker //
114*9356374aSAndroid Build Coastguard Worker // Users can request an existing `LOG` statement, specified by file and line
115*9356374aSAndroid Build Coastguard Worker // number, to also include a backtrace when logged.
116*9356374aSAndroid Build Coastguard Worker
117*9356374aSAndroid Build Coastguard Worker // ShouldLogBacktraceAt()
118*9356374aSAndroid Build Coastguard Worker //
119*9356374aSAndroid Build Coastguard Worker // Returns true if we should log a backtrace at the specified location.
120*9356374aSAndroid Build Coastguard Worker namespace log_internal {
121*9356374aSAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT bool ShouldLogBacktraceAt(absl::string_view file,
122*9356374aSAndroid Build Coastguard Worker int line);
123*9356374aSAndroid Build Coastguard Worker } // namespace log_internal
124*9356374aSAndroid Build Coastguard Worker
125*9356374aSAndroid Build Coastguard Worker // SetLogBacktraceLocation()
126*9356374aSAndroid Build Coastguard Worker //
127*9356374aSAndroid Build Coastguard Worker // Sets the location the backtrace should be logged at. If the specified
128*9356374aSAndroid Build Coastguard Worker // location isn't a `LOG` statement, the effect will be the same as
129*9356374aSAndroid Build Coastguard Worker // `ClearLogBacktraceLocation` (but less efficient).
130*9356374aSAndroid Build Coastguard Worker void SetLogBacktraceLocation(absl::string_view file, int line);
131*9356374aSAndroid Build Coastguard Worker
132*9356374aSAndroid Build Coastguard Worker // ClearLogBacktraceLocation()
133*9356374aSAndroid Build Coastguard Worker //
134*9356374aSAndroid Build Coastguard Worker // Clears the set location so that backtraces will no longer be logged at it.
135*9356374aSAndroid Build Coastguard Worker void ClearLogBacktraceLocation();
136*9356374aSAndroid Build Coastguard Worker
137*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
138*9356374aSAndroid Build Coastguard Worker // Prepend Log Prefix
139*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
140*9356374aSAndroid Build Coastguard Worker //
141*9356374aSAndroid Build Coastguard Worker // This option tells the logging library that every logged message
142*9356374aSAndroid Build Coastguard Worker // should include the prefix (severity, date, time, PID, etc.)
143*9356374aSAndroid Build Coastguard Worker //
144*9356374aSAndroid Build Coastguard Worker // ShouldPrependLogPrefix()
145*9356374aSAndroid Build Coastguard Worker //
146*9356374aSAndroid Build Coastguard Worker // Returns the value of the Prepend Log Prefix option.
147*9356374aSAndroid Build Coastguard Worker // This function is async-signal-safe.
148*9356374aSAndroid Build Coastguard Worker ABSL_MUST_USE_RESULT bool ShouldPrependLogPrefix();
149*9356374aSAndroid Build Coastguard Worker
150*9356374aSAndroid Build Coastguard Worker // EnableLogPrefix()
151*9356374aSAndroid Build Coastguard Worker //
152*9356374aSAndroid Build Coastguard Worker // Updates the value of the Prepend Log Prefix option.
153*9356374aSAndroid Build Coastguard Worker // This function is async-signal-safe.
154*9356374aSAndroid Build Coastguard Worker void EnableLogPrefix(bool on_off);
155*9356374aSAndroid Build Coastguard Worker
156*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
157*9356374aSAndroid Build Coastguard Worker // `VLOG` Configuration
158*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
159*9356374aSAndroid Build Coastguard Worker //
160*9356374aSAndroid Build Coastguard Worker // These methods set the `(ABSL_)VLOG(_IS_ON)` threshold. They allow
161*9356374aSAndroid Build Coastguard Worker // programmatic control of the thresholds set by the --v and --vmodule flags.
162*9356374aSAndroid Build Coastguard Worker //
163*9356374aSAndroid Build Coastguard Worker // Only `VLOG`s with a severity level LESS THAN OR EQUAL TO the threshold will
164*9356374aSAndroid Build Coastguard Worker // be evaluated.
165*9356374aSAndroid Build Coastguard Worker //
166*9356374aSAndroid Build Coastguard Worker // For example, if the threshold is 2, then:
167*9356374aSAndroid Build Coastguard Worker //
168*9356374aSAndroid Build Coastguard Worker // VLOG(2) << "This message will be logged.";
169*9356374aSAndroid Build Coastguard Worker // VLOG(3) << "This message will NOT be logged.";
170*9356374aSAndroid Build Coastguard Worker //
171*9356374aSAndroid Build Coastguard Worker // The default threshold is 0. Since `VLOG` levels must not be negative, a
172*9356374aSAndroid Build Coastguard Worker // negative threshold value will turn off all VLOGs.
173*9356374aSAndroid Build Coastguard Worker
174*9356374aSAndroid Build Coastguard Worker // SetGlobalVLogLevel()
175*9356374aSAndroid Build Coastguard Worker //
176*9356374aSAndroid Build Coastguard Worker // Sets the global `VLOG` level to threshold. Returns the previous global
177*9356374aSAndroid Build Coastguard Worker // threshold.
SetGlobalVLogLevel(int threshold)178*9356374aSAndroid Build Coastguard Worker inline int SetGlobalVLogLevel(int threshold) {
179*9356374aSAndroid Build Coastguard Worker return absl::log_internal::UpdateGlobalVLogLevel(threshold);
180*9356374aSAndroid Build Coastguard Worker }
181*9356374aSAndroid Build Coastguard Worker
182*9356374aSAndroid Build Coastguard Worker // SetVLogLevel()
183*9356374aSAndroid Build Coastguard Worker //
184*9356374aSAndroid Build Coastguard Worker // Sets the `VLOG` threshold for all files that match `module_pattern`,
185*9356374aSAndroid Build Coastguard Worker // overwriting any prior value. Files that don't match aren't affected.
186*9356374aSAndroid Build Coastguard Worker // Returns the threshold that previously applied to `module_pattern`.
SetVLogLevel(absl::string_view module_pattern,int threshold)187*9356374aSAndroid Build Coastguard Worker inline int SetVLogLevel(absl::string_view module_pattern, int threshold) {
188*9356374aSAndroid Build Coastguard Worker return absl::log_internal::PrependVModule(module_pattern, threshold);
189*9356374aSAndroid Build Coastguard Worker }
190*9356374aSAndroid Build Coastguard Worker
191*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
192*9356374aSAndroid Build Coastguard Worker // Configure Android Native Log Tag
193*9356374aSAndroid Build Coastguard Worker //------------------------------------------------------------------------------
194*9356374aSAndroid Build Coastguard Worker //
195*9356374aSAndroid Build Coastguard Worker // The logging library forwards to the Android system log API when built for
196*9356374aSAndroid Build Coastguard Worker // Android. That API takes a string "tag" value in addition to a message and
197*9356374aSAndroid Build Coastguard Worker // severity level. The tag is used to identify the source of messages and to
198*9356374aSAndroid Build Coastguard Worker // filter them. This library uses the tag "native" by default.
199*9356374aSAndroid Build Coastguard Worker
200*9356374aSAndroid Build Coastguard Worker // SetAndroidNativeTag()
201*9356374aSAndroid Build Coastguard Worker //
202*9356374aSAndroid Build Coastguard Worker // Stores a copy of the string pointed to by `tag` and uses it as the Android
203*9356374aSAndroid Build Coastguard Worker // logging tag thereafter. `tag` must not be null.
204*9356374aSAndroid Build Coastguard Worker // This function must not be called more than once!
205*9356374aSAndroid Build Coastguard Worker void SetAndroidNativeTag(const char* tag);
206*9356374aSAndroid Build Coastguard Worker
207*9356374aSAndroid Build Coastguard Worker namespace log_internal {
208*9356374aSAndroid Build Coastguard Worker // GetAndroidNativeTag()
209*9356374aSAndroid Build Coastguard Worker //
210*9356374aSAndroid Build Coastguard Worker // Returns the configured Android logging tag.
211*9356374aSAndroid Build Coastguard Worker const char* GetAndroidNativeTag();
212*9356374aSAndroid Build Coastguard Worker } // namespace log_internal
213*9356374aSAndroid Build Coastguard Worker
214*9356374aSAndroid Build Coastguard Worker namespace log_internal {
215*9356374aSAndroid Build Coastguard Worker
216*9356374aSAndroid Build Coastguard Worker using LoggingGlobalsListener = void (*)();
217*9356374aSAndroid Build Coastguard Worker void SetLoggingGlobalsListener(LoggingGlobalsListener l);
218*9356374aSAndroid Build Coastguard Worker
219*9356374aSAndroid Build Coastguard Worker // Internal implementation for the setter routines. These are used
220*9356374aSAndroid Build Coastguard Worker // to break circular dependencies between flags and globals. Each "Raw"
221*9356374aSAndroid Build Coastguard Worker // routine corresponds to the non-"Raw" counterpart and used to set the
222*9356374aSAndroid Build Coastguard Worker // configuration parameter directly without calling back to the listener.
223*9356374aSAndroid Build Coastguard Worker void RawSetMinLogLevel(absl::LogSeverityAtLeast severity);
224*9356374aSAndroid Build Coastguard Worker void RawSetStderrThreshold(absl::LogSeverityAtLeast severity);
225*9356374aSAndroid Build Coastguard Worker void RawEnableLogPrefix(bool on_off);
226*9356374aSAndroid Build Coastguard Worker
227*9356374aSAndroid Build Coastguard Worker } // namespace log_internal
228*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
229*9356374aSAndroid Build Coastguard Worker } // namespace absl
230*9356374aSAndroid Build Coastguard Worker
231*9356374aSAndroid Build Coastguard Worker #endif // ABSL_LOG_GLOBALS_H_
232