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