blob: e0f379cd86936f38eb0622aed9435dbc84c16b26 [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(bool connect) {
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,
.log_service_channel = ZX_HANDLE_INVALID,
.tags = &tag,
.num_tags = 1};
fx_logger_t* logger = NULL;
status = fx_logger_create_internal(&config, &logger, connect);
// Making the default logger should never fail.
ZX_DEBUG_ASSERT(status == ZX_OK);
return logger;
}
} // namespace
fx_logger_t* get_or_create_global_logger(bool connect) {
// 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 contructed on
// the first call to this function and will be leaked on shutdown.
static fx_logger_t* logger = MakeDefaultLogger(connect);
return logger;
}
SYSLOG_EXPORT
fx_logger_t* fx_log_get_logger() { return get_or_create_global_logger(true); }
SYSLOG_EXPORT
zx_status_t fx_log_reconfigure(const fx_logger_config_t* config) {
fx_logger_t* logger = get_or_create_global_logger(
config->console_fd == -1 && config->log_service_channel == ZX_HANDLE_INVALID);
return logger->Reconfigure(
config, (config->console_fd == -1 && config->log_service_channel == ZX_HANDLE_INVALID &&
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(int verbosity) {
if (verbosity < 0) {
verbosity = 0;
}
// verbosity scale sits in the interstitial space between INFO and DEBUG
int 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(int verbosity) {
fx_logger_t* logger = fx_log_get_logger();
return logger && (verbosity >= 0) &&
fx_log_severity_from_verbosity(verbosity) >= fx_logger_get_min_severity(logger);
}