xref: /aosp_15_r20/external/abseil-cpp/absl/log/internal/log_message.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker //
2*9356374aSAndroid Build Coastguard Worker // Copyright 2022 The Abseil Authors.
3*9356374aSAndroid Build Coastguard Worker //
4*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*9356374aSAndroid Build Coastguard Worker //
8*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
9*9356374aSAndroid Build Coastguard Worker //
10*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*9356374aSAndroid Build Coastguard Worker // limitations under the License.
15*9356374aSAndroid Build Coastguard Worker 
16*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/log_message.h"
17*9356374aSAndroid Build Coastguard Worker 
18*9356374aSAndroid Build Coastguard Worker #include <stddef.h>
19*9356374aSAndroid Build Coastguard Worker #include <stdint.h>
20*9356374aSAndroid Build Coastguard Worker #include <stdlib.h>
21*9356374aSAndroid Build Coastguard Worker #include <string.h>
22*9356374aSAndroid Build Coastguard Worker 
23*9356374aSAndroid Build Coastguard Worker #ifndef _WIN32
24*9356374aSAndroid Build Coastguard Worker #include <unistd.h>
25*9356374aSAndroid Build Coastguard Worker #endif
26*9356374aSAndroid Build Coastguard Worker 
27*9356374aSAndroid Build Coastguard Worker #include <algorithm>
28*9356374aSAndroid Build Coastguard Worker #include <array>
29*9356374aSAndroid Build Coastguard Worker #include <atomic>
30*9356374aSAndroid Build Coastguard Worker #include <ios>
31*9356374aSAndroid Build Coastguard Worker #include <memory>
32*9356374aSAndroid Build Coastguard Worker #include <ostream>
33*9356374aSAndroid Build Coastguard Worker #include <string>
34*9356374aSAndroid Build Coastguard Worker #include <tuple>
35*9356374aSAndroid Build Coastguard Worker 
36*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
37*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
38*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/raw_logging.h"
39*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/strerror.h"
40*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/sysinfo.h"
41*9356374aSAndroid Build Coastguard Worker #include "absl/base/log_severity.h"
42*9356374aSAndroid Build Coastguard Worker #include "absl/container/inlined_vector.h"
43*9356374aSAndroid Build Coastguard Worker #include "absl/debugging/internal/examine_stack.h"
44*9356374aSAndroid Build Coastguard Worker #include "absl/log/globals.h"
45*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/append_truncated.h"
46*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/globals.h"
47*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/log_format.h"
48*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/log_sink_set.h"
49*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/proto.h"
50*9356374aSAndroid Build Coastguard Worker #include "absl/log/log_entry.h"
51*9356374aSAndroid Build Coastguard Worker #include "absl/log/log_sink.h"
52*9356374aSAndroid Build Coastguard Worker #include "absl/log/log_sink_registry.h"
53*9356374aSAndroid Build Coastguard Worker #include "absl/memory/memory.h"
54*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
55*9356374aSAndroid Build Coastguard Worker #include "absl/time/clock.h"
56*9356374aSAndroid Build Coastguard Worker #include "absl/time/time.h"
57*9356374aSAndroid Build Coastguard Worker #include "absl/types/span.h"
58*9356374aSAndroid Build Coastguard Worker 
ABSL_INTERNAL_C_SYMBOL(AbslInternalOnFatalLogMessage)59*9356374aSAndroid Build Coastguard Worker extern "C" ABSL_ATTRIBUTE_WEAK void ABSL_INTERNAL_C_SYMBOL(
60*9356374aSAndroid Build Coastguard Worker     AbslInternalOnFatalLogMessage)(const absl::LogEntry&) {
61*9356374aSAndroid Build Coastguard Worker   // Default - Do nothing
62*9356374aSAndroid Build Coastguard Worker }
63*9356374aSAndroid Build Coastguard Worker 
64*9356374aSAndroid Build Coastguard Worker namespace absl {
65*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
66*9356374aSAndroid Build Coastguard Worker namespace log_internal {
67*9356374aSAndroid Build Coastguard Worker 
68*9356374aSAndroid Build Coastguard Worker namespace {
69*9356374aSAndroid Build Coastguard Worker // message `logging.proto.Event`
70*9356374aSAndroid Build Coastguard Worker enum EventTag : uint8_t {
71*9356374aSAndroid Build Coastguard Worker   kFileName = 2,
72*9356374aSAndroid Build Coastguard Worker   kFileLine = 3,
73*9356374aSAndroid Build Coastguard Worker   kTimeNsecs = 4,
74*9356374aSAndroid Build Coastguard Worker   kSeverity = 5,
75*9356374aSAndroid Build Coastguard Worker   kThreadId = 6,
76*9356374aSAndroid Build Coastguard Worker   kValue = 7,
77*9356374aSAndroid Build Coastguard Worker   kSequenceNumber = 9,
78*9356374aSAndroid Build Coastguard Worker   kThreadName = 10,
79*9356374aSAndroid Build Coastguard Worker };
80*9356374aSAndroid Build Coastguard Worker 
81*9356374aSAndroid Build Coastguard Worker // message `logging.proto.Value`
82*9356374aSAndroid Build Coastguard Worker enum ValueTag : uint8_t {
83*9356374aSAndroid Build Coastguard Worker   kString = 1,
84*9356374aSAndroid Build Coastguard Worker   kStringLiteral = 6,
85*9356374aSAndroid Build Coastguard Worker };
86*9356374aSAndroid Build Coastguard Worker 
87*9356374aSAndroid Build Coastguard Worker // Decodes a `logging.proto.Value` from `buf` and writes a string representation
88*9356374aSAndroid Build Coastguard Worker // into `dst`.  The string representation will be truncated if `dst` is not
89*9356374aSAndroid Build Coastguard Worker // large enough to hold it.  Returns false if `dst` has size zero or one (i.e.
90*9356374aSAndroid Build Coastguard Worker // sufficient only for a nul-terminator) and no decoded data could be written.
91*9356374aSAndroid Build Coastguard Worker // This function may or may not write a nul-terminator into `dst`, and it may or
92*9356374aSAndroid Build Coastguard Worker // may not truncate the data it writes in order to do make space for that nul
93*9356374aSAndroid Build Coastguard Worker // terminator.  In any case, `dst` will be advanced to point at the byte where
94*9356374aSAndroid Build Coastguard Worker // subsequent writes should begin.
PrintValue(absl::Span<char> & dst,absl::Span<const char> buf)95*9356374aSAndroid Build Coastguard Worker bool PrintValue(absl::Span<char>& dst, absl::Span<const char> buf) {
96*9356374aSAndroid Build Coastguard Worker   if (dst.size() <= 1) return false;
97*9356374aSAndroid Build Coastguard Worker   ProtoField field;
98*9356374aSAndroid Build Coastguard Worker   while (field.DecodeFrom(&buf)) {
99*9356374aSAndroid Build Coastguard Worker     switch (field.tag()) {
100*9356374aSAndroid Build Coastguard Worker       case ValueTag::kString:
101*9356374aSAndroid Build Coastguard Worker       case ValueTag::kStringLiteral:
102*9356374aSAndroid Build Coastguard Worker         if (field.type() == WireType::kLengthDelimited)
103*9356374aSAndroid Build Coastguard Worker           if (log_internal::AppendTruncated(field.string_value(), dst) <
104*9356374aSAndroid Build Coastguard Worker               field.string_value().size())
105*9356374aSAndroid Build Coastguard Worker             return false;
106*9356374aSAndroid Build Coastguard Worker     }
107*9356374aSAndroid Build Coastguard Worker   }
108*9356374aSAndroid Build Coastguard Worker   return true;
109*9356374aSAndroid Build Coastguard Worker }
110*9356374aSAndroid Build Coastguard Worker 
111*9356374aSAndroid Build Coastguard Worker // See `logging.proto.Severity`
ProtoSeverity(absl::LogSeverity severity,int verbose_level)112*9356374aSAndroid Build Coastguard Worker int32_t ProtoSeverity(absl::LogSeverity severity, int verbose_level) {
113*9356374aSAndroid Build Coastguard Worker   switch (severity) {
114*9356374aSAndroid Build Coastguard Worker     case absl::LogSeverity::kInfo:
115*9356374aSAndroid Build Coastguard Worker       if (verbose_level == absl::LogEntry::kNoVerbosityLevel) return 800;
116*9356374aSAndroid Build Coastguard Worker       return 600 - verbose_level;
117*9356374aSAndroid Build Coastguard Worker     case absl::LogSeverity::kWarning:
118*9356374aSAndroid Build Coastguard Worker       return 900;
119*9356374aSAndroid Build Coastguard Worker     case absl::LogSeverity::kError:
120*9356374aSAndroid Build Coastguard Worker       return 950;
121*9356374aSAndroid Build Coastguard Worker     case absl::LogSeverity::kFatal:
122*9356374aSAndroid Build Coastguard Worker       return 1100;
123*9356374aSAndroid Build Coastguard Worker     default:
124*9356374aSAndroid Build Coastguard Worker       return 800;
125*9356374aSAndroid Build Coastguard Worker   }
126*9356374aSAndroid Build Coastguard Worker }
127*9356374aSAndroid Build Coastguard Worker 
Basename(absl::string_view filepath)128*9356374aSAndroid Build Coastguard Worker absl::string_view Basename(absl::string_view filepath) {
129*9356374aSAndroid Build Coastguard Worker #ifdef _WIN32
130*9356374aSAndroid Build Coastguard Worker   size_t path = filepath.find_last_of("/\\");
131*9356374aSAndroid Build Coastguard Worker #else
132*9356374aSAndroid Build Coastguard Worker   size_t path = filepath.find_last_of('/');
133*9356374aSAndroid Build Coastguard Worker #endif
134*9356374aSAndroid Build Coastguard Worker   if (path != filepath.npos) filepath.remove_prefix(path + 1);
135*9356374aSAndroid Build Coastguard Worker   return filepath;
136*9356374aSAndroid Build Coastguard Worker }
137*9356374aSAndroid Build Coastguard Worker 
WriteToString(const char * data,void * str)138*9356374aSAndroid Build Coastguard Worker void WriteToString(const char* data, void* str) {
139*9356374aSAndroid Build Coastguard Worker   reinterpret_cast<std::string*>(str)->append(data);
140*9356374aSAndroid Build Coastguard Worker }
WriteToStream(const char * data,void * os)141*9356374aSAndroid Build Coastguard Worker void WriteToStream(const char* data, void* os) {
142*9356374aSAndroid Build Coastguard Worker   auto* cast_os = static_cast<std::ostream*>(os);
143*9356374aSAndroid Build Coastguard Worker   *cast_os << data;
144*9356374aSAndroid Build Coastguard Worker }
145*9356374aSAndroid Build Coastguard Worker }  // namespace
146*9356374aSAndroid Build Coastguard Worker 
147*9356374aSAndroid Build Coastguard Worker struct LogMessage::LogMessageData final {
148*9356374aSAndroid Build Coastguard Worker   LogMessageData(const char* file, int line, absl::LogSeverity severity,
149*9356374aSAndroid Build Coastguard Worker                  absl::Time timestamp);
150*9356374aSAndroid Build Coastguard Worker   LogMessageData(const LogMessageData&) = delete;
151*9356374aSAndroid Build Coastguard Worker   LogMessageData& operator=(const LogMessageData&) = delete;
152*9356374aSAndroid Build Coastguard Worker 
153*9356374aSAndroid Build Coastguard Worker   // `LogEntry` sent to `LogSink`s; contains metadata.
154*9356374aSAndroid Build Coastguard Worker   absl::LogEntry entry;
155*9356374aSAndroid Build Coastguard Worker 
156*9356374aSAndroid Build Coastguard Worker   // true => this was first fatal msg
157*9356374aSAndroid Build Coastguard Worker   bool first_fatal;
158*9356374aSAndroid Build Coastguard Worker   // true => all failures should be quiet
159*9356374aSAndroid Build Coastguard Worker   bool fail_quietly;
160*9356374aSAndroid Build Coastguard Worker   // true => PLOG was requested
161*9356374aSAndroid Build Coastguard Worker   bool is_perror;
162*9356374aSAndroid Build Coastguard Worker 
163*9356374aSAndroid Build Coastguard Worker   // Extra `LogSink`s to log to, in addition to `global_sinks`.
164*9356374aSAndroid Build Coastguard Worker   absl::InlinedVector<absl::LogSink*, 16> extra_sinks;
165*9356374aSAndroid Build Coastguard Worker   // If true, log to `extra_sinks` but not to `global_sinks` or hardcoded
166*9356374aSAndroid Build Coastguard Worker   // non-sink targets (e.g. stderr, log files).
167*9356374aSAndroid Build Coastguard Worker   bool extra_sinks_only;
168*9356374aSAndroid Build Coastguard Worker 
169*9356374aSAndroid Build Coastguard Worker   std::ostream manipulated;  // ostream with IO manipulators applied
170*9356374aSAndroid Build Coastguard Worker 
171*9356374aSAndroid Build Coastguard Worker   // A `logging.proto.Event` proto message is built into `encoded_buf`.
172*9356374aSAndroid Build Coastguard Worker   std::array<char, kLogMessageBufferSize> encoded_buf;
173*9356374aSAndroid Build Coastguard Worker   // `encoded_remaining()` is the suffix of `encoded_buf` that has not been
174*9356374aSAndroid Build Coastguard Worker   // filled yet.  If a datum to be encoded does not fit into
175*9356374aSAndroid Build Coastguard Worker   // `encoded_remaining()` and cannot be truncated to fit, the size of
176*9356374aSAndroid Build Coastguard Worker   // `encoded_remaining()` will be zeroed to prevent encoding of any further
177*9356374aSAndroid Build Coastguard Worker   // data.  Note that in this case its `data()` pointer will not point past the
178*9356374aSAndroid Build Coastguard Worker   // end of `encoded_buf`.
179*9356374aSAndroid Build Coastguard Worker   // The first use of `encoded_remaining()` is our chance to record metadata
180*9356374aSAndroid Build Coastguard Worker   // after any modifications (e.g. by `AtLocation()`) but before any data have
181*9356374aSAndroid Build Coastguard Worker   // been recorded.  We want to record metadata before data so that data are
182*9356374aSAndroid Build Coastguard Worker   // preferentially truncated if we run out of buffer.
encoded_remainingabsl::log_internal::LogMessage::LogMessageData183*9356374aSAndroid Build Coastguard Worker   absl::Span<char>& encoded_remaining() {
184*9356374aSAndroid Build Coastguard Worker     if (encoded_remaining_actual_do_not_use_directly.data() == nullptr) {
185*9356374aSAndroid Build Coastguard Worker       encoded_remaining_actual_do_not_use_directly =
186*9356374aSAndroid Build Coastguard Worker           absl::MakeSpan(encoded_buf);
187*9356374aSAndroid Build Coastguard Worker       InitializeEncodingAndFormat();
188*9356374aSAndroid Build Coastguard Worker     }
189*9356374aSAndroid Build Coastguard Worker     return encoded_remaining_actual_do_not_use_directly;
190*9356374aSAndroid Build Coastguard Worker   }
191*9356374aSAndroid Build Coastguard Worker   absl::Span<char> encoded_remaining_actual_do_not_use_directly;
192*9356374aSAndroid Build Coastguard Worker 
193*9356374aSAndroid Build Coastguard Worker   // A formatted string message is built in `string_buf`.
194*9356374aSAndroid Build Coastguard Worker   std::array<char, kLogMessageBufferSize> string_buf;
195*9356374aSAndroid Build Coastguard Worker 
196*9356374aSAndroid Build Coastguard Worker   void InitializeEncodingAndFormat();
197*9356374aSAndroid Build Coastguard Worker   void FinalizeEncodingAndFormat();
198*9356374aSAndroid Build Coastguard Worker };
199*9356374aSAndroid Build Coastguard Worker 
LogMessageData(const char * file,int line,absl::LogSeverity severity,absl::Time timestamp)200*9356374aSAndroid Build Coastguard Worker LogMessage::LogMessageData::LogMessageData(const char* file, int line,
201*9356374aSAndroid Build Coastguard Worker                                            absl::LogSeverity severity,
202*9356374aSAndroid Build Coastguard Worker                                            absl::Time timestamp)
203*9356374aSAndroid Build Coastguard Worker     : extra_sinks_only(false), manipulated(nullptr) {
204*9356374aSAndroid Build Coastguard Worker   // Legacy defaults for LOG's ostream:
205*9356374aSAndroid Build Coastguard Worker   manipulated.setf(std::ios_base::showbase | std::ios_base::boolalpha);
206*9356374aSAndroid Build Coastguard Worker   entry.full_filename_ = file;
207*9356374aSAndroid Build Coastguard Worker   entry.base_filename_ = Basename(file);
208*9356374aSAndroid Build Coastguard Worker   entry.line_ = line;
209*9356374aSAndroid Build Coastguard Worker   entry.prefix_ = absl::ShouldPrependLogPrefix();
210*9356374aSAndroid Build Coastguard Worker   entry.severity_ = absl::NormalizeLogSeverity(severity);
211*9356374aSAndroid Build Coastguard Worker   entry.verbose_level_ = absl::LogEntry::kNoVerbosityLevel;
212*9356374aSAndroid Build Coastguard Worker   entry.timestamp_ = timestamp;
213*9356374aSAndroid Build Coastguard Worker   entry.tid_ = absl::base_internal::GetCachedTID();
214*9356374aSAndroid Build Coastguard Worker }
215*9356374aSAndroid Build Coastguard Worker 
InitializeEncodingAndFormat()216*9356374aSAndroid Build Coastguard Worker void LogMessage::LogMessageData::InitializeEncodingAndFormat() {
217*9356374aSAndroid Build Coastguard Worker   EncodeStringTruncate(EventTag::kFileName, entry.source_filename(),
218*9356374aSAndroid Build Coastguard Worker                        &encoded_remaining());
219*9356374aSAndroid Build Coastguard Worker   EncodeVarint(EventTag::kFileLine, entry.source_line(), &encoded_remaining());
220*9356374aSAndroid Build Coastguard Worker   EncodeVarint(EventTag::kTimeNsecs, absl::ToUnixNanos(entry.timestamp()),
221*9356374aSAndroid Build Coastguard Worker                &encoded_remaining());
222*9356374aSAndroid Build Coastguard Worker   EncodeVarint(EventTag::kSeverity,
223*9356374aSAndroid Build Coastguard Worker                ProtoSeverity(entry.log_severity(), entry.verbosity()),
224*9356374aSAndroid Build Coastguard Worker                &encoded_remaining());
225*9356374aSAndroid Build Coastguard Worker   EncodeVarint(EventTag::kThreadId, entry.tid(), &encoded_remaining());
226*9356374aSAndroid Build Coastguard Worker }
227*9356374aSAndroid Build Coastguard Worker 
FinalizeEncodingAndFormat()228*9356374aSAndroid Build Coastguard Worker void LogMessage::LogMessageData::FinalizeEncodingAndFormat() {
229*9356374aSAndroid Build Coastguard Worker   // Note that `encoded_remaining()` may have zero size without pointing past
230*9356374aSAndroid Build Coastguard Worker   // the end of `encoded_buf`, so the difference between `data()` pointers is
231*9356374aSAndroid Build Coastguard Worker   // used to compute the size of `encoded_data`.
232*9356374aSAndroid Build Coastguard Worker   absl::Span<const char> encoded_data(
233*9356374aSAndroid Build Coastguard Worker       encoded_buf.data(),
234*9356374aSAndroid Build Coastguard Worker       static_cast<size_t>(encoded_remaining().data() - encoded_buf.data()));
235*9356374aSAndroid Build Coastguard Worker   // `string_remaining` is the suffix of `string_buf` that has not been filled
236*9356374aSAndroid Build Coastguard Worker   // yet.
237*9356374aSAndroid Build Coastguard Worker   absl::Span<char> string_remaining(string_buf);
238*9356374aSAndroid Build Coastguard Worker   // We may need to write a newline and nul-terminator at the end of the decoded
239*9356374aSAndroid Build Coastguard Worker   // string data.  Rather than worry about whether those should overwrite the
240*9356374aSAndroid Build Coastguard Worker   // end of the string (if the buffer is full) or be appended, we avoid writing
241*9356374aSAndroid Build Coastguard Worker   // into the last two bytes so we always have space to append.
242*9356374aSAndroid Build Coastguard Worker   string_remaining.remove_suffix(2);
243*9356374aSAndroid Build Coastguard Worker   entry.prefix_len_ =
244*9356374aSAndroid Build Coastguard Worker       entry.prefix() ? log_internal::FormatLogPrefix(
245*9356374aSAndroid Build Coastguard Worker                            entry.log_severity(), entry.timestamp(), entry.tid(),
246*9356374aSAndroid Build Coastguard Worker                            entry.source_basename(), entry.source_line(),
247*9356374aSAndroid Build Coastguard Worker                            log_internal::ThreadIsLoggingToLogSink()
248*9356374aSAndroid Build Coastguard Worker                                ? PrefixFormat::kRaw
249*9356374aSAndroid Build Coastguard Worker                                : PrefixFormat::kNotRaw,
250*9356374aSAndroid Build Coastguard Worker                            string_remaining)
251*9356374aSAndroid Build Coastguard Worker                      : 0;
252*9356374aSAndroid Build Coastguard Worker   // Decode data from `encoded_buf` until we run out of data or we run out of
253*9356374aSAndroid Build Coastguard Worker   // `string_remaining`.
254*9356374aSAndroid Build Coastguard Worker   ProtoField field;
255*9356374aSAndroid Build Coastguard Worker   while (field.DecodeFrom(&encoded_data)) {
256*9356374aSAndroid Build Coastguard Worker     switch (field.tag()) {
257*9356374aSAndroid Build Coastguard Worker       case EventTag::kValue:
258*9356374aSAndroid Build Coastguard Worker         if (field.type() != WireType::kLengthDelimited) continue;
259*9356374aSAndroid Build Coastguard Worker         if (PrintValue(string_remaining, field.bytes_value())) continue;
260*9356374aSAndroid Build Coastguard Worker         break;
261*9356374aSAndroid Build Coastguard Worker     }
262*9356374aSAndroid Build Coastguard Worker   }
263*9356374aSAndroid Build Coastguard Worker   auto chars_written =
264*9356374aSAndroid Build Coastguard Worker       static_cast<size_t>(string_remaining.data() - string_buf.data());
265*9356374aSAndroid Build Coastguard Worker     string_buf[chars_written++] = '\n';
266*9356374aSAndroid Build Coastguard Worker   string_buf[chars_written++] = '\0';
267*9356374aSAndroid Build Coastguard Worker   entry.text_message_with_prefix_and_newline_and_nul_ =
268*9356374aSAndroid Build Coastguard Worker       absl::MakeSpan(string_buf).subspan(0, chars_written);
269*9356374aSAndroid Build Coastguard Worker }
270*9356374aSAndroid Build Coastguard Worker 
LogMessage(const char * file,int line,absl::LogSeverity severity)271*9356374aSAndroid Build Coastguard Worker LogMessage::LogMessage(const char* file, int line, absl::LogSeverity severity)
272*9356374aSAndroid Build Coastguard Worker     : data_(absl::make_unique<LogMessageData>(file, line, severity,
273*9356374aSAndroid Build Coastguard Worker                                               absl::Now())) {
274*9356374aSAndroid Build Coastguard Worker   data_->first_fatal = false;
275*9356374aSAndroid Build Coastguard Worker   data_->is_perror = false;
276*9356374aSAndroid Build Coastguard Worker   data_->fail_quietly = false;
277*9356374aSAndroid Build Coastguard Worker 
278*9356374aSAndroid Build Coastguard Worker   // This logs a backtrace even if the location is subsequently changed using
279*9356374aSAndroid Build Coastguard Worker   // AtLocation.  This quirk, and the behavior when AtLocation is called twice,
280*9356374aSAndroid Build Coastguard Worker   // are fixable but probably not worth fixing.
281*9356374aSAndroid Build Coastguard Worker   LogBacktraceIfNeeded();
282*9356374aSAndroid Build Coastguard Worker }
283*9356374aSAndroid Build Coastguard Worker 
LogMessage(const char * file,int line,InfoTag)284*9356374aSAndroid Build Coastguard Worker LogMessage::LogMessage(const char* file, int line, InfoTag)
285*9356374aSAndroid Build Coastguard Worker     : LogMessage(file, line, absl::LogSeverity::kInfo) {}
LogMessage(const char * file,int line,WarningTag)286*9356374aSAndroid Build Coastguard Worker LogMessage::LogMessage(const char* file, int line, WarningTag)
287*9356374aSAndroid Build Coastguard Worker     : LogMessage(file, line, absl::LogSeverity::kWarning) {}
LogMessage(const char * file,int line,ErrorTag)288*9356374aSAndroid Build Coastguard Worker LogMessage::LogMessage(const char* file, int line, ErrorTag)
289*9356374aSAndroid Build Coastguard Worker     : LogMessage(file, line, absl::LogSeverity::kError) {}
290*9356374aSAndroid Build Coastguard Worker 
~LogMessage()291*9356374aSAndroid Build Coastguard Worker LogMessage::~LogMessage() {
292*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_MIN_LOG_LEVEL
293*9356374aSAndroid Build Coastguard Worker   if (data_->entry.log_severity() <
294*9356374aSAndroid Build Coastguard Worker           static_cast<absl::LogSeverity>(ABSL_MIN_LOG_LEVEL) &&
295*9356374aSAndroid Build Coastguard Worker       data_->entry.log_severity() < absl::LogSeverity::kFatal) {
296*9356374aSAndroid Build Coastguard Worker     return;
297*9356374aSAndroid Build Coastguard Worker   }
298*9356374aSAndroid Build Coastguard Worker #endif
299*9356374aSAndroid Build Coastguard Worker   Flush();
300*9356374aSAndroid Build Coastguard Worker }
301*9356374aSAndroid Build Coastguard Worker 
AtLocation(absl::string_view file,int line)302*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::AtLocation(absl::string_view file, int line) {
303*9356374aSAndroid Build Coastguard Worker   data_->entry.full_filename_ = file;
304*9356374aSAndroid Build Coastguard Worker   data_->entry.base_filename_ = Basename(file);
305*9356374aSAndroid Build Coastguard Worker   data_->entry.line_ = line;
306*9356374aSAndroid Build Coastguard Worker   LogBacktraceIfNeeded();
307*9356374aSAndroid Build Coastguard Worker   return *this;
308*9356374aSAndroid Build Coastguard Worker }
309*9356374aSAndroid Build Coastguard Worker 
NoPrefix()310*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::NoPrefix() {
311*9356374aSAndroid Build Coastguard Worker   data_->entry.prefix_ = false;
312*9356374aSAndroid Build Coastguard Worker   return *this;
313*9356374aSAndroid Build Coastguard Worker }
314*9356374aSAndroid Build Coastguard Worker 
WithVerbosity(int verbose_level)315*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::WithVerbosity(int verbose_level) {
316*9356374aSAndroid Build Coastguard Worker   if (verbose_level == absl::LogEntry::kNoVerbosityLevel) {
317*9356374aSAndroid Build Coastguard Worker     data_->entry.verbose_level_ = absl::LogEntry::kNoVerbosityLevel;
318*9356374aSAndroid Build Coastguard Worker   } else {
319*9356374aSAndroid Build Coastguard Worker     data_->entry.verbose_level_ = std::max(0, verbose_level);
320*9356374aSAndroid Build Coastguard Worker   }
321*9356374aSAndroid Build Coastguard Worker   return *this;
322*9356374aSAndroid Build Coastguard Worker }
323*9356374aSAndroid Build Coastguard Worker 
WithTimestamp(absl::Time timestamp)324*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::WithTimestamp(absl::Time timestamp) {
325*9356374aSAndroid Build Coastguard Worker   data_->entry.timestamp_ = timestamp;
326*9356374aSAndroid Build Coastguard Worker   return *this;
327*9356374aSAndroid Build Coastguard Worker }
328*9356374aSAndroid Build Coastguard Worker 
WithThreadID(absl::LogEntry::tid_t tid)329*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::WithThreadID(absl::LogEntry::tid_t tid) {
330*9356374aSAndroid Build Coastguard Worker   data_->entry.tid_ = tid;
331*9356374aSAndroid Build Coastguard Worker   return *this;
332*9356374aSAndroid Build Coastguard Worker }
333*9356374aSAndroid Build Coastguard Worker 
WithMetadataFrom(const absl::LogEntry & entry)334*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::WithMetadataFrom(const absl::LogEntry& entry) {
335*9356374aSAndroid Build Coastguard Worker   data_->entry.full_filename_ = entry.full_filename_;
336*9356374aSAndroid Build Coastguard Worker   data_->entry.base_filename_ = entry.base_filename_;
337*9356374aSAndroid Build Coastguard Worker   data_->entry.line_ = entry.line_;
338*9356374aSAndroid Build Coastguard Worker   data_->entry.prefix_ = entry.prefix_;
339*9356374aSAndroid Build Coastguard Worker   data_->entry.severity_ = entry.severity_;
340*9356374aSAndroid Build Coastguard Worker   data_->entry.verbose_level_ = entry.verbose_level_;
341*9356374aSAndroid Build Coastguard Worker   data_->entry.timestamp_ = entry.timestamp_;
342*9356374aSAndroid Build Coastguard Worker   data_->entry.tid_ = entry.tid_;
343*9356374aSAndroid Build Coastguard Worker   return *this;
344*9356374aSAndroid Build Coastguard Worker }
345*9356374aSAndroid Build Coastguard Worker 
WithPerror()346*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::WithPerror() {
347*9356374aSAndroid Build Coastguard Worker   data_->is_perror = true;
348*9356374aSAndroid Build Coastguard Worker   return *this;
349*9356374aSAndroid Build Coastguard Worker }
350*9356374aSAndroid Build Coastguard Worker 
ToSinkAlso(absl::LogSink * sink)351*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::ToSinkAlso(absl::LogSink* sink) {
352*9356374aSAndroid Build Coastguard Worker   ABSL_INTERNAL_CHECK(sink, "null LogSink*");
353*9356374aSAndroid Build Coastguard Worker   data_->extra_sinks.push_back(sink);
354*9356374aSAndroid Build Coastguard Worker   return *this;
355*9356374aSAndroid Build Coastguard Worker }
356*9356374aSAndroid Build Coastguard Worker 
ToSinkOnly(absl::LogSink * sink)357*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::ToSinkOnly(absl::LogSink* sink) {
358*9356374aSAndroid Build Coastguard Worker   ABSL_INTERNAL_CHECK(sink, "null LogSink*");
359*9356374aSAndroid Build Coastguard Worker   data_->extra_sinks.clear();
360*9356374aSAndroid Build Coastguard Worker   data_->extra_sinks.push_back(sink);
361*9356374aSAndroid Build Coastguard Worker   data_->extra_sinks_only = true;
362*9356374aSAndroid Build Coastguard Worker   return *this;
363*9356374aSAndroid Build Coastguard Worker }
364*9356374aSAndroid Build Coastguard Worker 
365*9356374aSAndroid Build Coastguard Worker #ifdef __ELF__
366*9356374aSAndroid Build Coastguard Worker extern "C" void __gcov_dump() ABSL_ATTRIBUTE_WEAK;
367*9356374aSAndroid Build Coastguard Worker extern "C" void __gcov_flush() ABSL_ATTRIBUTE_WEAK;
368*9356374aSAndroid Build Coastguard Worker #endif
369*9356374aSAndroid Build Coastguard Worker 
FailWithoutStackTrace()370*9356374aSAndroid Build Coastguard Worker void LogMessage::FailWithoutStackTrace() {
371*9356374aSAndroid Build Coastguard Worker   // Now suppress repeated trace logging:
372*9356374aSAndroid Build Coastguard Worker   log_internal::SetSuppressSigabortTrace(true);
373*9356374aSAndroid Build Coastguard Worker #if defined _DEBUG && defined COMPILER_MSVC
374*9356374aSAndroid Build Coastguard Worker   // When debugging on windows, avoid the obnoxious dialog.
375*9356374aSAndroid Build Coastguard Worker   __debugbreak();
376*9356374aSAndroid Build Coastguard Worker #endif
377*9356374aSAndroid Build Coastguard Worker 
378*9356374aSAndroid Build Coastguard Worker #ifdef __ELF__
379*9356374aSAndroid Build Coastguard Worker   // For b/8737634, flush coverage if we are in coverage mode.
380*9356374aSAndroid Build Coastguard Worker   if (&__gcov_dump != nullptr) {
381*9356374aSAndroid Build Coastguard Worker     __gcov_dump();
382*9356374aSAndroid Build Coastguard Worker   } else if (&__gcov_flush != nullptr) {
383*9356374aSAndroid Build Coastguard Worker     __gcov_flush();
384*9356374aSAndroid Build Coastguard Worker   }
385*9356374aSAndroid Build Coastguard Worker #endif
386*9356374aSAndroid Build Coastguard Worker 
387*9356374aSAndroid Build Coastguard Worker   abort();
388*9356374aSAndroid Build Coastguard Worker }
389*9356374aSAndroid Build Coastguard Worker 
FailQuietly()390*9356374aSAndroid Build Coastguard Worker void LogMessage::FailQuietly() {
391*9356374aSAndroid Build Coastguard Worker   // _exit. Calling abort() would trigger all sorts of death signal handlers
392*9356374aSAndroid Build Coastguard Worker   // and a detailed stack trace. Calling exit() would trigger the onexit
393*9356374aSAndroid Build Coastguard Worker   // handlers, including the heap-leak checker, which is guaranteed to fail in
394*9356374aSAndroid Build Coastguard Worker   // this case: we probably just new'ed the std::string that we logged.
395*9356374aSAndroid Build Coastguard Worker   // Anyway, if you're calling Fail or FailQuietly, you're trying to bail out
396*9356374aSAndroid Build Coastguard Worker   // of the program quickly, and it doesn't make much sense for FailQuietly to
397*9356374aSAndroid Build Coastguard Worker   // offer different guarantees about exit behavior than Fail does. (And as a
398*9356374aSAndroid Build Coastguard Worker   // consequence for QCHECK and CHECK to offer different exit behaviors)
399*9356374aSAndroid Build Coastguard Worker   _exit(1);
400*9356374aSAndroid Build Coastguard Worker }
401*9356374aSAndroid Build Coastguard Worker 
operator <<(const std::string & v)402*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(const std::string& v) {
403*9356374aSAndroid Build Coastguard Worker   CopyToEncodedBuffer<StringType::kNotLiteral>(v);
404*9356374aSAndroid Build Coastguard Worker   return *this;
405*9356374aSAndroid Build Coastguard Worker }
406*9356374aSAndroid Build Coastguard Worker 
operator <<(absl::string_view v)407*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(absl::string_view v) {
408*9356374aSAndroid Build Coastguard Worker   CopyToEncodedBuffer<StringType::kNotLiteral>(v);
409*9356374aSAndroid Build Coastguard Worker   return *this;
410*9356374aSAndroid Build Coastguard Worker }
operator <<(std::ostream & (* m)(std::ostream & os))411*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(std::ostream& (*m)(std::ostream& os)) {
412*9356374aSAndroid Build Coastguard Worker   OstreamView view(*data_);
413*9356374aSAndroid Build Coastguard Worker   data_->manipulated << m;
414*9356374aSAndroid Build Coastguard Worker   return *this;
415*9356374aSAndroid Build Coastguard Worker }
operator <<(std::ios_base & (* m)(std::ios_base & os))416*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(std::ios_base& (*m)(std::ios_base& os)) {
417*9356374aSAndroid Build Coastguard Worker   OstreamView view(*data_);
418*9356374aSAndroid Build Coastguard Worker   data_->manipulated << m;
419*9356374aSAndroid Build Coastguard Worker   return *this;
420*9356374aSAndroid Build Coastguard Worker }
421*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const char& v);
422*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const signed char& v);
423*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const unsigned char& v);
424*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const short& v);           // NOLINT
425*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const unsigned short& v);  // NOLINT
426*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const int& v);
427*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const unsigned int& v);
428*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const long& v);           // NOLINT
429*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const unsigned long& v);  // NOLINT
430*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const long long& v);      // NOLINT
431*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(
432*9356374aSAndroid Build Coastguard Worker     const unsigned long long& v);  // NOLINT
433*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(void* const& v);
434*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const void* const& v);
435*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const float& v);
436*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const double& v);
437*9356374aSAndroid Build Coastguard Worker template LogMessage& LogMessage::operator<<(const bool& v);
438*9356374aSAndroid Build Coastguard Worker 
Flush()439*9356374aSAndroid Build Coastguard Worker void LogMessage::Flush() {
440*9356374aSAndroid Build Coastguard Worker   if (data_->entry.log_severity() < absl::MinLogLevel()) return;
441*9356374aSAndroid Build Coastguard Worker 
442*9356374aSAndroid Build Coastguard Worker   if (data_->is_perror) {
443*9356374aSAndroid Build Coastguard Worker     InternalStream() << ": " << absl::base_internal::StrError(errno_saver_())
444*9356374aSAndroid Build Coastguard Worker                      << " [" << errno_saver_() << "]";
445*9356374aSAndroid Build Coastguard Worker   }
446*9356374aSAndroid Build Coastguard Worker 
447*9356374aSAndroid Build Coastguard Worker   // Have we already seen a fatal message?
448*9356374aSAndroid Build Coastguard Worker   ABSL_CONST_INIT static std::atomic<bool> seen_fatal(false);
449*9356374aSAndroid Build Coastguard Worker   if (data_->entry.log_severity() == absl::LogSeverity::kFatal &&
450*9356374aSAndroid Build Coastguard Worker       absl::log_internal::ExitOnDFatal()) {
451*9356374aSAndroid Build Coastguard Worker     // Exactly one LOG(FATAL) message is responsible for aborting the process,
452*9356374aSAndroid Build Coastguard Worker     // even if multiple threads LOG(FATAL) concurrently.
453*9356374aSAndroid Build Coastguard Worker     bool expected_seen_fatal = false;
454*9356374aSAndroid Build Coastguard Worker     if (seen_fatal.compare_exchange_strong(expected_seen_fatal, true,
455*9356374aSAndroid Build Coastguard Worker                                            std::memory_order_relaxed)) {
456*9356374aSAndroid Build Coastguard Worker       data_->first_fatal = true;
457*9356374aSAndroid Build Coastguard Worker     }
458*9356374aSAndroid Build Coastguard Worker   }
459*9356374aSAndroid Build Coastguard Worker 
460*9356374aSAndroid Build Coastguard Worker   data_->FinalizeEncodingAndFormat();
461*9356374aSAndroid Build Coastguard Worker   data_->entry.encoding_ =
462*9356374aSAndroid Build Coastguard Worker       absl::string_view(data_->encoded_buf.data(),
463*9356374aSAndroid Build Coastguard Worker                         static_cast<size_t>(data_->encoded_remaining().data() -
464*9356374aSAndroid Build Coastguard Worker                                             data_->encoded_buf.data()));
465*9356374aSAndroid Build Coastguard Worker   SendToLog();
466*9356374aSAndroid Build Coastguard Worker }
467*9356374aSAndroid Build Coastguard Worker 
SetFailQuietly()468*9356374aSAndroid Build Coastguard Worker void LogMessage::SetFailQuietly() { data_->fail_quietly = true; }
469*9356374aSAndroid Build Coastguard Worker 
OstreamView(LogMessageData & message_data)470*9356374aSAndroid Build Coastguard Worker LogMessage::OstreamView::OstreamView(LogMessageData& message_data)
471*9356374aSAndroid Build Coastguard Worker     : data_(message_data), encoded_remaining_copy_(data_.encoded_remaining()) {
472*9356374aSAndroid Build Coastguard Worker   // This constructor sets the `streambuf` up so that streaming into an attached
473*9356374aSAndroid Build Coastguard Worker   // ostream encodes string data in-place.  To do that, we write appropriate
474*9356374aSAndroid Build Coastguard Worker   // headers into the buffer using a copy of the buffer view so that we can
475*9356374aSAndroid Build Coastguard Worker   // decide not to keep them later if nothing is ever streamed in.  We don't
476*9356374aSAndroid Build Coastguard Worker   // know how much data we'll get, but we can use the size of the remaining
477*9356374aSAndroid Build Coastguard Worker   // buffer as an upper bound and fill in the right size once we know it.
478*9356374aSAndroid Build Coastguard Worker   message_start_ =
479*9356374aSAndroid Build Coastguard Worker       EncodeMessageStart(EventTag::kValue, encoded_remaining_copy_.size(),
480*9356374aSAndroid Build Coastguard Worker                          &encoded_remaining_copy_);
481*9356374aSAndroid Build Coastguard Worker   string_start_ =
482*9356374aSAndroid Build Coastguard Worker       EncodeMessageStart(ValueTag::kString, encoded_remaining_copy_.size(),
483*9356374aSAndroid Build Coastguard Worker                          &encoded_remaining_copy_);
484*9356374aSAndroid Build Coastguard Worker   setp(encoded_remaining_copy_.data(),
485*9356374aSAndroid Build Coastguard Worker        encoded_remaining_copy_.data() + encoded_remaining_copy_.size());
486*9356374aSAndroid Build Coastguard Worker   data_.manipulated.rdbuf(this);
487*9356374aSAndroid Build Coastguard Worker }
488*9356374aSAndroid Build Coastguard Worker 
~OstreamView()489*9356374aSAndroid Build Coastguard Worker LogMessage::OstreamView::~OstreamView() {
490*9356374aSAndroid Build Coastguard Worker   data_.manipulated.rdbuf(nullptr);
491*9356374aSAndroid Build Coastguard Worker   if (!string_start_.data()) {
492*9356374aSAndroid Build Coastguard Worker     // The second field header didn't fit.  Whether the first one did or not, we
493*9356374aSAndroid Build Coastguard Worker     // shouldn't commit `encoded_remaining_copy_`, and we also need to zero the
494*9356374aSAndroid Build Coastguard Worker     // size of `data_->encoded_remaining()` so that no more data are encoded.
495*9356374aSAndroid Build Coastguard Worker     data_.encoded_remaining().remove_suffix(data_.encoded_remaining().size());
496*9356374aSAndroid Build Coastguard Worker     return;
497*9356374aSAndroid Build Coastguard Worker   }
498*9356374aSAndroid Build Coastguard Worker   const absl::Span<const char> contents(pbase(),
499*9356374aSAndroid Build Coastguard Worker                                         static_cast<size_t>(pptr() - pbase()));
500*9356374aSAndroid Build Coastguard Worker   if (contents.empty()) return;
501*9356374aSAndroid Build Coastguard Worker   encoded_remaining_copy_.remove_prefix(contents.size());
502*9356374aSAndroid Build Coastguard Worker   EncodeMessageLength(string_start_, &encoded_remaining_copy_);
503*9356374aSAndroid Build Coastguard Worker   EncodeMessageLength(message_start_, &encoded_remaining_copy_);
504*9356374aSAndroid Build Coastguard Worker   data_.encoded_remaining() = encoded_remaining_copy_;
505*9356374aSAndroid Build Coastguard Worker }
506*9356374aSAndroid Build Coastguard Worker 
stream()507*9356374aSAndroid Build Coastguard Worker std::ostream& LogMessage::OstreamView::stream() { return data_.manipulated; }
508*9356374aSAndroid Build Coastguard Worker 
IsFatal() const509*9356374aSAndroid Build Coastguard Worker bool LogMessage::IsFatal() const {
510*9356374aSAndroid Build Coastguard Worker   return data_->entry.log_severity() == absl::LogSeverity::kFatal &&
511*9356374aSAndroid Build Coastguard Worker          absl::log_internal::ExitOnDFatal();
512*9356374aSAndroid Build Coastguard Worker }
513*9356374aSAndroid Build Coastguard Worker 
PrepareToDie()514*9356374aSAndroid Build Coastguard Worker void LogMessage::PrepareToDie() {
515*9356374aSAndroid Build Coastguard Worker   // If we log a FATAL message, flush all the log destinations, then toss
516*9356374aSAndroid Build Coastguard Worker   // a signal for others to catch. We leave the logs in a state that
517*9356374aSAndroid Build Coastguard Worker   // someone else can use them (as long as they flush afterwards)
518*9356374aSAndroid Build Coastguard Worker   if (data_->first_fatal) {
519*9356374aSAndroid Build Coastguard Worker     // Notify observers about the upcoming fatal error.
520*9356374aSAndroid Build Coastguard Worker     ABSL_INTERNAL_C_SYMBOL(AbslInternalOnFatalLogMessage)(data_->entry);
521*9356374aSAndroid Build Coastguard Worker   }
522*9356374aSAndroid Build Coastguard Worker 
523*9356374aSAndroid Build Coastguard Worker   if (!data_->fail_quietly) {
524*9356374aSAndroid Build Coastguard Worker     // Log the message first before we start collecting stack trace.
525*9356374aSAndroid Build Coastguard Worker     log_internal::LogToSinks(data_->entry, absl::MakeSpan(data_->extra_sinks),
526*9356374aSAndroid Build Coastguard Worker                              data_->extra_sinks_only);
527*9356374aSAndroid Build Coastguard Worker 
528*9356374aSAndroid Build Coastguard Worker     // `DumpStackTrace` generates an empty string under MSVC.
529*9356374aSAndroid Build Coastguard Worker     // Adding the constant prefix here simplifies testing.
530*9356374aSAndroid Build Coastguard Worker     data_->entry.stacktrace_ = "*** Check failure stack trace: ***\n";
531*9356374aSAndroid Build Coastguard Worker     debugging_internal::DumpStackTrace(
532*9356374aSAndroid Build Coastguard Worker         0, log_internal::MaxFramesInLogStackTrace(),
533*9356374aSAndroid Build Coastguard Worker         log_internal::ShouldSymbolizeLogStackTrace(), WriteToString,
534*9356374aSAndroid Build Coastguard Worker         &data_->entry.stacktrace_);
535*9356374aSAndroid Build Coastguard Worker   }
536*9356374aSAndroid Build Coastguard Worker }
537*9356374aSAndroid Build Coastguard Worker 
Die()538*9356374aSAndroid Build Coastguard Worker void LogMessage::Die() {
539*9356374aSAndroid Build Coastguard Worker   absl::FlushLogSinks();
540*9356374aSAndroid Build Coastguard Worker 
541*9356374aSAndroid Build Coastguard Worker   if (data_->fail_quietly) {
542*9356374aSAndroid Build Coastguard Worker     FailQuietly();
543*9356374aSAndroid Build Coastguard Worker   } else {
544*9356374aSAndroid Build Coastguard Worker     FailWithoutStackTrace();
545*9356374aSAndroid Build Coastguard Worker   }
546*9356374aSAndroid Build Coastguard Worker }
547*9356374aSAndroid Build Coastguard Worker 
SendToLog()548*9356374aSAndroid Build Coastguard Worker void LogMessage::SendToLog() {
549*9356374aSAndroid Build Coastguard Worker   if (IsFatal()) PrepareToDie();
550*9356374aSAndroid Build Coastguard Worker   // Also log to all registered sinks, even if OnlyLogToStderr() is set.
551*9356374aSAndroid Build Coastguard Worker   log_internal::LogToSinks(data_->entry, absl::MakeSpan(data_->extra_sinks),
552*9356374aSAndroid Build Coastguard Worker                            data_->extra_sinks_only);
553*9356374aSAndroid Build Coastguard Worker   if (IsFatal()) Die();
554*9356374aSAndroid Build Coastguard Worker }
555*9356374aSAndroid Build Coastguard Worker 
LogBacktraceIfNeeded()556*9356374aSAndroid Build Coastguard Worker void LogMessage::LogBacktraceIfNeeded() {
557*9356374aSAndroid Build Coastguard Worker   if (!absl::log_internal::IsInitialized()) return;
558*9356374aSAndroid Build Coastguard Worker 
559*9356374aSAndroid Build Coastguard Worker   if (!absl::log_internal::ShouldLogBacktraceAt(data_->entry.source_basename(),
560*9356374aSAndroid Build Coastguard Worker                                                 data_->entry.source_line()))
561*9356374aSAndroid Build Coastguard Worker     return;
562*9356374aSAndroid Build Coastguard Worker   OstreamView view(*data_);
563*9356374aSAndroid Build Coastguard Worker   view.stream() << " (stacktrace:\n";
564*9356374aSAndroid Build Coastguard Worker   debugging_internal::DumpStackTrace(
565*9356374aSAndroid Build Coastguard Worker       1, log_internal::MaxFramesInLogStackTrace(),
566*9356374aSAndroid Build Coastguard Worker       log_internal::ShouldSymbolizeLogStackTrace(), WriteToStream,
567*9356374aSAndroid Build Coastguard Worker       &view.stream());
568*9356374aSAndroid Build Coastguard Worker   view.stream() << ") ";
569*9356374aSAndroid Build Coastguard Worker }
570*9356374aSAndroid Build Coastguard Worker 
571*9356374aSAndroid Build Coastguard Worker // Encodes into `data_->encoded_remaining()` a partial `logging.proto.Event`
572*9356374aSAndroid Build Coastguard Worker // containing the specified string data using a `Value` field appropriate to
573*9356374aSAndroid Build Coastguard Worker // `str_type`.  Truncates `str` if necessary, but emits nothing and marks the
574*9356374aSAndroid Build Coastguard Worker // buffer full if  even the field headers do not fit.
575*9356374aSAndroid Build Coastguard Worker template <LogMessage::StringType str_type>
CopyToEncodedBuffer(absl::string_view str)576*9356374aSAndroid Build Coastguard Worker void LogMessage::CopyToEncodedBuffer(absl::string_view str) {
577*9356374aSAndroid Build Coastguard Worker   auto encoded_remaining_copy = data_->encoded_remaining();
578*9356374aSAndroid Build Coastguard Worker   auto start = EncodeMessageStart(
579*9356374aSAndroid Build Coastguard Worker       EventTag::kValue, BufferSizeFor(WireType::kLengthDelimited) + str.size(),
580*9356374aSAndroid Build Coastguard Worker       &encoded_remaining_copy);
581*9356374aSAndroid Build Coastguard Worker   // If the `logging.proto.Event.value` field header did not fit,
582*9356374aSAndroid Build Coastguard Worker   // `EncodeMessageStart` will have zeroed `encoded_remaining_copy`'s size and
583*9356374aSAndroid Build Coastguard Worker   // `EncodeStringTruncate` will fail too.
584*9356374aSAndroid Build Coastguard Worker   if (EncodeStringTruncate(str_type == StringType::kLiteral
585*9356374aSAndroid Build Coastguard Worker                                ? ValueTag::kStringLiteral
586*9356374aSAndroid Build Coastguard Worker                                : ValueTag::kString,
587*9356374aSAndroid Build Coastguard Worker                            str, &encoded_remaining_copy)) {
588*9356374aSAndroid Build Coastguard Worker     // The string may have been truncated, but the field header fit.
589*9356374aSAndroid Build Coastguard Worker     EncodeMessageLength(start, &encoded_remaining_copy);
590*9356374aSAndroid Build Coastguard Worker     data_->encoded_remaining() = encoded_remaining_copy;
591*9356374aSAndroid Build Coastguard Worker   } else {
592*9356374aSAndroid Build Coastguard Worker     // The field header(s) did not fit; zero `encoded_remaining()` so we don't
593*9356374aSAndroid Build Coastguard Worker     // write anything else later.
594*9356374aSAndroid Build Coastguard Worker     data_->encoded_remaining().remove_suffix(data_->encoded_remaining().size());
595*9356374aSAndroid Build Coastguard Worker   }
596*9356374aSAndroid Build Coastguard Worker }
597*9356374aSAndroid Build Coastguard Worker template void LogMessage::CopyToEncodedBuffer<LogMessage::StringType::kLiteral>(
598*9356374aSAndroid Build Coastguard Worker     absl::string_view str);
599*9356374aSAndroid Build Coastguard Worker template void LogMessage::CopyToEncodedBuffer<
600*9356374aSAndroid Build Coastguard Worker     LogMessage::StringType::kNotLiteral>(absl::string_view str);
601*9356374aSAndroid Build Coastguard Worker template <LogMessage::StringType str_type>
CopyToEncodedBuffer(char ch,size_t num)602*9356374aSAndroid Build Coastguard Worker void LogMessage::CopyToEncodedBuffer(char ch, size_t num) {
603*9356374aSAndroid Build Coastguard Worker   auto encoded_remaining_copy = data_->encoded_remaining();
604*9356374aSAndroid Build Coastguard Worker   auto value_start = EncodeMessageStart(
605*9356374aSAndroid Build Coastguard Worker       EventTag::kValue, BufferSizeFor(WireType::kLengthDelimited) + num,
606*9356374aSAndroid Build Coastguard Worker       &encoded_remaining_copy);
607*9356374aSAndroid Build Coastguard Worker   auto str_start = EncodeMessageStart(str_type == StringType::kLiteral
608*9356374aSAndroid Build Coastguard Worker                                           ? ValueTag::kStringLiteral
609*9356374aSAndroid Build Coastguard Worker                                           : ValueTag::kString,
610*9356374aSAndroid Build Coastguard Worker                                       num, &encoded_remaining_copy);
611*9356374aSAndroid Build Coastguard Worker   if (str_start.data()) {
612*9356374aSAndroid Build Coastguard Worker     // The field headers fit.
613*9356374aSAndroid Build Coastguard Worker     log_internal::AppendTruncated(ch, num, encoded_remaining_copy);
614*9356374aSAndroid Build Coastguard Worker     EncodeMessageLength(str_start, &encoded_remaining_copy);
615*9356374aSAndroid Build Coastguard Worker     EncodeMessageLength(value_start, &encoded_remaining_copy);
616*9356374aSAndroid Build Coastguard Worker     data_->encoded_remaining() = encoded_remaining_copy;
617*9356374aSAndroid Build Coastguard Worker   } else {
618*9356374aSAndroid Build Coastguard Worker     // The field header(s) did not fit; zero `encoded_remaining()` so we don't
619*9356374aSAndroid Build Coastguard Worker     // write anything else later.
620*9356374aSAndroid Build Coastguard Worker     data_->encoded_remaining().remove_suffix(data_->encoded_remaining().size());
621*9356374aSAndroid Build Coastguard Worker   }
622*9356374aSAndroid Build Coastguard Worker }
623*9356374aSAndroid Build Coastguard Worker template void LogMessage::CopyToEncodedBuffer<LogMessage::StringType::kLiteral>(
624*9356374aSAndroid Build Coastguard Worker     char ch, size_t num);
625*9356374aSAndroid Build Coastguard Worker template void LogMessage::CopyToEncodedBuffer<
626*9356374aSAndroid Build Coastguard Worker     LogMessage::StringType::kNotLiteral>(char ch, size_t num);
627*9356374aSAndroid Build Coastguard Worker 
628*9356374aSAndroid Build Coastguard Worker // We intentionally don't return from these destructors. Disable MSVC's warning
629*9356374aSAndroid Build Coastguard Worker // about the destructor never returning as we do so intentionally here.
630*9356374aSAndroid Build Coastguard Worker #if defined(_MSC_VER) && !defined(__clang__)
631*9356374aSAndroid Build Coastguard Worker #pragma warning(push)
632*9356374aSAndroid Build Coastguard Worker #pragma warning(disable : 4722)
633*9356374aSAndroid Build Coastguard Worker #endif
634*9356374aSAndroid Build Coastguard Worker 
LogMessageFatal(const char * file,int line)635*9356374aSAndroid Build Coastguard Worker LogMessageFatal::LogMessageFatal(const char* file, int line)
636*9356374aSAndroid Build Coastguard Worker     : LogMessage(file, line, absl::LogSeverity::kFatal) {}
637*9356374aSAndroid Build Coastguard Worker 
LogMessageFatal(const char * file,int line,absl::string_view failure_msg)638*9356374aSAndroid Build Coastguard Worker LogMessageFatal::LogMessageFatal(const char* file, int line,
639*9356374aSAndroid Build Coastguard Worker                                  absl::string_view failure_msg)
640*9356374aSAndroid Build Coastguard Worker     : LogMessage(file, line, absl::LogSeverity::kFatal) {
641*9356374aSAndroid Build Coastguard Worker   *this << "Check failed: " << failure_msg << " ";
642*9356374aSAndroid Build Coastguard Worker }
643*9356374aSAndroid Build Coastguard Worker 
~LogMessageFatal()644*9356374aSAndroid Build Coastguard Worker LogMessageFatal::~LogMessageFatal() {
645*9356374aSAndroid Build Coastguard Worker   Flush();
646*9356374aSAndroid Build Coastguard Worker   FailWithoutStackTrace();
647*9356374aSAndroid Build Coastguard Worker }
648*9356374aSAndroid Build Coastguard Worker 
LogMessageDebugFatal(const char * file,int line)649*9356374aSAndroid Build Coastguard Worker LogMessageDebugFatal::LogMessageDebugFatal(const char* file, int line)
650*9356374aSAndroid Build Coastguard Worker     : LogMessage(file, line, absl::LogSeverity::kFatal) {}
651*9356374aSAndroid Build Coastguard Worker 
~LogMessageDebugFatal()652*9356374aSAndroid Build Coastguard Worker LogMessageDebugFatal::~LogMessageDebugFatal() {
653*9356374aSAndroid Build Coastguard Worker   Flush();
654*9356374aSAndroid Build Coastguard Worker   FailWithoutStackTrace();
655*9356374aSAndroid Build Coastguard Worker }
656*9356374aSAndroid Build Coastguard Worker 
LogMessageQuietlyDebugFatal(const char * file,int line)657*9356374aSAndroid Build Coastguard Worker LogMessageQuietlyDebugFatal::LogMessageQuietlyDebugFatal(const char* file,
658*9356374aSAndroid Build Coastguard Worker                                                          int line)
659*9356374aSAndroid Build Coastguard Worker     : LogMessage(file, line, absl::LogSeverity::kFatal) {
660*9356374aSAndroid Build Coastguard Worker   SetFailQuietly();
661*9356374aSAndroid Build Coastguard Worker }
662*9356374aSAndroid Build Coastguard Worker 
~LogMessageQuietlyDebugFatal()663*9356374aSAndroid Build Coastguard Worker LogMessageQuietlyDebugFatal::~LogMessageQuietlyDebugFatal() {
664*9356374aSAndroid Build Coastguard Worker   Flush();
665*9356374aSAndroid Build Coastguard Worker   FailQuietly();
666*9356374aSAndroid Build Coastguard Worker }
667*9356374aSAndroid Build Coastguard Worker 
LogMessageQuietlyFatal(const char * file,int line)668*9356374aSAndroid Build Coastguard Worker LogMessageQuietlyFatal::LogMessageQuietlyFatal(const char* file, int line)
669*9356374aSAndroid Build Coastguard Worker     : LogMessage(file, line, absl::LogSeverity::kFatal) {
670*9356374aSAndroid Build Coastguard Worker   SetFailQuietly();
671*9356374aSAndroid Build Coastguard Worker }
672*9356374aSAndroid Build Coastguard Worker 
LogMessageQuietlyFatal(const char * file,int line,absl::string_view failure_msg)673*9356374aSAndroid Build Coastguard Worker LogMessageQuietlyFatal::LogMessageQuietlyFatal(const char* file, int line,
674*9356374aSAndroid Build Coastguard Worker                                                absl::string_view failure_msg)
675*9356374aSAndroid Build Coastguard Worker     : LogMessageQuietlyFatal(file, line) {
676*9356374aSAndroid Build Coastguard Worker     *this << "Check failed: " << failure_msg << " ";
677*9356374aSAndroid Build Coastguard Worker }
678*9356374aSAndroid Build Coastguard Worker 
~LogMessageQuietlyFatal()679*9356374aSAndroid Build Coastguard Worker LogMessageQuietlyFatal::~LogMessageQuietlyFatal() {
680*9356374aSAndroid Build Coastguard Worker   Flush();
681*9356374aSAndroid Build Coastguard Worker   FailQuietly();
682*9356374aSAndroid Build Coastguard Worker }
683*9356374aSAndroid Build Coastguard Worker #if defined(_MSC_VER) && !defined(__clang__)
684*9356374aSAndroid Build Coastguard Worker #pragma warning(pop)
685*9356374aSAndroid Build Coastguard Worker #endif
686*9356374aSAndroid Build Coastguard Worker 
687*9356374aSAndroid Build Coastguard Worker }  // namespace log_internal
688*9356374aSAndroid Build Coastguard Worker 
689*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
690*9356374aSAndroid Build Coastguard Worker }  // namespace absl
691