| // 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 <string> |
| |
| #include "base/logging.h" |
| #include "base/threading/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 = nullptr; |
| |
| } // 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 = nullptr; |
| } |
| |
| 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 |