|  | // Copyright 2019 The Fuchsia 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 SRC_DEVELOPER_DEBUG_SHARED_LOGGING_LOGGING_H_ | 
|  | #define SRC_DEVELOPER_DEBUG_SHARED_LOGGING_LOGGING_H_ | 
|  |  | 
|  | // This header is meant to be the hub of debug logging: timers, logging, etc. There is no need to | 
|  | // include the other headers directly. | 
|  |  | 
|  | #include <sstream> | 
|  |  | 
|  | #include "src/developer/debug/shared/logging/macros.h" | 
|  | #include "src/developer/debug/shared/logging/debug.h" | 
|  | #include "src/developer/debug/shared/logging/file_line_function.h" | 
|  |  | 
|  | namespace debug_ipc { | 
|  |  | 
|  | // Normally you would use this macro to create logging statements. | 
|  | // Example: | 
|  | // | 
|  | // DEBUG_LOG(Job) << "Some job statement."; | 
|  | // DEBUG_LOG(MessageLoop) << "Some event with id " << id; | 
|  | // | 
|  | // If the logging will occur on some other function, you can pass the location into the other macro: | 
|  | // | 
|  | // | 
|  | // if (err.has_error()) | 
|  | //   LogSomewhereElse(FROM_HERE, LogCategory::kAgent, error.msg()); | 
|  | // | 
|  | //  ... | 
|  | // | 
|  | // void LogSomewhereElse(FileLineFunction location, LogCategory category, std::string msg) { | 
|  | //    ... | 
|  | //    DEBUG_LOG_WITH_LOCATION(category, location) << msg; | 
|  | // } | 
|  | // | 
|  |  | 
|  | #define DEBUG_LOG_WITH_LOCATION(category, location)           \ | 
|  | ::debug_ipc::LogStatement STRINGIFY(__debug_log, __LINE__)( \ | 
|  | location, ::debug_ipc::LogCategory::k##category);       \ | 
|  | STRINGIFY(__debug_log, __LINE__).stream() | 
|  |  | 
|  | #define DEBUG_LOG(category) \ | 
|  | DEBUG_LOG_WITH_LOCATION(category, FROM_HERE) | 
|  |  | 
|  | // Creates a conditional logger depending whether the debug mode is active or not. See debug.h for | 
|  | // more details. | 
|  | class LogStatement { | 
|  | public: | 
|  | explicit LogStatement(FileLineFunction origin, LogCategory); | 
|  | ~LogStatement(); | 
|  |  | 
|  | std::ostream& stream() { return stream_; } | 
|  | std::string GetMsg(); | 
|  |  | 
|  | const FileLineFunction& origin() const { return origin_; } | 
|  | LogCategory category() const { return category_; } | 
|  | double start_time() const { return start_time_; } | 
|  |  | 
|  | private: | 
|  | FileLineFunction origin_; | 
|  | LogCategory category_; | 
|  | bool should_log_ = false; | 
|  | double start_time_; | 
|  |  | 
|  | std::ostringstream stream_; | 
|  | }; | 
|  |  | 
|  | }  // namespace debug_ipc | 
|  |  | 
|  | #endif  // SRC_DEVELOPER_DEBUG_SHARED_LOGGING_LOGGING_H_ |