]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5420] Extracted log stuff from database code
authorFrancis Dupont <fdupont@isc.org>
Thu, 4 Jan 2018 15:00:51 +0000 (16:00 +0100)
committerFrancis Dupont <fdupont@isc.org>
Thu, 4 Jan 2018 15:00:51 +0000 (16:00 +0100)
src/lib/dhcpsrv/Makefile.am
src/lib/dhcpsrv/cql_connection.cc
src/lib/dhcpsrv/database_connection.cc
src/lib/dhcpsrv/db_log.cc [new file with mode: 0644]
src/lib/dhcpsrv/db_log.h [new file with mode: 0644]
src/lib/dhcpsrv/dhcpsrv_db_log.cc [new file with mode: 0644]
src/lib/dhcpsrv/dhcpsrv_db_log.h [new file with mode: 0644]
src/lib/dhcpsrv/mysql_connection.cc
src/lib/dhcpsrv/mysql_connection.h
src/lib/dhcpsrv/pgsql_connection.cc

index b0f134edb0cb885e6cd885ff09c00acbf0f75406..be1e62c5492f18ccafb2c83d0951b8077c1d6856 100644 (file)
@@ -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
index 2598f404d90b617bfa87d15b2da98cab7ba98c40..ac470d9e9e1b6d48da0a8e09189245c634ba31fa 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2015-2017 Deutsche Telekom AG.
+// Copyright (C) 2015-2018 Deutsche Telekom AG.
 //
 // Authors: Razvan Becheriu <razvan.becheriu@qualitance.com>
 //          Andrei Pavel <andrei.pavel@qualitance.com>
@@ -20,7 +20,7 @@
 #include <dhcpsrv/cql_connection.h>
 #include <dhcpsrv/cql_exchange.h>
 #include <dhcpsrv/db_exceptions.h>
-#include <dhcpsrv/dhcpsrv_log.h>
+#include <dhcpsrv/db_log.h>
 
 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
index 0aa886fa889f62a5da6942d7b78b5e0fdeb03028..701c6957110f360d2e641ba3a2bb99907e194efe 100644 (file)
@@ -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 <dhcpsrv/database_connection.h>
 #include <dhcpsrv/db_exceptions.h>
-#include <dhcpsrv/dhcpsrv_log.h>
+#include <dhcpsrv/db_log.h>
 #include <exceptions/exceptions.h>
 
 #include <boost/algorithm/string.hpp>
@@ -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 (file)
index 0000000..c416645
--- /dev/null
@@ -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 <exceptions/exceptions.h>
+#include <dhcpsrv/db_log.h>
+#include <dhcpsrv/dhcpsrv_db_log.h>
+
+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 (file)
index 0000000..31e2ba0
--- /dev/null
@@ -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 <log/macros.h>
+
+#include <map>
+#include <list>
+
+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<DbMessageID, isc::log::MessageID> 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<DbLogger> 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 (file)
index 0000000..b39585e
--- /dev/null
@@ -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 <dhcpsrv/dhcpsrv_db_log.h>
+#include <dhcpsrv/dhcpsrv_log.h>
+
+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 (file)
index 0000000..5965350
--- /dev/null
@@ -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 <dhcpsrv/db_log.h>
+
+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
index 827c46571a26d7d6d38690a96eabade097c4655a..8ec91b0db97653420949b5b33d859d052bcaa121 100644 (file)
@@ -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 <dhcpsrv/dhcpsrv_log.h>
+#include <dhcpsrv/db_log.h>
 #include <dhcpsrv/mysql_connection.h>
 #include <exceptions/exceptions.h>
 
@@ -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_));
index cf2a64f95bf94ef52eb6418e8f33a21f50f7a8e2..e1e8d76f27b952c05d4df0431caf3286300efe52 100644 (file)
@@ -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 <dhcpsrv/database_connection.h>
-#include <dhcpsrv/dhcpsrv_log.h>
+#include <dhcpsrv/db_log.h>
 #include <exceptions/exceptions.h>
 #include <boost/scoped_ptr.hpp>
 #include <mysql.h>
@@ -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<int>(index)])
-                         .arg(mysql_error(mysql_))
-                         .arg(mysql_errno(mysql_));
+                DB_LOG_ERROR(MYSQL_FATAL_ERROR)
+                    .arg(what)
+                    .arg(text_statements_[static_cast<int>(index)])
+                    .arg(mysql_error(mysql_))
+                    .arg(mysql_errno(mysql_));
                 exit (-1);
 
             default:
index 0e66d6e558606a4146530b7d5d92d49c292c9999..8aff919488b8f0e4f5e71c0634fd6f4b6b06e321 100644 (file)
@@ -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 <config.h>
 
-#include <dhcpsrv/dhcpsrv_log.h>
+#include <dhcpsrv/db_log.h>
 #include <dhcpsrv/pgsql_connection.h>
 
 // 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_);