prod/native/libcommon/code/LoggerInterface.h (56 lines of code) (raw):
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#pragma once
#include "LogLevel.h"
#include "LogFeature.h"
#include "basic_macros.h"
#include <format>
#include <unordered_map>
#include <stdarg.h>
namespace elasticapm::php {
class LoggerInterface {
public:
virtual ~LoggerInterface() {
}
virtual void log(LogLevel level, const std::string &message) const = 0;
virtual void printf(LogLevel level, const char *format, ...) const = 0;
virtual bool doesMeetsLevelCondition(LogLevel level) const = 0;
virtual bool doesFeatureMeetsLevelCondition(LogLevel level, LogFeature feature) const = 0;
virtual LogLevel getMaxLogLevel() const = 0;
virtual void setLogFeatures(std::unordered_map<elasticapm::php::LogFeature, LogLevel> features) = 0;
};
#define PRsv "%.*s"
#define PRsvArg(strv) static_cast<int>(strv.size()), strv.data()
#define PRcsvArg(str, len) len, str
#define PRzsArg(strv) ZSTR_LEN(strv), ZSTR_VAL(strv)
// clang-format off
// ELOG*_NF_* - means no feature log
// ELOGF_* - printf style
// ELOG_* - std::format style
#define ELOG(logger, level, feature, formatStr, ...) \
do { \
if (!logger || !logger->doesFeatureMeetsLevelCondition(level, elasticapm::php::LogFeature::feature)) break; \
logger->log(level, std::format("[{}] {}", #feature, std::format(formatStr, ##__VA_ARGS__))); \
} while(false)
#define ELOG_NF(logger, level, formatStr, ...) ELOG(logger, level, ALL, formatStr, ##__VA_ARGS__)
#define ELOG_CRITICAL(logger, feature, formatStr, ...) ELOG(logger, LogLevel::logLevel_critical, feature, formatStr, ##__VA_ARGS__)
#define ELOG_ERROR(logger, feature, formatStr, ...) ELOG(logger, LogLevel::logLevel_error, feature, formatStr, ##__VA_ARGS__)
#define ELOG_WARNING(logger, feature, formatStr, ...) ELOG(logger, LogLevel::logLevel_warning, feature, formatStr, ##__VA_ARGS__)
#define ELOG_INFO(logger, feature, formatStr, ...) ELOG(logger, LogLevel::logLevel_info, feature, formatStr, ##__VA_ARGS__)
#define ELOG_DEBUG(logger, feature, formatStr, ...) ELOG(logger, LogLevel::logLevel_debug, feature, formatStr, ##__VA_ARGS__)
#define ELOG_TRACE(logger, feature, formatStr, ...) ELOG(logger, LogLevel::logLevel_trace, feature, formatStr, ##__VA_ARGS__)
#define ELOG_NF_CRITICA(logger, formatStr, ...) ELOG_NF(logger, LogLevel::logLevel_critical, formatStr, ##__VA_ARGS__)
#define ELOG_NF_ERROR(logger, formatStr, ...) ELOG_NF(logger, LogLevel::logLevel_error, formatStr, ##__VA_ARGS__)
#define ELOG_NF_WARNING(logger, formatStr, ...) ELOG_NF(logger, LogLevel::logLevel_warning, formatStr, ##__VA_ARGS__)
#define ELOG_NF_INFO(logger, formatStr, ...) ELOG_NF(logger, LogLevel::logLevel_info, formatStr, ##__VA_ARGS__)
#define ELOG_NF_DEBUG(logger, formatStr, ...) ELOG_NF(logger, LogLevel::logLevel_debug, formatStr, ##__VA_ARGS__)
#define ELOG_NF_TRACE(logger, formatStr, ...) ELOG_NF(logger, LogLevel::logLevel_trace, formatStr, ##__VA_ARGS__)
// printf style
#define ELOGF(logger, level, feature, format, ...) do { if (!logger || !logger->doesFeatureMeetsLevelCondition(level, elasticapm::php::LogFeature::feature)) break; logger->printf(level, "[" EL_STRINGIFY(feature) "] " format, ##__VA_ARGS__); } while(false);
#define ELOGF_NF(logger, level, format, ...) ELOGF(logger, level, ALL, format, ##__VA_ARGS__)
#define ELOGF_CRITICAL(logger, feature, format, ...) ELOGF(logger, LogLevel::logLevel_critical, feature, format, ##__VA_ARGS__)
#define ELOGF_ERROR(logger, feature, format, ...) ELOGF(logger, LogLevel::logLevel_error, feature, format, ##__VA_ARGS__)
#define ELOGF_WARNING(logger, feature, format, ...) ELOGF(logger, LogLevel::logLevel_warning, feature, format, ##__VA_ARGS__)
#define ELOGF_INFO(logger, feature, format, ...) ELOGF(logger, LogLevel::logLevel_info, feature, format, ##__VA_ARGS__)
#define ELOGF_DEBUG(logger, feature, format, ...) ELOGF(logger, LogLevel::logLevel_debug, feature, format, ##__VA_ARGS__)
#define ELOGF_TRACE(logger, feature, format, ...) ELOGF(logger, LogLevel::logLevel_trace, feature, format, ##__VA_ARGS__)
#define ELOGF_NF_CRITICAL(logger, format, ...) ELOGF_NF(logger, LogLevel::logLevel_critical, format, ##__VA_ARGS__)
#define ELOGF_NF_ERROR(logger, format, ...) ELOGF_NF(logger, LogLevel::logLevel_error, format, ##__VA_ARGS__)
#define ELOGF_NF_WARNING(logger, format, ...) ELOGF_NF(logger, LogLevel::logLevel_warning, format, ##__VA_ARGS__)
#define ELOGF_NF_INFO(logger, format, ...) ELOGF_NF(logger, LogLevel::logLevel_info, format, ##__VA_ARGS__)
#define ELOGF_NF_DEBUG(logger, format, ...) ELOGF_NF(logger, LogLevel::logLevel_debug, format, ##__VA_ARGS__)
#define ELOGF_NF_TRACE(logger, format, ...) ELOGF_NF(logger, LogLevel::logLevel_trace, format, ##__VA_ARGS__)
// clang-format on
}