| Index: base/logging.h
|
| diff --git a/base/logging.h b/base/logging.h
|
| deleted file mode 100644
|
| index e4f0cf1adab1a4854cf2785d9ef35e7e124480e2..0000000000000000000000000000000000000000
|
| --- a/base/logging.h
|
| +++ /dev/null
|
| @@ -1,528 +0,0 @@
|
| -// Copyright 2003-2009 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -//
|
| -// logging.h
|
| -//
|
| -// Tracing and logging system.
|
| -// Allows filtering of the log messages based on logging categories and levels.
|
| -
|
| -#ifndef OMAHA_BASE_LOGGING_H_
|
| -#define OMAHA_BASE_LOGGING_H_
|
| -
|
| -#include "omaha/base/constants.h"
|
| -#include "omaha/base/synchronized.h"
|
| -#include "omaha/base/time.h"
|
| -
|
| -#ifdef LOGGING
|
| -
|
| -// Logging levels.
|
| -enum LogLevel {
|
| - LEVEL_FATALERROR = -3, // crashing fatal error
|
| - LEVEL_ERROR = -2, // errors - recoverable but shouldn't happen
|
| - LE = -2,
|
| - LEVEL_WARNING = -1, // warnings
|
| - LW = -1,
|
| - L1 = 1, // for aprox. 10 logs per run
|
| - L2, // for aprox. 100 logs per run
|
| - L3, // for aprox. 1,000 logs per run
|
| - L4, // for aprox. 10,000 logs per run
|
| - L5, // for aprox. 100,000 logs per run
|
| - L6, // for > 1,000,000 logs per run
|
| -
|
| - // add above
|
| - LEVEL_ALL // all errors
|
| -};
|
| -
|
| -#endif
|
| -
|
| -namespace omaha {
|
| -
|
| -#define kDefaultLoggingEnabled 1
|
| -#define kLogConfigFileName MAIN_EXE_BASE_NAME _T(".ini")
|
| -#define kDefaultLogFileName MAIN_EXE_BASE_NAME _T(".log")
|
| -#define kDefaultLogFileWide 1
|
| -#define kDefaultShowTime 1
|
| -#define kDefaultAppendToFile 1
|
| -
|
| -#ifdef _DEBUG
|
| -#define kDefaultMaxLogFileSize 0xFFFFFFFF // 4GB
|
| -#define kDefaultLogToFile 1
|
| -#define kDefaultLogToOutputDebug 1
|
| -#define kDefaultLogLevel L3
|
| -#else
|
| -#define kDefaultMaxLogFileSize 10000000 // 10MB
|
| -#define kDefaultLogToFile 0
|
| -#define kDefaultLogToOutputDebug 0
|
| -#define kDefaultLogLevel L1
|
| -#endif
|
| -
|
| -// Truncates the log file when the size of the log file is this many
|
| -// times over the MaxLogFileSize to prevent disk overfill.
|
| -#define kStopGapLogFileSizeFactor 10
|
| -
|
| -// config file sections
|
| -#define kConfigSectionLoggingLevel L"LoggingLevel"
|
| -#define kConfigSectionLoggingSettings L"LoggingSettings"
|
| -
|
| -// config file attributes
|
| -#define kConfigAttrEnableLogging L"EnableLogging"
|
| -#define kConfigAttrShowTime L"ShowTime"
|
| -#define kConfigAttrLogToFile L"LogToFile"
|
| -#define kConfigAttrLogFilePath L"LogFilePath"
|
| -#define kConfigAttrLogFileWide L"LogFileWide"
|
| -#define kConfigAttrLogToOutputDebug L"LogToOutputDebug"
|
| -#define kConfigAttrAppendToFile L"AppendToFile"
|
| -#define kConfigAttrMaxLogFileSize L"MaxLogFileSize"
|
| -
|
| -#define kLoggingMutexName kLockPrefix L"logging_mutex"
|
| -#define kMaxMutexWaitTimeMs 500
|
| -
|
| -// Does not allow messages bigger than 1 MB.
|
| -#define kMaxLogMessageSize (1024 * 1024)
|
| -
|
| -#define kLogSettingsCheckInterval (5 * kSecsTo100ns)
|
| -
|
| -#define kStartOfLogMessage \
|
| - L"********************* NEW LOG *********************"
|
| -#define kEndOfLogMessage \
|
| - L"********************* END LOG *********************"
|
| -
|
| -// TODO(omaha): Allow these defaults to be overriden in the config file.
|
| -#define kMaxLevelToStoreInLogHistory L2
|
| -#define kMaxHistoryBufferSize 1024
|
| -
|
| -#ifdef LOGGING
|
| -
|
| -#define LC_LOG(cat, level, msg) \
|
| - do { \
|
| - omaha::Logging* logger = omaha::GetLogging(); \
|
| - if (logger) { \
|
| - omaha::LoggingHelper(logger, cat, level, \
|
| - logger->IsCatLevelEnabled(cat, level)) msg; \
|
| - } \
|
| - } while (0)
|
| -
|
| -#define LC_LOG_OPT(cat, level, msg) LC_LOG(cat, level, msg)
|
| -
|
| -#else
|
| -#define LC_LOG(cat, level, msg) ((void)0)
|
| -#endif
|
| -
|
| -#ifdef _DEBUG
|
| -#define LC_LOG_DEBUG(cat, level, msg) LC_LOG(cat, level, msg)
|
| -#else
|
| -#define LC_LOG_DEBUG(cat, level, msg) ((void)0)
|
| -#endif
|
| -
|
| -// Shortcuts for different logging categories - no need to specify the category.
|
| -#define CORE_LOG(x, y) LC_LOG_DEBUG(omaha::LC_CORE, x, y)
|
| -#define NET_LOG(x, y) LC_LOG_DEBUG(omaha::LC_NET, x, y)
|
| -#define PLUGIN_LOG(x, y) LC_LOG_DEBUG(omaha::LC_PLUGIN, x, y)
|
| -#define SERVICE_LOG(x, y) LC_LOG_DEBUG(omaha::LC_SERVICE, x, y)
|
| -#define SETUP_LOG(x, y) LC_LOG_DEBUG(omaha::LC_SETUP, x, y)
|
| -#define SHELL_LOG(x, y) LC_LOG_DEBUG(omaha::LC_SHELL, x, y)
|
| -#define UTIL_LOG(x, y) LC_LOG_DEBUG(omaha::LC_UTIL, x, y)
|
| -
|
| -#define OPT_LOG(x, y) LC_LOG_OPT(omaha::LC_OPT, x, y)
|
| -#define REPORT_LOG(x, y) LC_LOG_OPT(omaha::LC_REPORT, x, y)
|
| -
|
| -#ifdef LOGGING
|
| -
|
| -// Logging components.
|
| -// Maximum 32 categories unless mask is increased to 64 bits.
|
| -enum LogCategory {
|
| - LC_LOGGING = 0,
|
| -
|
| - // ADD BELOW - AND REMEMBER:
|
| - // - Add a line to the LogCategoryNames table in logging.cc!!!
|
| - // - Add to C:\GoogleUpdate.ini.
|
| -
|
| - LC_UTIL,
|
| - LC_SETUP,
|
| - LC_SHELL,
|
| - LC_CORE,
|
| - LC_JS,
|
| - LC_PLUGIN,
|
| - LC_SERVICE,
|
| - LC_OPT,
|
| - LC_NET,
|
| - LC_REPORT,
|
| -
|
| - // ADD ABOVE
|
| -
|
| - LC_MAX_CAT
|
| -};
|
| -
|
| -#define kCatEnabledField L"Enabled"
|
| -#define kCatLevelField L"Level"
|
| -
|
| -struct CategoryInfo {
|
| - bool enabled;
|
| - LogLevel log_level;
|
| -};
|
| -
|
| -// If you want to log anything else, add it to this structure. This structure
|
| -// basically says that each logged message is composed of two parts, and they
|
| -// are output one after the other. Intended to be used for a message "prefix"
|
| -// and the message itself (the prefix can contain the component name, the time,
|
| -// and any other logging system boilerplate, while the message is supplied by
|
| -// the component). (This basically saves having to copy a variable length -
|
| -// possibly very large - message just to tack it onto the end of the message
|
| -// prefix.)
|
| -struct OutputInfo {
|
| - LogCategory category;
|
| - LogLevel level;
|
| - const wchar_t* msg1;
|
| - const wchar_t* msg2;
|
| -
|
| - OutputInfo(LogCategory cat, LogLevel log_level,
|
| - const wchar_t* m1, const wchar_t* m2)
|
| - : category(cat),
|
| - level(log_level),
|
| - msg1(m1),
|
| - msg2(m2) {}
|
| -};
|
| -
|
| -// The LogWriter - can decide whether to process message or not, then
|
| -// will process it. Actually, the message is processed if either a) the
|
| -// individual LogWriter wants to process it or b) it is marked as processable
|
| -// by settings in config ini.
|
| -//
|
| -// Included LogWriters:
|
| -// OutputDebugStringLogWriter - Logs to OutputDebugString() API
|
| -// FileLogWriter - Logs to a file
|
| -// OverrideConfigLogWriter - Overrides the level settings of a
|
| -// particular category, uses another writer to actually do the writing.
|
| -// Used, e.g., in installer to force SETUP_LOG messages to go to a file
|
| -// tr_setup_log.info even if the there is no trconfig.ini file.
|
| -//
|
| -// Not included LogWriters:
|
| -// StdLogWriter - Logs to stdout or stderr
|
| -// SubmitToGoogleLogWriter - When done logging submits the log file to
|
| -// Google's status-receiving server
|
| -class LogWriter {
|
| - protected:
|
| - LogWriter();
|
| - virtual void Cleanup();
|
| - public:
|
| - virtual ~LogWriter();
|
| -
|
| - // Returns true if this Logging object wants to log even if the global
|
| - // "enable logging" flag is off. Useful for always creating a log, e.g., an
|
| - // install log, even without a GoogleUpdate.ini.
|
| - virtual bool WantsToLogRegardless() const;
|
| -
|
| - // Returns true if this Logging object wants to handle the message,
|
| - // regardless of other settings.
|
| - virtual bool IsCatLevelEnabled(LogCategory category, LogLevel level) const;
|
| -
|
| - virtual void OutputMessage(const OutputInfo* output_info);
|
| -
|
| - // Registers and unregisters this LogWriter with the Logging system. When
|
| - // registered, the Logging class assumes ownership.
|
| - bool Register();
|
| - bool Unregister();
|
| -
|
| - private:
|
| - DISALLOW_EVIL_CONSTRUCTORS(LogWriter);
|
| -};
|
| -
|
| -// A LogWriter that writes to a named file.
|
| -class FileLogWriter : public LogWriter {
|
| - protected:
|
| - FileLogWriter(const wchar_t* file_name, bool append);
|
| - ~FileLogWriter();
|
| - virtual void Cleanup();
|
| -
|
| - public:
|
| - static FileLogWriter* Create(const wchar_t* file_name, bool append);
|
| - virtual void OutputMessage(const OutputInfo* output_info);
|
| -
|
| - private:
|
| - void Initialize();
|
| - bool CreateLoggingMutex();
|
| - bool CreateLoggingFile();
|
| - bool ArchiveLoggingFile();
|
| - bool TruncateLoggingFile();
|
| - bool GetMutex();
|
| - void ReleaseMutex();
|
| -
|
| - // Returns true if archiving of the log file is pending a computer restart.
|
| - bool IsArchivePending();
|
| -
|
| - // Returns the first position of str inside of a MULTI_SZ of count characters
|
| - // including the terminating zeros.
|
| - static int FindFirstInMultiString(const wchar_t* multi_str,
|
| - size_t count,
|
| - const wchar_t* str);
|
| -
|
| - uint32 max_file_size_;
|
| - bool initialized_;
|
| - bool valid_;
|
| - bool append_;
|
| - bool log_file_wide_;
|
| - CString log_file_mutex_name_;
|
| - HANDLE log_file_mutex_;
|
| - CString file_name_;
|
| - HANDLE log_file_;
|
| - CString proc_name_;
|
| -
|
| - friend class FileLogWriterTest;
|
| -
|
| - DISALLOW_EVIL_CONSTRUCTORS(FileLogWriter);
|
| -};
|
| -
|
| -// A LogWriter that uses OutputDebugString() to write messages.
|
| -class OutputDebugStringLogWriter : public LogWriter {
|
| - protected:
|
| - OutputDebugStringLogWriter();
|
| - ~OutputDebugStringLogWriter();
|
| - public:
|
| - static OutputDebugStringLogWriter* Create();
|
| - virtual void OutputMessage(const OutputInfo* info);
|
| - private:
|
| - DISALLOW_EVIL_CONSTRUCTORS(OutputDebugStringLogWriter);
|
| -};
|
| -
|
| -// A LogWriter that overrides the settings in trconfig.ini and sends messages
|
| -// to another LogWriter. Takes ownership of the other LogWriter.
|
| -class OverrideConfigLogWriter : public LogWriter {
|
| - protected:
|
| - OverrideConfigLogWriter(LogCategory category, LogLevel level,
|
| - LogWriter* log_writer, bool force_logging_enabled);
|
| - virtual void Cleanup();
|
| - public:
|
| - static OverrideConfigLogWriter* Create(LogCategory category, LogLevel level,
|
| - LogWriter* log_writer, bool force_logging_enabled);
|
| - virtual bool WantsToLogRegardless() const;
|
| - virtual bool IsCatLevelEnabled(LogCategory category, LogLevel level) const;
|
| - virtual void OutputMessage(const OutputInfo* output_info);
|
| - private:
|
| - LogCategory category_;
|
| - LogLevel level_;
|
| - LogWriter* log_writer_;
|
| - bool force_logging_enabled_;
|
| - DISALLOW_EVIL_CONSTRUCTORS(OverrideConfigLogWriter);
|
| -};
|
| -
|
| -// This log writer outputs to Event Tracing for Windows.
|
| -class EtwLogWriter;
|
| -
|
| -// The Logging class - Singleton class
|
| -// Fine-grain logging based on categories and levels.
|
| -// Can log to a file, stdout or debugger.
|
| -class Logging {
|
| - public:
|
| - // constructor
|
| - Logging();
|
| -
|
| - // destructor
|
| - ~Logging();
|
| -
|
| - // Enables/disables the logging mechanism. Allows turning logging on/off
|
| - // in mid-run. Returns true for success (not for 'logging enabled').
|
| - void EnableLogging();
|
| - void DisableLogging();
|
| -
|
| - // Checks if logging is enabled - and updates logging settings from the
|
| - // configuration file every kLogSettingsCheckInterval seconds
|
| - bool IsLoggingEnabled();
|
| -
|
| - // Checks if logging is already enabled. It does not try to enable it.
|
| - bool IsLoggingAlreadyEnabled() const;
|
| -
|
| - // Overrides the config file settings for showing the time stamps.
|
| - void ForceShowTimestamp(bool force_show_time);
|
| -
|
| - // Checks if logging is enabled for a given category and level.
|
| - DWORD IsCatLevelEnabled(LogCategory category, LogLevel level);
|
| - LogLevel GetCatLevel(LogCategory category) const;
|
| -
|
| - // Logs a message.
|
| - void LogMessage(LogCategory cat, LogLevel level, const wchar_t* fmt, ...);
|
| - void LogMessageVA(LogCategory cat, LogLevel level, const wchar_t* fmt,
|
| - va_list args);
|
| -
|
| - // Retrieves the default location of the log directory.
|
| - CString GetDefaultLogDirectory() const;
|
| -
|
| - // Computes and returns the complete path of the log file.
|
| - CString GetLogFilePath() const;
|
| -
|
| - // Retrieves in-memory history buffer.
|
| - CString GetHistory();
|
| -
|
| - // Returns the file path of the current GoogleUpdate.ini.
|
| - CString GetCurrentConfigurationFilePath() const;
|
| -
|
| - const CString& proc_name() const { return proc_name_; }
|
| -
|
| - bool IsCategoryEnabledForBuffering(LogCategory cat);
|
| - private:
|
| - bool InternalInitialize();
|
| - void InternalLogMessageMaskedVA(DWORD writer_mask,
|
| - LogCategory cat,
|
| - LogLevel level,
|
| - CString* log_buffer,
|
| - CString* prefix,
|
| - const wchar_t* fmt,
|
| - va_list args);
|
| -
|
| - friend class LoggingHelper;
|
| - void LogMessageMaskedVA(DWORD writer_mask, LogCategory cat, LogLevel level,
|
| - const wchar_t* fmt, va_list args);
|
| -
|
| - // Stores log message in in-memory history buffer.
|
| - void StoreInHistory(const OutputInfo* output_info);
|
| -
|
| - // Appends string to in-memory history buffer.
|
| - void AppendToHistory(const wchar_t* msg);
|
| -
|
| - // Initializes the logging engine. Harmless to call multiple times.
|
| - bool InitializeLogging();
|
| -
|
| - // Configures/unconfigures the log writers for the current settings. That
|
| - // is, given the current settings from GoogleUpdate.ini, either initializes
|
| - // and registers the file-out and debug-out logwriters, or unregisters them.
|
| - void ConfigureETWLogWriter();
|
| - void ConfigureFileLogWriter();
|
| - void ConfigureDebugOutLogWriter();
|
| - bool ConfigureLogging();
|
| - void UnconfigureLogging();
|
| -
|
| - void UpdateCatAndLevel(const wchar_t* cat_name, LogCategory cat);
|
| - void ReadLoggingSettings();
|
| -
|
| - // Returns the primary file path of the GoogleUpdate.ini.
|
| - CString GetConfigurationFilePath() const;
|
| -
|
| - // Returns the alternate file path of the GoogleUpdate.ini.
|
| - CString GetAltConfigurationFilePath() const;
|
| -
|
| - public:
|
| -
|
| - // Passes the messages along to other OutputMessage()
|
| - void OutputMessage(DWORD writer_mask, LogCategory cat, LogLevel level,
|
| - const wchar_t* msg1, const wchar_t* msg2);
|
| -
|
| - // Broadcasts the message to each LogWriter.
|
| - // It should be private but the function we want to be able to use this,
|
| - // debugASSERT is extern "C" and thus can't be declared a friend of
|
| - // Logging.
|
| - void OutputMessage(DWORD writer_mask, const OutputInfo* output_info);
|
| -
|
| - private:
|
| -
|
| - CategoryInfo category_list_[LC_MAX_CAT];
|
| -
|
| - // Checks if logging is initialized.
|
| - bool logging_initialized_;
|
| -
|
| - // Is logging in the process of initializing?
|
| - bool is_initializing_;
|
| -
|
| - // The logging process name including the calling module.
|
| - CString proc_name_;
|
| -
|
| - // Serializes changing logging init/uninit/enable/disable status.
|
| - LLock lock_;
|
| -
|
| - // Bunch of settings from the config .ini file.
|
| - bool logging_enabled_; // Checks if logging is enabled.
|
| - bool force_show_time_;
|
| - bool show_time_;
|
| - bool log_to_file_;
|
| - CString log_file_name_;
|
| - bool log_to_debug_out_;
|
| - bool append_to_file_;
|
| -
|
| - // Signals the logging system is shutting down.
|
| - bool logging_shutdown_;
|
| -
|
| - // Checkpoint time for dynamic category updates.
|
| - time64 g_last_category_check_time;
|
| -
|
| - // The file path of the optional ini file which defines the logging
|
| - // configuration.
|
| - CString config_file_path_;
|
| -
|
| - private:
|
| - bool InternalRegisterWriter(LogWriter* log_writer);
|
| - bool InternalUnregisterWriter(LogWriter* log_writer);
|
| -
|
| - public:
|
| - bool RegisterWriter(LogWriter* log_writer);
|
| - bool UnregisterWriter(LogWriter* log_writer);
|
| - enum { all_writers_mask = -1 };
|
| -
|
| - private:
|
| - enum { max_writers = 15 };
|
| - int num_writers_;
|
| - LogWriter* writers_[max_writers];
|
| -
|
| - LogWriter* file_log_writer_;
|
| - LogWriter* debug_out_writer_;
|
| - LogWriter* etw_log_writer_;
|
| -
|
| - friend class HistoryTest;
|
| -
|
| - DISALLOW_EVIL_CONSTRUCTORS(Logging);
|
| -};
|
| -
|
| -// In order to make the logging macro LC_LOG work out we need to pass a
|
| -// parameter (the mask of loggers to write to) (*) to the actual logging
|
| -// method. However, the last parameter to the macro LC_LOG has its own
|
| -// parenthesis - it encloses multiple expressions (a format string and
|
| -// arguments). So this function object is used as an intermediary in order to
|
| -// hold the writer mask.
|
| -//
|
| -// (*) The mask needs to be transferred separately because we want to keep the
|
| -// LC_LOG structure of asking if the message is going to be logged before
|
| -// evaluating the arguments, and we can't store it in the singleton Logging
|
| -// object - wouldn't be thread-safe.
|
| -
|
| -class LoggingHelper {
|
| - public:
|
| - LoggingHelper(Logging* logger, LogCategory cat,
|
| - LogLevel level, DWORD writer_mask)
|
| - : logger_(logger),
|
| - category_(cat),
|
| - level_(level),
|
| - writer_mask_(writer_mask) {}
|
| -
|
| - void operator()(const wchar_t* fmt, ...) {
|
| - va_list args;
|
| - va_start(args, fmt);
|
| - logger_->LogMessageMaskedVA(writer_mask_, category_, level_, fmt, args);
|
| - va_end(args);
|
| - }
|
| -
|
| - private:
|
| - Logging* logger_;
|
| - DWORD writer_mask_;
|
| - LogLevel level_;
|
| - LogCategory category_;
|
| -
|
| - DISALLOW_EVIL_CONSTRUCTORS(LoggingHelper);
|
| -};
|
| -
|
| -// Getter for the Logging singleton class.
|
| -Logging* GetLogging();
|
| -
|
| -#endif // LOGGING
|
| -
|
| -} // namespace omaha
|
| -
|
| -#endif // OMAHA_BASE_LOGGING_H_
|
|
|