diff options
author | siggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-04 15:50:49 +0000 |
---|---|---|
committer | siggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-04 15:50:49 +0000 |
commit | 162ac0f02a2a7a6f1909a85a222ab5da3d280d12 (patch) | |
tree | ccc49648b2197f598acaeafa4d4f58c0c0048bdd /base/logging_win.cc | |
parent | ce833284bfd1b0a5db62e0f3c25f48af70ae8784 (diff) | |
download | chromium_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.cc | 102 |
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); } } |