// Copyright 2014 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. #include "components/device_event_log/device_event_log.h" #include #include "base/logging.h" #include "base/thread_task_runner_handle.h" #include "components/device_event_log/device_event_log_impl.h" namespace device_event_log { namespace { const size_t kDefaultMaxEntries = 4000; const int kSlowMethodThresholdMs = 10; const int kVerySlowMethodThresholdMs = 50; DeviceEventLogImpl* g_device_event_log = NULL; } // namespace const LogLevel kDefaultLogLevel = LOG_LEVEL_EVENT; void Initialize(size_t max_entries) { CHECK(!g_device_event_log); if (max_entries == 0) max_entries = kDefaultMaxEntries; g_device_event_log = new DeviceEventLogImpl(base::ThreadTaskRunnerHandle::Get(), max_entries); } bool IsInitialized() { return !!g_device_event_log; } void Shutdown() { delete g_device_event_log; g_device_event_log = NULL; } void AddEntry(const char* file, int line, LogType type, LogLevel level, const std::string& event) { if (g_device_event_log) { g_device_event_log->AddEntry(file, line, type, level, event); } else { DeviceEventLogImpl::SendToVLogOrErrorLog(file, line, type, level, event); } } void AddEntryWithDescription(const char* file, int line, LogType type, LogLevel level, const std::string& event, const std::string& desc) { std::string event_with_desc = event; if (!desc.empty()) event_with_desc += ": " + desc; AddEntry(file, line, type, level, event_with_desc); } std::string GetAsString(StringOrder order, const std::string& format, const std::string& types, LogLevel max_level, size_t max_events) { if (!g_device_event_log) return "DeviceEventLog not initialized."; return g_device_event_log->GetAsString(order, format, types, max_level, max_events); } namespace internal { DeviceEventLogInstance::DeviceEventLogInstance(const char* file, int line, device_event_log::LogType type, device_event_log::LogLevel level) : file_(file), line_(line), type_(type), level_(level) { } DeviceEventLogInstance::~DeviceEventLogInstance() { device_event_log::AddEntry(file_, line_, type_, level_, stream_.str()); } DeviceEventSystemErrorLogInstance::DeviceEventSystemErrorLogInstance( const char* file, int line, device_event_log::LogType type, device_event_log::LogLevel level, logging::SystemErrorCode err) : err_(err), log_instance_(file, line, type, level) { } DeviceEventSystemErrorLogInstance::~DeviceEventSystemErrorLogInstance() { stream() << ": " << ::logging::SystemErrorCodeToString(err_); } ScopedDeviceLogIfSlow::ScopedDeviceLogIfSlow(LogType type, const char* file, const std::string& name) : file_(file), type_(type), name_(name) { } ScopedDeviceLogIfSlow::~ScopedDeviceLogIfSlow() { if (timer_.Elapsed().InMilliseconds() >= kSlowMethodThresholdMs) { LogLevel level(LOG_LEVEL_DEBUG); if (timer_.Elapsed().InMilliseconds() >= kVerySlowMethodThresholdMs) level = LOG_LEVEL_ERROR; DEVICE_LOG(type_, level) << "@@@ Slow method: " << file_ << ":" << name_ << ": " << timer_.Elapsed().InMilliseconds() << "ms"; } } } // namespace internal } // namespace device_event_log