| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Define _GNU_SOURCE to ensure that <errno.h> defines |
| // program_invocation_short_name which is used in GetProgramName(). Keep this at |
| // the top of the file since some system headers might include <errno.h> and the |
| // header could be skipped on subsequent includes. |
| #if !defined(_GNU_SOURCE) |
| #define _GNU_SOURCE |
| #endif |
| |
| #include "base/logging.h" |
| |
| #include <errno.h> |
| |
| #include <iomanip> |
| |
| #include "base/process/process_handle.h" |
| #include "base/strings/string_piece.h" |
| #include "base/threading/platform_thread.h" |
| |
| namespace logging { |
| |
| namespace { |
| const char* GetProgramName() { |
| return program_invocation_short_name ? program_invocation_short_name : ""; |
| } |
| } // namespace |
| |
| // InitWithSyslogPrefix generates log header for Chrome OS in syslog compatible |
| // format. The timezone will always be UTC regardless of devices' timezone. |
| // `<rfc3339_timestamp> <tickcount> <log_level>` |
| // `<program_name>[<pid>:<thread_id>]: ` |
| // `[<filename>(<line_number>)] <message>` |
| // |
| // e.g. |
| // 2020-06-27T23:55:25.094701Z 1234 VERBOSE1 chrome[3816:3877]: |
| // [drm_device_handle.cc(90)] Succeeded authenticating /dev/dri/card0 in 0 ms |
| // with 1 attempt(s) |
| void LogMessage::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) { |
| if (log_prefix) |
| stream_ << log_prefix << ':'; |
| if (enable_timestamp) { |
| timeval tv{}; |
| gettimeofday(&tv, nullptr); |
| time_t t = tv.tv_sec; |
| struct tm utc_time {}; |
| gmtime_r(&t, &utc_time); |
| stream_ << std::setfill('0') // Set fill to 0 |
| << std::setw(4) << 1900 + utc_time.tm_year << "-" // year |
| << std::setw(2) << 1 + utc_time.tm_mon << "-" // month |
| << std::setw(2) << utc_time.tm_mday // date |
| << 'T' << std::setw(2) << utc_time.tm_hour << ":" // hour |
| << std::setw(2) << utc_time.tm_min << ":" // minute |
| << std::setw(2) << utc_time.tm_sec << "." // second |
| << std::setw(6) << tv.tv_usec // millisecond |
| << "Z "; // timezone UTC |
| } |
| if (enable_tickcount) |
| stream_ << tick_count << ' '; |
| if (severity_ >= 0) { |
| stream_ << log_severity_name_c_str; |
| } else { |
| stream_ << "VERBOSE" << -severity_; |
| } |
| stream_ << ' ' << GetProgramName(); |
| if (enable_process_id || enable_thread_id) { |
| stream_ << "["; |
| if (enable_process_id) { |
| stream_ << base::GetUniqueIdForProcess(); |
| } |
| if (enable_thread_id) { |
| stream_ << ':' << base::PlatformThread::CurrentId(); |
| } |
| stream_ << "]"; |
| } |
| stream_ << ": "; |
| stream_ << "[" << filename << "(" << line << ")] "; |
| } |
| |
| } // namespace logging |