1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef BASE_LOGGING_WIN_H_ 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define BASE_LOGGING_WIN_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string> 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/base_api.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/win/event_trace_provider.h" 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h" 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsentemplate <typename Type> 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstruct StaticMemorySingletonTraits; 1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace logging { 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Event ID for the log messages we generate. 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern const GUID kLogEventId; 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Feature enable mask for LogEventProvider. 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum LogEnableMask { 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If this bit is set in our provider enable mask, we will include 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // a stack trace with every log message. 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ENABLE_STACK_TRACE_CAPTURE = 0x0001, 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // If this bit is set in our provider enable mask, the provider will log 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // a LOG message with only the textual content of the message, and no 31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // stack trace. 32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ENABLE_LOG_MESSAGE_ONLY = 0x0002, 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The message types our log event provider generates. 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ETW likes user message types to start at 10. 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum LogMessageTypes { 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // A textual only log message, contains a zero-terminated string. 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott LOG_MESSAGE = 10, 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // A message with a stack trace, followed by the zero-terminated 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // message text. 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott LOG_MESSAGE_WITH_STACKTRACE = 11, 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // A message with: 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // a stack trace, 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the line number as a four byte integer, 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the file as a zero terminated UTF8 string, 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the zero-terminated UTF8 message text. 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch LOG_MESSAGE_FULL = 12, 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Trace provider class to drive log control and transport 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// with Event Tracing for Windows. 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BASE_API LogEventProvider : public base::win::EtwTraceProvider { 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static LogEventProvider* GetInstance(); 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch static bool LogMessage(logging::LogSeverity severity, const char* file, 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int line, size_t message_start, const std::string& str); 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void Initialize(const GUID& provider_name); 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static void Uninitialize(); 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected: 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Overridden to manipulate the log level on ETW control callbacks. 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnEventsEnabled(); 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void OnEventsDisabled(); 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen LogEventProvider(); 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The log severity prior to OnEventsEnabled, 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // restored in OnEventsDisabled. 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott logging::LogSeverity old_log_level_; 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen friend struct StaticMemorySingletonTraits<LogEventProvider>; 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DISALLOW_COPY_AND_ASSIGN(LogEventProvider); 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace logging 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // BASE_LOGGING_WIN_H_ 82