xref: /aosp_15_r20/external/cronet/base/logging_chromeos.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 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 // Define _GNU_SOURCE to ensure that <errno.h> defines
6*6777b538SAndroid Build Coastguard Worker // program_invocation_short_name which is used in GetProgramName(). Keep this at
7*6777b538SAndroid Build Coastguard Worker // the top of the file since some system headers might include <errno.h> and the
8*6777b538SAndroid Build Coastguard Worker // header could be skipped on subsequent includes.
9*6777b538SAndroid Build Coastguard Worker #if !defined(_GNU_SOURCE)
10*6777b538SAndroid Build Coastguard Worker #define _GNU_SOURCE
11*6777b538SAndroid Build Coastguard Worker #endif
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include <errno.h>
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker #include <iomanip>
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker namespace logging {
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker namespace {
GetProgramName()26*6777b538SAndroid Build Coastguard Worker const char* GetProgramName() {
27*6777b538SAndroid Build Coastguard Worker   return program_invocation_short_name ? program_invocation_short_name : "";
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker }  // namespace
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker // InitWithSyslogPrefix generates log header for Chrome OS in syslog compatible
32*6777b538SAndroid Build Coastguard Worker // format. The timezone will always be UTC regardless of devices' timezone.
33*6777b538SAndroid Build Coastguard Worker // `<rfc3339_timestamp> <tickcount> <log_level>`
34*6777b538SAndroid Build Coastguard Worker // `<program_name>[<pid>:<thread_id>]: `
35*6777b538SAndroid Build Coastguard Worker // `[<filename>(<line_number>)] <message>`
36*6777b538SAndroid Build Coastguard Worker //
37*6777b538SAndroid Build Coastguard Worker // e.g.
38*6777b538SAndroid Build Coastguard Worker // 2020-06-27T23:55:25.094701Z 1234 VERBOSE1 chrome[3816:3877]:
39*6777b538SAndroid Build Coastguard Worker // [drm_device_handle.cc(90)] Succeeded authenticating /dev/dri/card0 in 0 ms
40*6777b538SAndroid Build Coastguard Worker // with 1 attempt(s)
InitWithSyslogPrefix(base::StringPiece filename,int line,uint64_t tick_count,const char * log_severity_name_c_str,const char * log_prefix,bool enable_process_id,bool enable_thread_id,bool enable_timestamp,bool enable_tickcount)41*6777b538SAndroid Build Coastguard Worker void LogMessage::InitWithSyslogPrefix(base::StringPiece filename,
42*6777b538SAndroid Build Coastguard Worker                                       int line,
43*6777b538SAndroid Build Coastguard Worker                                       uint64_t tick_count,
44*6777b538SAndroid Build Coastguard Worker                                       const char* log_severity_name_c_str,
45*6777b538SAndroid Build Coastguard Worker                                       const char* log_prefix,
46*6777b538SAndroid Build Coastguard Worker                                       bool enable_process_id,
47*6777b538SAndroid Build Coastguard Worker                                       bool enable_thread_id,
48*6777b538SAndroid Build Coastguard Worker                                       bool enable_timestamp,
49*6777b538SAndroid Build Coastguard Worker                                       bool enable_tickcount) {
50*6777b538SAndroid Build Coastguard Worker   if (log_prefix)
51*6777b538SAndroid Build Coastguard Worker     stream_ << log_prefix << ':';
52*6777b538SAndroid Build Coastguard Worker   if (enable_timestamp) {
53*6777b538SAndroid Build Coastguard Worker     timeval tv{};
54*6777b538SAndroid Build Coastguard Worker     gettimeofday(&tv, nullptr);
55*6777b538SAndroid Build Coastguard Worker     time_t t = tv.tv_sec;
56*6777b538SAndroid Build Coastguard Worker     struct tm utc_time {};
57*6777b538SAndroid Build Coastguard Worker     gmtime_r(&t, &utc_time);
58*6777b538SAndroid Build Coastguard Worker     stream_ << std::setfill('0')                               // Set fill to 0
59*6777b538SAndroid Build Coastguard Worker             << std::setw(4) << 1900 + utc_time.tm_year << "-"  // year
60*6777b538SAndroid Build Coastguard Worker             << std::setw(2) << 1 + utc_time.tm_mon << "-"      // month
61*6777b538SAndroid Build Coastguard Worker             << std::setw(2) << utc_time.tm_mday                // date
62*6777b538SAndroid Build Coastguard Worker             << 'T' << std::setw(2) << utc_time.tm_hour << ":"  // hour
63*6777b538SAndroid Build Coastguard Worker             << std::setw(2) << utc_time.tm_min << ":"          // minute
64*6777b538SAndroid Build Coastguard Worker             << std::setw(2) << utc_time.tm_sec << "."          // second
65*6777b538SAndroid Build Coastguard Worker             << std::setw(6) << tv.tv_usec                      // millisecond
66*6777b538SAndroid Build Coastguard Worker             << "Z ";                                           // timezone UTC
67*6777b538SAndroid Build Coastguard Worker   }
68*6777b538SAndroid Build Coastguard Worker   if (enable_tickcount)
69*6777b538SAndroid Build Coastguard Worker     stream_ << tick_count << ' ';
70*6777b538SAndroid Build Coastguard Worker   if (severity_ >= 0) {
71*6777b538SAndroid Build Coastguard Worker     stream_ << log_severity_name_c_str;
72*6777b538SAndroid Build Coastguard Worker   } else {
73*6777b538SAndroid Build Coastguard Worker     stream_ << "VERBOSE" << -severity_;
74*6777b538SAndroid Build Coastguard Worker   }
75*6777b538SAndroid Build Coastguard Worker   stream_ << ' ' << GetProgramName();
76*6777b538SAndroid Build Coastguard Worker   if (enable_process_id || enable_thread_id) {
77*6777b538SAndroid Build Coastguard Worker     stream_ << "[";
78*6777b538SAndroid Build Coastguard Worker     if (enable_process_id) {
79*6777b538SAndroid Build Coastguard Worker       stream_ << base::GetUniqueIdForProcess();
80*6777b538SAndroid Build Coastguard Worker     }
81*6777b538SAndroid Build Coastguard Worker     if (enable_thread_id) {
82*6777b538SAndroid Build Coastguard Worker       stream_ << ':' << base::PlatformThread::CurrentId();
83*6777b538SAndroid Build Coastguard Worker     }
84*6777b538SAndroid Build Coastguard Worker     stream_ << "]";
85*6777b538SAndroid Build Coastguard Worker   }
86*6777b538SAndroid Build Coastguard Worker   stream_ << ": ";
87*6777b538SAndroid Build Coastguard Worker   stream_ << "[" << filename << "(" << line << ")] ";
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker }  // namespace logging
91