Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(46)

Side by Side Diff: base/logging_win.cc

Issue 4164011: Integrate ETW with VLOG logging. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/logging_win.h ('k') | base/vlog.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/logging_win.h" 5 #include "base/logging_win.h"
6 #include "base/singleton.h" 6 #include "base/singleton.h"
7 #include <initguid.h> // NOLINT 7 #include <initguid.h> // NOLINT
8 8
9 namespace { 9 namespace {
10 10
11 typedef StaticMemorySingletonTraits<logging::LogEventProvider> 11 typedef StaticMemorySingletonTraits<logging::LogEventProvider>
12 LogEventSingletonTraits; 12 LogEventSingletonTraits;
13 Singleton<logging::LogEventProvider, LogEventSingletonTraits> log_provider; 13 Singleton<logging::LogEventProvider, LogEventSingletonTraits> log_provider;
14 14
15 } // namespace 15 } // namespace
16 16
17 namespace logging { 17 namespace logging {
18 18
19 DEFINE_GUID(kLogEventId, 19 DEFINE_GUID(kLogEventId,
20 0x7fe69228, 0x633e, 0x4f06, 0x80, 0xc1, 0x52, 0x7f, 0xea, 0x23, 0xe3, 0xa7); 20 0x7fe69228, 0x633e, 0x4f06, 0x80, 0xc1, 0x52, 0x7f, 0xea, 0x23, 0xe3, 0xa7);
21 21
22 LogEventProvider::LogEventProvider() : old_log_level_(LOG_NONE) { 22 LogEventProvider::LogEventProvider() : old_log_level_(LOG_NONE) {
23 } 23 }
24 24
25 bool LogEventProvider::LogMessage(int severity, const std::string& message) { 25 bool LogEventProvider::LogMessage(logging::LogSeverity severity,
26 const char* file, int line, size_t message_start,
27 const std::string& message) {
26 EtwEventLevel level = TRACE_LEVEL_NONE; 28 EtwEventLevel level = TRACE_LEVEL_NONE;
27 29
28 // Convert the log severity to the most appropriate ETW trace level. 30 // Convert the log severity to the most appropriate ETW trace level.
29 switch (severity) { 31 if (severity >= 0) {
30 case LOG_INFO: 32 switch (severity) {
31 level = TRACE_LEVEL_INFORMATION; 33 case LOG_INFO:
32 break; 34 level = TRACE_LEVEL_INFORMATION;
33 case LOG_WARNING: 35 break;
34 level = TRACE_LEVEL_WARNING; 36 case LOG_WARNING:
35 break; 37 level = TRACE_LEVEL_WARNING;
36 case LOG_ERROR: 38 break;
37 case LOG_ERROR_REPORT: 39 case LOG_ERROR:
38 level = TRACE_LEVEL_ERROR; 40 case LOG_ERROR_REPORT:
39 break; 41 level = TRACE_LEVEL_ERROR;
40 case LOG_FATAL: 42 break;
41 level = TRACE_LEVEL_FATAL; 43 case LOG_FATAL:
42 break; 44 level = TRACE_LEVEL_FATAL;
43 }; 45 break;
46 }
47 } else { // severity < 0 is VLOG verbosity levels.
48 level = TRACE_LEVEL_INFORMATION - severity;
49 }
44 50
45 // Bail if we're not logging, not at that level, 51 // Bail if we're not logging, not at that level,
46 // or if we're post-atexit handling. 52 // or if we're post-atexit handling.
47 LogEventProvider* provider = log_provider.get(); 53 LogEventProvider* provider = log_provider.get();
48 if (provider == NULL || level > provider->enable_level()) 54 if (provider == NULL || level > provider->enable_level())
49 return false; 55 return false;
50 56
51 // And now log the event, with stack trace if one is 57 // And now log the event.
52 // requested per our enable flags. 58 if (provider->enable_flags() & ENABLE_LOG_MESSAGE_ONLY) {
53 if (provider->enable_flags() & ENABLE_STACK_TRACE_CAPTURE) { 59 EtwMofEvent<1> event(kLogEventId, LOG_MESSAGE, level);
54 const size_t kMaxBacktraceDepth = 32; 60 event.SetField(0, message.length() + 1 - message_start,
55 void* backtrace[kMaxBacktraceDepth]; 61 message.c_str() + message_start);
56 DWORD depth = CaptureStackBackTrace(2, kMaxBacktraceDepth, backtrace, NULL);
57 EtwMofEvent<3> event(kLogEventId, LOG_MESSAGE_WITH_STACKTRACE, level);
58
59 event.SetField(0, sizeof(depth), &depth);
60 event.SetField(1, sizeof(backtrace[0]) * depth, &backtrace);
61 event.SetField(2, message.length() + 1, message.c_str());
62 62
63 provider->Log(event.get()); 63 provider->Log(event.get());
64 } else { 64 } else {
65 EtwMofEvent<1> event(kLogEventId, LOG_MESSAGE, level); 65 const size_t kMaxBacktraceDepth = 32;
66 event.SetField(0, message.length() + 1, message.c_str()); 66 void* backtrace[kMaxBacktraceDepth];
67 DWORD depth = 0;
68
69 // Capture a stack trace if one is requested.
70 // requested per our enable flags.
71 if (provider->enable_flags() & ENABLE_STACK_TRACE_CAPTURE)
72 depth = CaptureStackBackTrace(2, kMaxBacktraceDepth, backtrace, NULL);
73
74 EtwMofEvent<5> event(kLogEventId, LOG_MESSAGE_FULL, level);
75 if (file == NULL)
76 file = "";
77
78 // Add the stack trace.
79 event.SetField(0, sizeof(depth), &depth);
80 event.SetField(1, sizeof(backtrace[0]) * depth, &backtrace);
81 // The line.
82 event.SetField(2, sizeof(line), &line);
83 // The file.
84 event.SetField(3, strlen(file) + 1, file);
85 // And finally the message.
86 event.SetField(4, message.length() + 1 - message_start,
87 message.c_str() + message_start);
88
67 provider->Log(event.get()); 89 provider->Log(event.get());
68 } 90 }
69 91
70 // Don't increase verbosity in other log destinations. 92 // Don't increase verbosity in other log destinations.
71 if (severity >= provider->old_log_level_) 93 if (severity < provider->old_log_level_)
72 return true; 94 return true;
73 95
74 return false; 96 return false;
75 } 97 }
76 98
77 void LogEventProvider::Initialize(const GUID& provider_name) { 99 void LogEventProvider::Initialize(const GUID& provider_name) {
78 LogEventProvider* provider = log_provider.get(); 100 LogEventProvider* provider = log_provider.get();
79 101
80 provider->set_provider_name(provider_name); 102 provider->set_provider_name(provider_name);
81 provider->Register(); 103 provider->Register();
82 104
83 // Register our message handler with logging. 105 // Register our message handler with logging.
84 SetLogMessageHandler(LogMessage); 106 SetLogMessageHandler(LogMessage);
85 } 107 }
86 108
87 void LogEventProvider::Uninitialize() { 109 void LogEventProvider::Uninitialize() {
88 log_provider.get()->Unregister(); 110 log_provider.get()->Unregister();
89 } 111 }
90 112
91 void LogEventProvider::OnEventsEnabled() { 113 void LogEventProvider::OnEventsEnabled() {
92 // Grab the old log level so we can restore it later. 114 // Grab the old log level so we can restore it later.
93 old_log_level_ = GetMinLogLevel(); 115 old_log_level_ = GetMinLogLevel();
94 116
95 // Convert the new trace level to a logging severity 117 // Convert the new trace level to a logging severity
96 // and enable logging at that level. 118 // and enable logging at that level.
97 EtwEventLevel level = enable_level(); 119 EtwEventLevel level = enable_level();
98 switch (level) { 120 if (level == TRACE_LEVEL_NONE || level == TRACE_LEVEL_FATAL) {
99 case TRACE_LEVEL_NONE: 121 SetMinLogLevel(LOG_FATAL);
100 case TRACE_LEVEL_FATAL: 122 } else if (level == TRACE_LEVEL_ERROR) {
101 SetMinLogLevel(LOG_FATAL); 123 SetMinLogLevel(LOG_ERROR);
102 break; 124 } else if (level == TRACE_LEVEL_WARNING) {
103 case TRACE_LEVEL_ERROR: 125 SetMinLogLevel(LOG_WARNING);
104 SetMinLogLevel(LOG_ERROR); 126 } else if (level == TRACE_LEVEL_INFORMATION) {
105 break; 127 SetMinLogLevel(LOG_INFO);
106 case TRACE_LEVEL_WARNING: 128 } else if (level >= TRACE_LEVEL_VERBOSE) {
107 SetMinLogLevel(LOG_WARNING); 129 // Above INFO, we enable verbose levels with negative severities.
108 break; 130 SetMinLogLevel(TRACE_LEVEL_INFORMATION - level);
109 case TRACE_LEVEL_INFORMATION:
110 case TRACE_LEVEL_VERBOSE:
111 SetMinLogLevel(LOG_INFO);
112 break;
113 } 131 }
114 } 132 }
115 133
116 void LogEventProvider::OnEventsDisabled() { 134 void LogEventProvider::OnEventsDisabled() {
117 // Restore the old log level. 135 // Restore the old log level.
118 SetMinLogLevel(old_log_level_); 136 SetMinLogLevel(old_log_level_);
119 } 137 }
120 138
121 } // namespace logging 139 } // namespace logging
OLDNEW
« no previous file with comments | « base/logging_win.h ('k') | base/vlog.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698