blob: be3f2920e2c971234444e8b144ebd5a87dad9be3 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2011 The Chromium Authors
[email protected]2b07b8412009-11-25 15:26:342// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
danakj51d26a402024-04-25 14:23:565#ifdef UNSAFE_BUFFERS_BUILD
6// TODO(crbug.com/40284755): Remove this and spanify to fix the errors.
7#pragma allow_unsafe_buffers
8#endif
9
[email protected]2b07b8412009-11-25 15:26:3410#include "base/logging_win.h"
Takuto Ikutad0bcf2122024-04-17 15:37:0411
12#include <initguid.h>
13
[email protected]3b63f8f42011-03-28 01:54:1514#include "base/memory/singleton.h"
[email protected]2b07b8412009-11-25 15:26:3415
[email protected]2b07b8412009-11-25 15:26:3416namespace logging {
17
[email protected]ba50d1922010-11-06 15:39:4018using base::win::EtwEventLevel;
19using base::win::EtwMofEvent;
20
[email protected]2b07b8412009-11-25 15:26:3421DEFINE_GUID(kLogEventId,
Peter Kasting134ef9af2024-12-28 02:30:0922 0x7fe69228,
23 0x633e,
24 0x4f06,
25 0x80,
26 0xc1,
27 0x52,
28 0x7f,
29 0xea,
30 0x23,
31 0xe3,
32 0xa7);
[email protected]2b07b8412009-11-25 15:26:3433
Peter Kasting134ef9af2024-12-28 02:30:0934LogEventProvider::LogEventProvider() : old_log_level_(LOG_NONE) {}
[email protected]2b07b8412009-11-25 15:26:3435
[email protected]864b5582010-12-04 23:00:1036LogEventProvider* LogEventProvider::GetInstance() {
olli.raula36aa8be2015-09-10 11:14:2237 return base::Singleton<LogEventProvider, base::StaticMemorySingletonTraits<
38 LogEventProvider>>::get();
[email protected]864b5582010-12-04 23:00:1039}
40
[email protected]162ac0f2010-11-04 15:50:4941bool LogEventProvider::LogMessage(logging::LogSeverity severity,
Collin Baker0162bae2025-04-03 18:01:4042 const char* file,
Peter Kasting134ef9af2024-12-28 02:30:0943 int line,
44 size_t message_start,
45 const std::string& message) {
[email protected]2b07b8412009-11-25 15:26:3446 EtwEventLevel level = TRACE_LEVEL_NONE;
47
48 // Convert the log severity to the most appropriate ETW trace level.
[email protected]162ac0f2010-11-04 15:50:4949 if (severity >= 0) {
50 switch (severity) {
Lei Zhang93dd42572020-10-23 18:45:5351 case LOGGING_INFO:
[email protected]162ac0f2010-11-04 15:50:4952 level = TRACE_LEVEL_INFORMATION;
53 break;
Lei Zhang93dd42572020-10-23 18:45:5354 case LOGGING_WARNING:
[email protected]162ac0f2010-11-04 15:50:4955 level = TRACE_LEVEL_WARNING;
56 break;
Lei Zhang93dd42572020-10-23 18:45:5357 case LOGGING_ERROR:
[email protected]162ac0f2010-11-04 15:50:4958 level = TRACE_LEVEL_ERROR;
59 break;
Lei Zhang93dd42572020-10-23 18:45:5360 case LOGGING_FATAL:
[email protected]162ac0f2010-11-04 15:50:4961 level = TRACE_LEVEL_FATAL;
62 break;
63 }
64 } else { // severity < 0 is VLOG verbosity levels.
pkasting9cf9b94a2014-10-01 22:18:4365 level = static_cast<EtwEventLevel>(TRACE_LEVEL_INFORMATION - severity);
[email protected]162ac0f2010-11-04 15:50:4966 }
[email protected]2b07b8412009-11-25 15:26:3467
68 // Bail if we're not logging, not at that level,
69 // or if we're post-atexit handling.
[email protected]864b5582010-12-04 23:00:1070 LogEventProvider* provider = LogEventProvider::GetInstance();
Peter Kasting134ef9af2024-12-28 02:30:0971 if (provider == NULL || level > provider->enable_level()) {
[email protected]2b07b8412009-11-25 15:26:3472 return false;
Peter Kasting134ef9af2024-12-28 02:30:0973 }
[email protected]2b07b8412009-11-25 15:26:3474
[email protected]162ac0f2010-11-04 15:50:4975 // And now log the event.
76 if (provider->enable_flags() & ENABLE_LOG_MESSAGE_ONLY) {
77 EtwMofEvent<1> event(kLogEventId, LOG_MESSAGE, level);
78 event.SetField(0, message.length() + 1 - message_start,
Peter Kasting134ef9af2024-12-28 02:30:0979 message.c_str() + message_start);
[email protected]2b07b8412009-11-25 15:26:3480
81 provider->Log(event.get());
82 } else {
[email protected]162ac0f2010-11-04 15:50:4983 const size_t kMaxBacktraceDepth = 32;
84 void* backtrace[kMaxBacktraceDepth];
85 DWORD depth = 0;
86
87 // Capture a stack trace if one is requested.
88 // requested per our enable flags.
Peter Kasting134ef9af2024-12-28 02:30:0989 if (provider->enable_flags() & ENABLE_STACK_TRACE_CAPTURE) {
[email protected]162ac0f2010-11-04 15:50:4990 depth = CaptureStackBackTrace(2, kMaxBacktraceDepth, backtrace, NULL);
Peter Kasting134ef9af2024-12-28 02:30:0991 }
[email protected]162ac0f2010-11-04 15:50:4992
93 EtwMofEvent<5> event(kLogEventId, LOG_MESSAGE_FULL, level);
Collin Baker0162bae2025-04-03 18:01:4094 if (file == NULL) {
95 file = "";
96 }
[email protected]162ac0f2010-11-04 15:50:4997
98 // Add the stack trace.
99 event.SetField(0, sizeof(depth), &depth);
100 event.SetField(1, sizeof(backtrace[0]) * depth, &backtrace);
101 // The line.
102 event.SetField(2, sizeof(line), &line);
103 // The file.
Collin Baker0162bae2025-04-03 18:01:40104 event.SetField(3, strlen(file) + 1, file);
[email protected]162ac0f2010-11-04 15:50:49105 // And finally the message.
106 event.SetField(4, message.length() + 1 - message_start,
Peter Kasting134ef9af2024-12-28 02:30:09107 message.c_str() + message_start);
[email protected]162ac0f2010-11-04 15:50:49108
[email protected]2b07b8412009-11-25 15:26:34109 provider->Log(event.get());
110 }
111
112 // Don't increase verbosity in other log destinations.
Peter Kasting134ef9af2024-12-28 02:30:09113 if (severity < provider->old_log_level_) {
[email protected]2b07b8412009-11-25 15:26:34114 return true;
Peter Kasting134ef9af2024-12-28 02:30:09115 }
[email protected]2b07b8412009-11-25 15:26:34116
117 return false;
118}
119
120void LogEventProvider::Initialize(const GUID& provider_name) {
[email protected]864b5582010-12-04 23:00:10121 LogEventProvider* provider = LogEventProvider::GetInstance();
[email protected]2b07b8412009-11-25 15:26:34122
123 provider->set_provider_name(provider_name);
124 provider->Register();
125
126 // Register our message handler with logging.
127 SetLogMessageHandler(LogMessage);
128}
129
130void LogEventProvider::Uninitialize() {
[email protected]864b5582010-12-04 23:00:10131 LogEventProvider::GetInstance()->Unregister();
[email protected]2b07b8412009-11-25 15:26:34132}
133
134void LogEventProvider::OnEventsEnabled() {
135 // Grab the old log level so we can restore it later.
136 old_log_level_ = GetMinLogLevel();
137
138 // Convert the new trace level to a logging severity
139 // and enable logging at that level.
140 EtwEventLevel level = enable_level();
[email protected]162ac0f2010-11-04 15:50:49141 if (level == TRACE_LEVEL_NONE || level == TRACE_LEVEL_FATAL) {
Lei Zhang93dd42572020-10-23 18:45:53142 SetMinLogLevel(LOGGING_FATAL);
[email protected]162ac0f2010-11-04 15:50:49143 } else if (level == TRACE_LEVEL_ERROR) {
Lei Zhang93dd42572020-10-23 18:45:53144 SetMinLogLevel(LOGGING_ERROR);
[email protected]162ac0f2010-11-04 15:50:49145 } else if (level == TRACE_LEVEL_WARNING) {
Lei Zhang93dd42572020-10-23 18:45:53146 SetMinLogLevel(LOGGING_WARNING);
[email protected]162ac0f2010-11-04 15:50:49147 } else if (level == TRACE_LEVEL_INFORMATION) {
Lei Zhang93dd42572020-10-23 18:45:53148 SetMinLogLevel(LOGGING_INFO);
[email protected]162ac0f2010-11-04 15:50:49149 } else if (level >= TRACE_LEVEL_VERBOSE) {
150 // Above INFO, we enable verbose levels with negative severities.
151 SetMinLogLevel(TRACE_LEVEL_INFORMATION - level);
[email protected]2b07b8412009-11-25 15:26:34152 }
153}
154
155void LogEventProvider::OnEventsDisabled() {
156 // Restore the old log level.
157 SetMinLogLevel(old_log_level_);
158}
159
160} // namespace logging