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