| // 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_SYSMEM_SERVER_LOGGING_H_ |
| #define SRC_SYSMEM_SERVER_LOGGING_H_ |
| |
| #include <lib/fit/function.h> |
| #include <lib/syslog/cpp/macros.h> |
| #include <stdarg.h> |
| #include <zircon/compiler.h> |
| |
| #include <string> |
| |
| namespace sysmem_service { |
| |
| using LogCallback = fit::function<void(::fuchsia_logging::LogSeverity severity, const char* file, |
| int line, const char* formatted_str)>; |
| LogCallback& GetDefaultLogCallback(); |
| |
| void vLogToCallback(::fuchsia_logging::LogSeverity severity, const char* file, int line, |
| const char* prefix, const char* format, va_list args, |
| const LogCallback& log_callback); |
| |
| void vLog(::fuchsia_logging::LogSeverity severity, const char* file, int line, const char* prefix, |
| const char* format, va_list args); |
| |
| void Log(::fuchsia_logging::LogSeverity severity, const char* file, int line, const char* prefix, |
| const char* format, ...) __PRINTFLIKE(5, 6); |
| |
| // Creates a unique name by concatenating prefix and a 64-bit unique number. |
| std::string CreateUniqueName(const char* prefix); |
| |
| // Represents a source code location. Use FROM_HERE to get the current file location. |
| class Location { |
| public: |
| static Location FromHere(const char* file, int line_number) { |
| return Location(file, line_number); |
| } |
| Location(const char* file, int line_number) : file_(file), line_(line_number) {} |
| |
| const char* file() const { return file_; } |
| int line() const { return line_; } |
| |
| private: |
| const char* file_{}; |
| int line_{}; |
| }; |
| |
| #define FROM_HERE Location::FromHere(__FILE__, __LINE__) |
| |
| class LoggingMixin { |
| protected: |
| explicit LoggingMixin(const char* logging_prefix) : logging_prefix_(logging_prefix) {} |
| void LogInfo(Location location, const char* format, ...) __PRINTFLIKE(3, 4) { |
| va_list args; |
| va_start(args, format); |
| vLog(fuchsia_logging::LogSeverity::Info, location.file(), location.line(), logging_prefix_, |
| format, args); |
| va_end(args); |
| } |
| void LogError(Location location, const char* format, ...) __PRINTFLIKE(3, 4) { |
| va_list args; |
| va_start(args, format); |
| vLog(fuchsia_logging::LogSeverity::Info, location.file(), location.line(), logging_prefix_, |
| format, args); |
| va_end(args); |
| } |
| |
| const char* logging_prefix() const { return logging_prefix_; } |
| |
| private: |
| const char* logging_prefix_; |
| }; |
| |
| // This is used for functions where they'd spam the log in a unit test. This doesn't accept varargs, |
| // but the function doing the complaining can format locally as needed. |
| // |
| // FROM_HERE, severity, c string to log or mute or count or similar |
| using ComplainFunction = fit::function<void(Location, fuchsia_logging::LogSeverity, const char*)>; |
| |
| } // namespace sysmem_service |
| |
| #endif // SRC_SYSMEM_SERVER_LOGGING_H_ |