blob: 090664e71d658194ba73de4fbebf67d706008f67 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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 <fstream>
#include <mutex>
#include <sstream>
#include <string>
#define LOG_MSG(param) \
do { \
if (ignite::odbc_logger *p = ignite::odbc_logger::get()) { \
ignite::log_stream lstream(p); \
lstream << __FUNCTION__ << ": " << param; \
} \
} while (false)
#define TRACE_MSG(param) \
do { \
ignite::odbc_logger *p = ignite::odbc_logger::get(); \
if (p && p->is_trace_enabled()) { \
ignite::log_stream lstream(p); \
lstream << __FUNCTION__ << ": " << param; \
} \
} while (false)
namespace ignite {
/* Forward declaration */
class odbc_logger;
/**
* Helper object providing stream operations for single log line.
* Writes resulting string to odbc_logger object upon destruction.
*/
class log_stream : public std::basic_ostream<char> {
public:
// Delete
log_stream(log_stream &&) = delete;
log_stream(const log_stream &) = delete;
log_stream &operator=(log_stream &&) = delete;
log_stream &operator=(const log_stream &) = delete;
/**
* Constructor.
* @param parent pointer to odbc_logger.
*/
explicit log_stream(odbc_logger *parent)
: std::basic_ostream<char>(nullptr)
, m_string_buf()
, m_logger(parent) {
init(&m_string_buf);
}
/**
* Conversion operator helpful to determine if log is enabled
* @return True if logger is enabled
*/
bool operator()() { return m_logger != nullptr; }
/**
* Destructor.
*/
~log_stream() override;
private:
/** String buffer. */
std::basic_stringbuf<char> m_string_buf{};
/** Parent logger object */
odbc_logger *m_logger{nullptr};
};
/**
* Logging facility.
*/
class odbc_logger {
public:
// Delete
odbc_logger(odbc_logger &&) = delete;
odbc_logger(const odbc_logger &) = delete;
odbc_logger &operator=(odbc_logger &&) = delete;
odbc_logger &operator=(const odbc_logger &) = delete;
/**
* Get instance of odbc_logger, if enabled.
*
* @return odbc_logger instance if logging is enabled. Null otherwise.
*/
static odbc_logger *get();
/**
* Checks if logging is enabled.
*
* @return True, if logging is enabled.
*/
[[nodiscard]] bool is_enabled() const;
/**
* Checks if tracing is enabled.
*
* @return True, if tracing is enabled.
*/
[[nodiscard]] bool is_trace_enabled() const { return m_trace_enabled; }
/**
* Outputs the message to log file
* @param message The message to write
*/
void write_message(std::string const &message);
private:
/**
* Constructor.
*
* @param path to log file.
* @param trace_enabled Tracing enabled.
*/
odbc_logger(const char *path, bool trace_enabled);
/**
* Destructor.
*/
~odbc_logger() = default;
/** Mutex for writes synchronization. */
std::mutex m_mutex{};
/** File stream. */
std::ofstream m_stream{};
/** Trace enabled. */
bool m_trace_enabled{false};
};
} // namespace ignite