From: Francis Dupont Date: Thu, 4 Jan 2018 15:00:51 +0000 (+0100) Subject: [5420] Extracted log stuff from database code X-Git-Tag: trac5502_base~6^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9fade705ee49ceea515f1aaaa3905d74a6ee3cc5;p=thirdparty%2Fkea.git [5420] Extracted log stuff from database code --- diff --git a/src/lib/dhcpsrv/Makefile.am b/src/lib/dhcpsrv/Makefile.am index b0f134edb0..be1e62c549 100644 --- a/src/lib/dhcpsrv/Makefile.am +++ b/src/lib/dhcpsrv/Makefile.am @@ -114,8 +114,10 @@ libkea_dhcpsrv_la_SOURCES += d2_client_mgr.cc d2_client_mgr.h libkea_dhcpsrv_la_SOURCES += daemon.cc daemon.h libkea_dhcpsrv_la_SOURCES += database_connection.cc database_connection.h libkea_dhcpsrv_la_SOURCES += db_exceptions.h +libkea_dhcpsrv_la_SOURCES += db_log.cc db_log.h libkea_dhcpsrv_la_SOURCES += dhcp4o6_ipc.cc dhcp4o6_ipc.h libkea_dhcpsrv_la_SOURCES += dhcpsrv_log.cc dhcpsrv_log.h +libkea_dhcpsrv_la_SOURCES += dhcpsrv_db_log.cc dhcpsrv_db_log.h libkea_dhcpsrv_la_SOURCES += host.cc host.h libkea_dhcpsrv_la_SOURCES += host_container.h libkea_dhcpsrv_la_SOURCES += host_data_source_factory.cc host_data_source_factory.h diff --git a/src/lib/dhcpsrv/cql_connection.cc b/src/lib/dhcpsrv/cql_connection.cc index 2598f404d9..ac470d9e9e 100644 --- a/src/lib/dhcpsrv/cql_connection.cc +++ b/src/lib/dhcpsrv/cql_connection.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2017 Deutsche Telekom AG. +// Copyright (C) 2015-2018 Deutsche Telekom AG. // // Authors: Razvan Becheriu // Andrei Pavel @@ -20,7 +20,7 @@ #include #include #include -#include +#include namespace isc { namespace dhcp { @@ -67,7 +67,7 @@ CqlConnection::~CqlConnection() { if (rc != CASS_OK) { // We're closing the connection anyway. Let's not throw at this stage. - LOG_ERROR(dhcpsrv_logger, DHCPSRV_CQL_DEALLOC_ERROR).arg(error); + DB_LOG_ERROR(CQL_DEALLOC_ERROR).arg(error); } } @@ -347,20 +347,17 @@ CqlConnection::setConsistency(bool force, CassConsistency consistency) { void CqlConnection::startTransaction() { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, - DHCPSRV_CQL_CONNECTION_BEGIN_TRANSACTION); + DB_LOG_DEBUG(DB_DBG_TRACE_DETAIL, CQL_CONNECTION_BEGIN_TRANSACTION); } void CqlConnection::commit() { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, - DHCPSRV_CQL_CONNECTION_COMMIT); + DB_LOG_DEBUG(DB_DBG_TRACE_DETAIL, CQL_CONNECTION_COMMIT); } void CqlConnection::rollback() { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, - DHCPSRV_CQL_CONNECTION_ROLLBACK); + DB_LOG_DEBUG(DB_DBG_TRACE_DETAIL, CQL_CONNECTION_ROLLBACK); } const std::string diff --git a/src/lib/dhcpsrv/database_connection.cc b/src/lib/dhcpsrv/database_connection.cc index 0aa886fa88..701c695711 100644 --- a/src/lib/dhcpsrv/database_connection.cc +++ b/src/lib/dhcpsrv/database_connection.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2015-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include @@ -48,7 +48,7 @@ DatabaseConnection::parse(const std::string& dbaccess) { string value = token.substr(pos + 1); mapped_tokens.insert(make_pair(name, value)); } else { - LOG_ERROR(dhcpsrv_logger, DHCPSRV_INVALID_ACCESS).arg(dbaccess); + DB_LOG_ERROR(DB_INVALID_ACCESS).arg(dbaccess); isc_throw(InvalidParameter, "Cannot parse " << token << ", expected format is name=value"); } diff --git a/src/lib/dhcpsrv/db_log.cc b/src/lib/dhcpsrv/db_log.cc new file mode 100644 index 0000000000..c41664524f --- /dev/null +++ b/src/lib/dhcpsrv/db_log.cc @@ -0,0 +1,34 @@ +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +/// Defines the logger used by the NSAS + +#include +#include +#include + +using namespace isc::log; + +namespace isc { +namespace dhcp { + +const MessageID& +DbLogger::translateMessage(const DbMessageID& id) const { + try { + return (map_.at(id)); + } catch (const std::out_of_range&) { + isc_throw(isc::Unexpected, "can't map message: " << id); + } +} + +void checkDbLoggerStack() { + if (db_logger_stack.empty()) { + isc_throw(isc::Unexpected, "database logger stack is empty"); + } +} + +} // namespace dhcp +} // namespace isc diff --git a/src/lib/dhcpsrv/db_log.h b/src/lib/dhcpsrv/db_log.h new file mode 100644 index 0000000000..31e2ba046f --- /dev/null +++ b/src/lib/dhcpsrv/db_log.h @@ -0,0 +1,140 @@ +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef DB_LOG_H +#define DB_LOG_H + +#include + +#include +#include + +namespace isc { +namespace dhcp { + +///@{ +/// @brief Database logging levels +/// +/// Defines the levels used to output debug messages in the database +/// support. Note that higher numbers equate to more verbose (and detailed) +/// output. + +/// @brief Additional information +/// +/// Record detailed tracing. This is generally reserved for tracing access to +/// the lease database. +const int DB_DBG_TRACE_DETAIL = isc::log::DBGLVL_TRACE_DETAIL; + +///@} + +///@{ +/// @brief Database messages +/// +enum DbMessageID { + DB_INVALID_ACCESS, + + PGSQL_DEALLOC_ERROR, + PGSQL_FATAL_ERROR, + PGSQL_START_TRANSACTION, + PGSQL_COMMIT, + PGSQL_ROLLBACK, + + MYSQL_FATAL_ERROR, + MYSQL_START_TRANSACTION, + MYSQL_COMMIT, + MYSQL_ROLLBACK, + + CQL_DEALLOC_ERROR, + CQL_CONNECTION_BEGIN_TRANSACTION, + CQL_CONNECTION_COMMIT, + CQL_CONNECTION_ROLLBACK +}; +///@} + +/// @brief Database logger class +/// +class DbLogger { +public: + /// @brief Translation map type + typedef std::map MessageMap; + + /// @brief Constructor + /// + /// @param logger logger which will be called + DbLogger(isc::log::Logger& logger, const MessageMap& map) + : logger_(logger), map_(map) { + } + + /// @brief Translate message + /// + /// @param id database message id + /// @return logger message + /// @throw Unexpected if the id is not in the message map + const isc::log::MessageID& translateMessage(const DbMessageID& id) const; + + /// @brief The logger + isc::log::Logger& logger_; + + /// @brief The translation map + const MessageMap& map_; +}; + +/// @brief Database logger stack +typedef std::list DbLoggerStack; + +/// @brief Global database logger stack (initialized to dhcpsrv logger) +extern DbLoggerStack db_logger_stack; + +/// @brief Check database logger stack +/// +/// @throw Unexpected if the stack is empty +void checkDbLoggerStack(); + +///@{ +/// @brief Macros + +#define DB_LOG_DEBUG(LEVEL, MESSAGE) \ + checkDbLoggerStack(); \ + if (!db_logger_stack.back().logger_.isDebugEnabled((LEVEL))) { \ + } else \ + db_logger_stack.back().logger_.debug((LEVEL), \ + db_logger_stack.back().translateMessage((MESSAGE))) + + +#define DB_LOG_INFO(MESSAGE) \ + checkDbLoggerStack(); \ + if (!db_logger_stack.back().logger_.isInfoEnabled()) { \ + } else \ + db_logger_stack.back().logger_.info( \ + db_logger_stack.back().translateMessage((MESSAGE))) + +#define DB_LOG_WARN(MESSAGE) \ + checkDbLoggerStack(); \ + if (!db_logger_stack.back().logger_.isWarnEnabled()) { \ + } else \ + db_logger_stack.back().logger_.warn( \ + db_logger_stack.back().translateMessage((MESSAGE))) + +#define DB_LOG_ERROR(MESSAGE) \ + checkDbLoggerStack(); \ + if (!db_logger_stack.back().logger_.isErrorEnabled()) { \ + } else \ + db_logger_stack.back().logger_.error( \ + db_logger_stack.back().translateMessage((MESSAGE))) + +#define DB_LOG_FATAL(MESSAGE) \ + checkDbLoggerStack(); \ + if (!db_logger_stack.back().logger_.isFatalEnabled()) { \ + } else \ + db_logger_stack.back().logger_.fatal( \ + db_logger_stack.back().translateMessage((MESSAGE))) + +///@} + +} // namespace dhcp +} // namespace isc + +#endif // DB_LOG_H diff --git a/src/lib/dhcpsrv/dhcpsrv_db_log.cc b/src/lib/dhcpsrv/dhcpsrv_db_log.cc new file mode 100644 index 0000000000..b39585edd6 --- /dev/null +++ b/src/lib/dhcpsrv/dhcpsrv_db_log.cc @@ -0,0 +1,43 @@ +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +/// Defines the logger used by the NSAS + +#include +#include + +namespace isc { +namespace dhcp { + +const DbLogger::MessageMap dhcpsrv_db_message_map = { + { DB_INVALID_ACCESS, DHCPSRV_INVALID_ACCESS }, + + { PGSQL_DEALLOC_ERROR, DHCPSRV_PGSQL_DEALLOC_ERROR }, + { PGSQL_FATAL_ERROR, DHCPSRV_PGSQL_FATAL_ERROR }, + { PGSQL_START_TRANSACTION, DHCPSRV_PGSQL_START_TRANSACTION }, + { PGSQL_COMMIT, DHCPSRV_PGSQL_COMMIT }, + { PGSQL_ROLLBACK, DHCPSRV_PGSQL_ROLLBACK }, + + { MYSQL_FATAL_ERROR, DHCPSRV_MYSQL_FATAL_ERROR }, + { MYSQL_START_TRANSACTION, DHCPSRV_MYSQL_START_TRANSACTION }, + { MYSQL_COMMIT, DHCPSRV_MYSQL_COMMIT }, + { MYSQL_ROLLBACK, DHCPSRV_MYSQL_ROLLBACK }, + + { CQL_DEALLOC_ERROR, DHCPSRV_CQL_DEALLOC_ERROR }, + { CQL_CONNECTION_BEGIN_TRANSACTION, + DHCPSRV_CQL_CONNECTION_BEGIN_TRANSACTION }, + { CQL_CONNECTION_COMMIT, DHCPSRV_CQL_CONNECTION_COMMIT }, + { CQL_CONNECTION_ROLLBACK, DHCPSRV_CQL_CONNECTION_ROLLBACK } +}; + +DbLogger dhcpsrv_db_logger(dhcpsrv_logger, dhcpsrv_db_message_map); + +// Do this initialization here! +DbLoggerStack db_logger_stack = { dhcpsrv_db_logger }; + + +} // namespace dhcp +} // namespace isc diff --git a/src/lib/dhcpsrv/dhcpsrv_db_log.h b/src/lib/dhcpsrv/dhcpsrv_db_log.h new file mode 100644 index 0000000000..5965350cfe --- /dev/null +++ b/src/lib/dhcpsrv/dhcpsrv_db_log.h @@ -0,0 +1,26 @@ +// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef DHCPSRV_DB_LOG_H +#define DHCPSRV_DB_LOG_H + +#include + +namespace isc { +namespace dhcp { + +/// @brief DHCP server database message map +extern const DbLogger::MessageMap dhcpsrv_db_message_map; + +/// @brief DHCP server database Logger +/// +/// It is the default database logger. +extern DbLogger dhcpsrv_db_logger; + +} // namespace dhcp +} // namespace isc + +#endif // DHCPSRV_DB_LOG_H diff --git a/src/lib/dhcpsrv/mysql_connection.cc b/src/lib/dhcpsrv/mysql_connection.cc index 827c46571a..8ec91b0db9 100644 --- a/src/lib/dhcpsrv/mysql_connection.cc +++ b/src/lib/dhcpsrv/mysql_connection.cc @@ -1,11 +1,11 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -#include +#include #include #include @@ -368,8 +368,7 @@ MySqlConnection::convertFromDatabaseTime(const MYSQL_TIME& expire, void MySqlConnection::startTransaction() { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, - DHCPSRV_MYSQL_START_TRANSACTION); + DB_LOG_DEBUG(DB_DBG_TRACE_DETAIL, MYSQL_START_TRANSACTION); // We create prepared statements for all other queries, but MySQL // don't support prepared statements for START TRANSACTION. int status = mysql_query(mysql_, "START TRANSACTION"); @@ -381,7 +380,7 @@ MySqlConnection::startTransaction() { void MySqlConnection::commit() { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MYSQL_COMMIT); + DB_LOG_DEBUG(DB_DBG_TRACE_DETAIL, MYSQL_COMMIT); if (mysql_commit(mysql_) != 0) { isc_throw(DbOperationError, "commit failed: " << mysql_error(mysql_)); @@ -390,7 +389,7 @@ MySqlConnection::commit() { void MySqlConnection::rollback() { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MYSQL_ROLLBACK); + DB_LOG_DEBUG(DB_DBG_TRACE_DETAIL, MYSQL_ROLLBACK); if (mysql_rollback(mysql_) != 0) { isc_throw(DbOperationError, "rollback failed: " << mysql_error(mysql_)); diff --git a/src/lib/dhcpsrv/mysql_connection.h b/src/lib/dhcpsrv/mysql_connection.h index cf2a64f95b..e1e8d76f27 100644 --- a/src/lib/dhcpsrv/mysql_connection.h +++ b/src/lib/dhcpsrv/mysql_connection.h @@ -1,4 +1,4 @@ -// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -8,7 +8,7 @@ #define MYSQL_CONNECTION_H #include -#include +#include #include #include #include @@ -390,11 +390,11 @@ public: case CR_OUT_OF_MEMORY: case CR_CONNECTION_ERROR: // We're exiting on fatal - LOG_ERROR(dhcpsrv_logger, DHCPSRV_MYSQL_FATAL_ERROR) - .arg(what) - .arg(text_statements_[static_cast(index)]) - .arg(mysql_error(mysql_)) - .arg(mysql_errno(mysql_)); + DB_LOG_ERROR(MYSQL_FATAL_ERROR) + .arg(what) + .arg(text_statements_[static_cast(index)]) + .arg(mysql_error(mysql_)) + .arg(mysql_errno(mysql_)); exit (-1); default: diff --git a/src/lib/dhcpsrv/pgsql_connection.cc b/src/lib/dhcpsrv/pgsql_connection.cc index 0e66d6e558..8aff919488 100644 --- a/src/lib/dhcpsrv/pgsql_connection.cc +++ b/src/lib/dhcpsrv/pgsql_connection.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2016-2018 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -6,7 +6,7 @@ #include -#include +#include #include // PostgreSQL errors should be tested based on the SQL state code. Each state @@ -114,8 +114,7 @@ PgSqlConnection::~PgSqlConnection() { PgSqlResult r(PQexec(conn_, "DEALLOCATE all")); if(PQresultStatus(r) != PGRES_COMMAND_OK) { // Highly unlikely but we'll log it and go on. - LOG_ERROR(dhcpsrv_logger, DHCPSRV_PGSQL_DEALLOC_ERROR) - .arg(PQerrorMessage(conn_)); + DB_LOG_ERROR(PGSQL_DEALLOC_ERROR).arg(PQerrorMessage(conn_)); } } } @@ -295,10 +294,10 @@ PgSqlConnection::checkStatementError(const PgSqlResult& r, (memcmp(sqlstate, "54", 2) == 0) || // Program Limit exceeded (memcmp(sqlstate, "57", 2) == 0) || // Operator intervention (memcmp(sqlstate, "58", 2) == 0))) { // System error - LOG_ERROR(dhcpsrv_logger, DHCPSRV_PGSQL_FATAL_ERROR) - .arg(statement.name) - .arg(PQerrorMessage(conn_)) - .arg(sqlstate); + DB_LOG_ERROR(PGSQL_FATAL_ERROR) + .arg(statement.name) + .arg(PQerrorMessage(conn_)) + .arg(sqlstate); exit (-1); } @@ -311,8 +310,7 @@ PgSqlConnection::checkStatementError(const PgSqlResult& r, void PgSqlConnection::startTransaction() { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, - DHCPSRV_PGSQL_START_TRANSACTION); + DB_LOG_DEBUG(DB_DBG_TRACE_DETAIL, PGSQL_START_TRANSACTION); PgSqlResult r(PQexec(conn_, "START TRANSACTION")); if (PQresultStatus(r) != PGRES_COMMAND_OK) { const char* error_message = PQerrorMessage(conn_); @@ -323,7 +321,7 @@ PgSqlConnection::startTransaction() { void PgSqlConnection::commit() { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_PGSQL_COMMIT); + DB_LOG_DEBUG(DB_DBG_TRACE_DETAIL, PGSQL_COMMIT); PgSqlResult r(PQexec(conn_, "COMMIT")); if (PQresultStatus(r) != PGRES_COMMAND_OK) { const char* error_message = PQerrorMessage(conn_); @@ -333,7 +331,7 @@ PgSqlConnection::commit() { void PgSqlConnection::rollback() { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_PGSQL_ROLLBACK); + DB_LOG_DEBUG(DB_DBG_TRACE_DETAIL, PGSQL_ROLLBACK); PgSqlResult r(PQexec(conn_, "ROLLBACK")); if (PQresultStatus(r) != PGRES_COMMAND_OK) { const char* error_message = PQerrorMessage(conn_);