summaryrefslogtreecommitdiffstats
path: root/base/logging_win.cc
diff options
context:
space:
mode:
authorsiggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-04 15:50:49 +0000
committersiggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-04 15:50:49 +0000
commit162ac0f02a2a7a6f1909a85a222ab5da3d280d12 (patch)
treeccc49648b2197f598acaeafa4d4f58c0c0048bdd /base/logging_win.cc
parentce833284bfd1b0a5db62e0f3c25f48af70ae8784 (diff)
downloadchromium_src-162ac0f02a2a7a6f1909a85a222ab5da3d280d12.zip
chromium_src-162ac0f02a2a7a6f1909a85a222ab5da3d280d12.tar.gz
chromium_src-162ac0f02a2a7a6f1909a85a222ab5da3d280d12.tar.bz2
Integrate ETW with VLOG logging.
This change extends the log severities into the negative for VLOG verbosities. It also keeps track of file/line information and passes it to any registered log handler. The log level is naturally controlled by translating ETW log levels to the severities. BUG=none TEST=none Review URL: http://codereview.chromium.org/4164011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65062 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/logging_win.cc')
-rw-r--r--base/logging_win.cc102
1 files changed, 60 insertions, 42 deletions
diff --git a/base/logging_win.cc b/base/logging_win.cc
index f17cf34..588e4d9 100644
--- a/base/logging_win.cc
+++ b/base/logging_win.cc
@@ -22,25 +22,31 @@ DEFINE_GUID(kLogEventId,
LogEventProvider::LogEventProvider() : old_log_level_(LOG_NONE) {
}
-bool LogEventProvider::LogMessage(int severity, const std::string& message) {
+bool LogEventProvider::LogMessage(logging::LogSeverity severity,
+ const char* file, int line, size_t message_start,
+ const std::string& message) {
EtwEventLevel level = TRACE_LEVEL_NONE;
// Convert the log severity to the most appropriate ETW trace level.
- switch (severity) {
- case LOG_INFO:
- level = TRACE_LEVEL_INFORMATION;
- break;
- case LOG_WARNING:
- level = TRACE_LEVEL_WARNING;
- break;
- case LOG_ERROR:
- case LOG_ERROR_REPORT:
- level = TRACE_LEVEL_ERROR;
- break;
- case LOG_FATAL:
- level = TRACE_LEVEL_FATAL;
- break;
- };
+ if (severity >= 0) {
+ switch (severity) {
+ case LOG_INFO:
+ level = TRACE_LEVEL_INFORMATION;
+ break;
+ case LOG_WARNING:
+ level = TRACE_LEVEL_WARNING;
+ break;
+ case LOG_ERROR:
+ case LOG_ERROR_REPORT:
+ level = TRACE_LEVEL_ERROR;
+ break;
+ case LOG_FATAL:
+ level = TRACE_LEVEL_FATAL;
+ break;
+ }
+ } else { // severity < 0 is VLOG verbosity levels.
+ level = TRACE_LEVEL_INFORMATION - severity;
+ }
// Bail if we're not logging, not at that level,
// or if we're post-atexit handling.
@@ -48,27 +54,43 @@ bool LogEventProvider::LogMessage(int severity, const std::string& message) {
if (provider == NULL || level > provider->enable_level())
return false;
- // And now log the event, with stack trace if one is
- // requested per our enable flags.
- if (provider->enable_flags() & ENABLE_STACK_TRACE_CAPTURE) {
+ // And now log the event.
+ if (provider->enable_flags() & ENABLE_LOG_MESSAGE_ONLY) {
+ EtwMofEvent<1> event(kLogEventId, LOG_MESSAGE, level);
+ event.SetField(0, message.length() + 1 - message_start,
+ message.c_str() + message_start);
+
+ provider->Log(event.get());
+ } else {
const size_t kMaxBacktraceDepth = 32;
void* backtrace[kMaxBacktraceDepth];
- DWORD depth = CaptureStackBackTrace(2, kMaxBacktraceDepth, backtrace, NULL);
- EtwMofEvent<3> event(kLogEventId, LOG_MESSAGE_WITH_STACKTRACE, level);
+ DWORD depth = 0;
+ // Capture a stack trace if one is requested.
+ // requested per our enable flags.
+ if (provider->enable_flags() & ENABLE_STACK_TRACE_CAPTURE)
+ depth = CaptureStackBackTrace(2, kMaxBacktraceDepth, backtrace, NULL);
+
+ EtwMofEvent<5> event(kLogEventId, LOG_MESSAGE_FULL, level);
+ if (file == NULL)
+ file = "";
+
+ // Add the stack trace.
event.SetField(0, sizeof(depth), &depth);
event.SetField(1, sizeof(backtrace[0]) * depth, &backtrace);
- event.SetField(2, message.length() + 1, message.c_str());
+ // The line.
+ event.SetField(2, sizeof(line), &line);
+ // The file.
+ event.SetField(3, strlen(file) + 1, file);
+ // And finally the message.
+ event.SetField(4, message.length() + 1 - message_start,
+ message.c_str() + message_start);
provider->Log(event.get());
- } else {
- EtwMofEvent<1> event(kLogEventId, LOG_MESSAGE, level);
- event.SetField(0, message.length() + 1, message.c_str());
- provider->Log(event.get());
}
// Don't increase verbosity in other log destinations.
- if (severity >= provider->old_log_level_)
+ if (severity < provider->old_log_level_)
return true;
return false;
@@ -95,21 +117,17 @@ void LogEventProvider::OnEventsEnabled() {
// Convert the new trace level to a logging severity
// and enable logging at that level.
EtwEventLevel level = enable_level();
- switch (level) {
- case TRACE_LEVEL_NONE:
- case TRACE_LEVEL_FATAL:
- SetMinLogLevel(LOG_FATAL);
- break;
- case TRACE_LEVEL_ERROR:
- SetMinLogLevel(LOG_ERROR);
- break;
- case TRACE_LEVEL_WARNING:
- SetMinLogLevel(LOG_WARNING);
- break;
- case TRACE_LEVEL_INFORMATION:
- case TRACE_LEVEL_VERBOSE:
- SetMinLogLevel(LOG_INFO);
- break;
+ if (level == TRACE_LEVEL_NONE || level == TRACE_LEVEL_FATAL) {
+ SetMinLogLevel(LOG_FATAL);
+ } else if (level == TRACE_LEVEL_ERROR) {
+ SetMinLogLevel(LOG_ERROR);
+ } else if (level == TRACE_LEVEL_WARNING) {
+ SetMinLogLevel(LOG_WARNING);
+ } else if (level == TRACE_LEVEL_INFORMATION) {
+ SetMinLogLevel(LOG_INFO);
+ } else if (level >= TRACE_LEVEL_VERBOSE) {
+ // Above INFO, we enable verbose levels with negative severities.
+ SetMinLogLevel(TRACE_LEVEL_INFORMATION - level);
}
}