blob: d53158f782a150943e338726fbf3f6537e321834 [file] [log] [blame]
// Copyright 2020 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.
#include "src/devices/lib/driver2/logger.h"
#include <fuchsia/logger/llcpp/fidl.h>
zx::status<Logger> Logger::Create(const Namespace& ns, async_dispatcher_t* dispatcher,
std::string_view name, fx_log_severity_t min_severity) {
zx::socket client_end, server_end;
zx_status_t status = zx::socket::create(ZX_SOCKET_DATAGRAM, &client_end, &server_end);
if (status != ZX_OK) {
return zx::error(status);
}
auto ns_result = ns.Connect("/svc/fuchsia.logger.LogSink");
if (ns_result.is_error()) {
return ns_result.take_error();
}
fidl::Client<llcpp::fuchsia::logger::LogSink> log_sink(std::move(ns_result.value()), dispatcher);
auto sink_result = log_sink->Connect(std::move(server_end));
if (!sink_result.ok()) {
return zx::error(sink_result.status());
}
const char* tags[] = {name.data()};
fx_logger_config_t config = {
.min_severity = min_severity,
.console_fd = -1,
.log_service_channel = client_end.release(),
.tags = tags,
.num_tags = std::size(tags),
};
fx_logger_t* logger;
status = fx_logger_create(&config, &logger);
if (status != ZX_OK) {
return zx::error(status);
}
return zx::ok(Logger(logger));
}
Logger::Logger(fx_logger_t* logger) : logger_(logger) {}
Logger::~Logger() {
if (logger_ != nullptr) {
fx_logger_destroy(logger_);
}
}
Logger::Logger(Logger&& other) noexcept : logger_(other.logger_) { other.logger_ = nullptr; }
Logger& Logger::operator=(Logger&& other) noexcept {
this->~Logger();
logger_ = other.logger_;
other.logger_ = nullptr;
return *this;
}
#define LOGGER_FUNCTION(name, severity) \
void Logger::name(const char* msg, ...) { \
va_list args; \
va_start(args, msg); \
log(severity, msg, args); \
va_end(args); \
}
LOGGER_FUNCTION(trace, FX_LOG_TRACE)
LOGGER_FUNCTION(debug, FX_LOG_DEBUG)
LOGGER_FUNCTION(info, FX_LOG_INFO)
LOGGER_FUNCTION(warning, FX_LOG_WARNING)
LOGGER_FUNCTION(error, FX_LOG_ERROR)
#undef LOGGER_FUNCTION
void Logger::log(fx_log_severity_t severity, const char* msg, va_list args) {
fx_logger_logvf(logger_, severity, nullptr, msg, args);
}