blob: 34f885d4524b113326692930278afb7960a91fae [file] [log] [blame]
// Copyright 2018 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 <lib/syslog/global.h>
#include <lib/zx/process.h>
#include <memory>
#include "export.h"
#include "fx_logger.h"
#include "lib/syslog/logger.h"
namespace syslog_internal {
__WEAK bool HasStructuredBackend() { return false; }
} // namespace syslog_internal
namespace {
fx_logger_t* MakeDefaultLogger() {
char process_name[ZX_MAX_NAME_LEN] = "";
const char* tag = process_name;
zx_status_t status =
zx::process::self()->get_property(ZX_PROP_NAME, process_name, sizeof(process_name));
if (status != ZX_OK)
process_name[0] = '\0';
fx_logger_config_t config = {
.min_severity = FX_LOG_SEVERITY_DEFAULT,
.console_fd = -1,
.tags = &tag,
.num_tags = 1,
};
fx_logger_t* logger = NULL;
status = fx_logger_create_internal(&config, &logger);
// Making the default logger should never fail.
ZX_DEBUG_ASSERT(status == ZX_OK);
return logger;
}
} // namespace
fx_logger_t* get_or_create_global_logger() {
// Upon initialization, the default logger is either provided with a
// socket connection, or a fallback file-descriptor (which it will use)
// or it will be initialized to log to STDERR. This object is constructed on
// the first call to this function and will be leaked on shutdown.
static fx_logger_t* logger = MakeDefaultLogger();
return logger;
}
SYSLOG_EXPORT
fx_logger_t* fx_log_get_logger() { return get_or_create_global_logger(); }
SYSLOG_EXPORT
zx_status_t fx_log_reconfigure(const fx_logger_config_t* config) {
fx_logger_t* logger = get_or_create_global_logger();
return logger->Reconfigure(
config, (config->console_fd == -1 && config->log_sink_socket == ZX_HANDLE_INVALID));
}
SYSLOG_EXPORT
bool fx_log_is_enabled(fx_log_severity_t severity) {
fx_logger_t* logger = fx_log_get_logger();
return severity >= fx_logger_get_min_severity(logger);
}
SYSLOG_EXPORT
fx_log_severity_t fx_log_severity_from_verbosity(uint8_t verbosity) {
// verbosity scale sits in the interstitial space between INFO and DEBUG
fx_log_severity_t severity = FX_LOG_INFO - (verbosity * FX_LOG_VERBOSITY_STEP_SIZE);
if (severity < FX_LOG_DEBUG + 1) {
return FX_LOG_DEBUG + 1;
}
return severity;
}
SYSLOG_EXPORT
bool fx_vlog_is_enabled(uint8_t verbosity) {
fx_logger_t* logger = fx_log_get_logger();
return logger && fx_log_severity_from_verbosity(verbosity) >= fx_logger_get_min_severity(logger);
}