| Index: base/logging_win.cc
|
| ===================================================================
|
| --- base/logging_win.cc (revision 65044)
|
| +++ base/logging_win.cc (working copy)
|
| @@ -22,25 +22,31 @@
|
| 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 @@
|
| 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 @@
|
| // 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);
|
| }
|
| }
|
|
|
|
|