// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_TEST_LOGGING_WIN_FILE_LOGGER_H_
#define CHROME_TEST_LOGGING_WIN_FILE_LOGGER_H_
#include <guiddef.h>
#include "base/basictypes.h"
#include "base/strings/string16.h"
#include "base/win/event_trace_controller.h"
namespace base {
class FilePath;
}
namespace logging_win {
// A file logger instance captures LOG messages and trace events emitted via
// Event Tracing for Windows (ETW) and sends them to a file. Events can be
// pulled from the file sometime later with PrintLogFile or ReadLogFile
// (currently in log_file_printer_win.h and log_file_reader_win.h,
// respectively).
//
// Important usage notes (read this):
// - Due to the nature of event generation, only one instance of this class may
// be initialized at a time.
// - This class is not thread safe.
// - This class uses facilities that require the process to run with admin
// rights; StartLogging() will return false if this is not the case.
class FileLogger {
public:
enum EventProviderBits {
// Log messages from chrome.exe.
CHROME_LOG_PROVIDER = 1 << 0,
// Log messages from npchrome_frame.dll.
CHROME_FRAME_LOG_PROVIDER = 1 << 1,
// Log messages from the current process.
CHROME_TESTS_LOG_PROVIDER = 1 << 2,
// Trace events.
CHROME_TRACE_EVENT_PROVIDER = 1 << 3,
};
static const uint32 kAllEventProviders = (CHROME_LOG_PROVIDER |
CHROME_FRAME_LOG_PROVIDER |
CHROME_TESTS_LOG_PROVIDER |
CHROME_TRACE_EVENT_PROVIDER);
FileLogger();
~FileLogger();
// Initializes the instance to collect logs from all supported providers.
void Initialize();
// Initializes the instance to collect logs from the providers present in
// the given mask; see EventProviderBits.
void Initialize(uint32 event_provider_mask);
// Starts capturing logs from all providers into |log_file|. The common file
// extension for such files is .etl. Returns false if the session could not
// be started (e.g., if not running as admin) or if no providers could be
// enabled.
bool StartLogging(const base::FilePath& log_file);
// Stops capturing logs.
void StopLogging();
// Returns true if logs are being captured.
bool is_logging() const {
return controller_.session_name() && *controller_.session_name();
}
private:
bool EnableProviders();
void DisableProviders();
static bool is_initialized_;
base::win::EtwTraceController controller_;
uint32 event_provider_mask_;
DISALLOW_COPY_AND_ASSIGN(FileLogger);
};
} // namespace logging_win
#endif // CHROME_TEST_LOGGING_WIN_FILE_LOGGER_H_