Home | History | Annotate | Download | only in win
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_TEST_LOGGING_WIN_FILE_LOGGER_H_
      6 #define CHROME_TEST_LOGGING_WIN_FILE_LOGGER_H_
      7 
      8 #include <guiddef.h>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/strings/string16.h"
     12 #include "base/win/event_trace_controller.h"
     13 
     14 namespace base {
     15 class FilePath;
     16 }
     17 
     18 namespace logging_win {
     19 
     20 // A file logger instance captures LOG messages and trace events emitted via
     21 // Event Tracing for Windows (ETW) and sends them to a file.  Events can be
     22 // pulled from the file sometime later with PrintLogFile or ReadLogFile
     23 // (currently in log_file_printer_win.h and log_file_reader_win.h,
     24 // respectively).
     25 //
     26 // Important usage notes (read this):
     27 // - Due to the nature of event generation, only one instance of this class may
     28 //   be initialized at a time.
     29 // - This class is not thread safe.
     30 // - This class uses facilities that require the process to run with admin
     31 //   rights; StartLogging() will return false if this is not the case.
     32 class FileLogger {
     33  public:
     34   enum EventProviderBits {
     35     // Log messages from chrome.exe.
     36     CHROME_LOG_PROVIDER         = 1 << 0,
     37     // Log messages from npchrome_frame.dll.
     38     CHROME_FRAME_LOG_PROVIDER   = 1 << 1,
     39     // Log messages from the current process.
     40     CHROME_TESTS_LOG_PROVIDER   = 1 << 2,
     41     // Trace events.
     42     CHROME_TRACE_EVENT_PROVIDER = 1 << 3,
     43   };
     44 
     45   static const uint32 kAllEventProviders = (CHROME_LOG_PROVIDER |
     46                                             CHROME_FRAME_LOG_PROVIDER |
     47                                             CHROME_TESTS_LOG_PROVIDER |
     48                                             CHROME_TRACE_EVENT_PROVIDER);
     49 
     50   FileLogger();
     51   ~FileLogger();
     52 
     53   // Initializes the instance to collect logs from all supported providers.
     54   void Initialize();
     55 
     56   // Initializes the instance to collect logs from the providers present in
     57   // the given mask; see EventProviderBits.
     58   void Initialize(uint32 event_provider_mask);
     59 
     60   // Starts capturing logs from all providers into |log_file|.  The common file
     61   // extension for such files is .etl.  Returns false if the session could not
     62   // be started (e.g., if not running as admin) or if no providers could be
     63   // enabled.
     64   bool StartLogging(const base::FilePath& log_file);
     65 
     66   // Stops capturing logs.
     67   void StopLogging();
     68 
     69   // Returns true if logs are being captured.
     70   bool is_logging() const {
     71     return controller_.session_name() && *controller_.session_name();
     72   }
     73 
     74  private:
     75   bool EnableProviders();
     76   void DisableProviders();
     77 
     78   static bool is_initialized_;
     79 
     80   base::win::EtwTraceController controller_;
     81   uint32 event_provider_mask_;
     82 
     83   DISALLOW_COPY_AND_ASSIGN(FileLogger);
     84 };
     85 
     86 }  // namespace logging_win
     87 
     88 #endif  // CHROME_TEST_LOGGING_WIN_FILE_LOGGER_H_
     89