From 4fd16922d4e7ae2e5fd9dd048a873cbef409a7ff Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Fri, 1 Mar 2013 13:19:11 -0500
Subject: log: adding default loggers to all gr_blocks to make using them
 simpler. log: improving logger configuration and default behavior. log:
 changed name from gr_log to gr_logger (felt it could be confuse with the math
 function log). docs: moved logging information out to its own page.

---
 gnuradio-core/src/lib/runtime/CMakeLists.txt  |   8 +-
 gnuradio-core/src/lib/runtime/gr_block.cc     |  47 +++
 gnuradio-core/src/lib/runtime/gr_block.h      |   6 +
 gnuradio-core/src/lib/runtime/gr_log.cc       | 112 ------
 gnuradio-core/src/lib/runtime/gr_log.h        | 380 --------------------
 gnuradio-core/src/lib/runtime/gr_log.i        |  94 -----
 gnuradio-core/src/lib/runtime/gr_logger.cc    | 189 ++++++++++
 gnuradio-core/src/lib/runtime/gr_logger.h     | 498 ++++++++++++++++++++++++++
 gnuradio-core/src/lib/runtime/gr_logger.i     |  96 +++++
 gnuradio-core/src/lib/runtime/qa_gr_log.cc    |  51 ---
 gnuradio-core/src/lib/runtime/qa_gr_log.h     |  42 ---
 gnuradio-core/src/lib/runtime/qa_gr_logger.cc |  51 +++
 gnuradio-core/src/lib/runtime/qa_gr_logger.h  |  42 +++
 gnuradio-core/src/lib/runtime/qa_runtime.cc   |   4 +-
 gnuradio-core/src/lib/runtime/runtime.i       |   4 +-
 15 files changed, 937 insertions(+), 687 deletions(-)
 delete mode 100644 gnuradio-core/src/lib/runtime/gr_log.cc
 delete mode 100644 gnuradio-core/src/lib/runtime/gr_log.h
 delete mode 100644 gnuradio-core/src/lib/runtime/gr_log.i
 create mode 100644 gnuradio-core/src/lib/runtime/gr_logger.cc
 create mode 100644 gnuradio-core/src/lib/runtime/gr_logger.h
 create mode 100644 gnuradio-core/src/lib/runtime/gr_logger.i
 delete mode 100644 gnuradio-core/src/lib/runtime/qa_gr_log.cc
 delete mode 100644 gnuradio-core/src/lib/runtime/qa_gr_log.h
 create mode 100644 gnuradio-core/src/lib/runtime/qa_gr_logger.cc
 create mode 100644 gnuradio-core/src/lib/runtime/qa_gr_logger.h

(limited to 'gnuradio-core/src/lib/runtime')

diff --git a/gnuradio-core/src/lib/runtime/CMakeLists.txt b/gnuradio-core/src/lib/runtime/CMakeLists.txt
index 1f8156edd1..6772f7a26d 100644
--- a/gnuradio-core/src/lib/runtime/CMakeLists.txt
+++ b/gnuradio-core/src/lib/runtime/CMakeLists.txt
@@ -62,7 +62,7 @@ list(APPEND gnuradio_core_sources
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_error_handler.cc
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_io_signature.cc
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_local_sighandler.cc
-    ${CMAKE_CURRENT_SOURCE_DIR}/gr_log.cc
+    ${CMAKE_CURRENT_SOURCE_DIR}/gr_logger.cc
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_message.cc
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_msg_accepter.cc
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_msg_handler.cc
@@ -106,7 +106,7 @@ list(APPEND test_gnuradio_core_sources
     ${CMAKE_CURRENT_SOURCE_DIR}/qa_block_tags.cc
     ${CMAKE_CURRENT_SOURCE_DIR}/qa_runtime.cc
     ${CMAKE_CURRENT_SOURCE_DIR}/qa_set_msg_handler.cc
-    ${CMAKE_CURRENT_SOURCE_DIR}/qa_gr_log.cc
+    ${CMAKE_CURRENT_SOURCE_DIR}/qa_gr_logger.cc
 )
 
 ########################################################################
@@ -128,7 +128,7 @@ install(FILES
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_error_handler.h
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_io_signature.h
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_local_sighandler.h
-    ${CMAKE_CURRENT_SOURCE_DIR}/gr_log.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/gr_logger.h
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_message.h
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_msg_accepter.h
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_msg_handler.h
@@ -173,7 +173,7 @@ install(FILES
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_dispatcher.i
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_error_handler.i
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_io_signature.i
-    ${CMAKE_CURRENT_SOURCE_DIR}/gr_log.i
+    ${CMAKE_CURRENT_SOURCE_DIR}/gr_logger.i
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_message.i
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_msg_handler.i
     ${CMAKE_CURRENT_SOURCE_DIR}/gr_msg_queue.i
diff --git a/gnuradio-core/src/lib/runtime/gr_block.cc b/gnuradio-core/src/lib/runtime/gr_block.cc
index 54d2676203..0dc9fe670d 100644
--- a/gnuradio-core/src/lib/runtime/gr_block.cc
+++ b/gnuradio-core/src/lib/runtime/gr_block.cc
@@ -29,6 +29,7 @@
 #include <stdexcept>
 #include <iostream>
 #include <gr_block_registry.h>
+#include <gr_prefs.h>
 
 gr_block::gr_block (const std::string &name,
                     gr_io_signature_sptr input_signature,
@@ -49,6 +50,52 @@ gr_block::gr_block (const std::string &name,
     d_min_output_buffer(std::max(output_signature->max_streams(),1), -1)
 {
     global_block_registry.register_primitive(alias(), this);
+
+#ifdef ENABLE_GR_LOG
+#ifdef HAVE_LOG4CXX
+    gr_prefs *p = gr_prefs::singleton();
+    std::string config_file = p->get_string("LOG", "log_config", "");
+    std::string log_level = p->get_string("LOG", "log_level", "off");
+    std::string log_file = p->get_string("LOG", "log_file", "");
+    std::string debug_level = p->get_string("LOG", "debug_level", "off");
+    std::string debug_file = p->get_string("LOG", "debug_file", "");
+
+    GR_CONFIG_LOGGER(config_file);
+
+    GR_LOG_GETLOGGER(LOG, "gr_log." + alias());
+    GR_LOG_SET_LEVEL(LOG, log_level);
+    if(log_file.size() > 0) {
+      if(log_file == "stdout") {
+        GR_LOG_ADD_CONSOLE_APPENDER(LOG, "gr::log :%p: %c{1} - %m%n", "System.out");
+      }
+      else if(log_file == "stderr") {
+        GR_LOG_ADD_CONSOLE_APPENDER(LOG, "gr::log :%p: %c{1} - %m%n", "System.err");
+      }
+      else {
+        GR_LOG_ADD_FILE_APPENDER(LOG, "%r :%p: %c{1} - %m%n", log_file, "");
+      }
+    }
+    d_logger = LOG;
+
+    GR_LOG_GETLOGGER(DLOG, "gr_log_debug." + alias());
+    GR_LOG_SET_LEVEL(DLOG, debug_level);
+    if(debug_file.size() > 0) {
+      if(debug_file == "stdout") {
+        GR_LOG_ADD_CONSOLE_APPENDER(DLOG, "gr::log :%p: %c{1} - %m%n", "System.out");
+      }
+      else if(debug_file == "stderr") {
+        GR_LOG_ADD_CONSOLE_APPENDER(DLOG, "gr::log :%p: %c{1} - %m%n", "System.err");
+      }
+      else {
+        GR_LOG_ADD_FILE_APPENDER(DLOG, "%r :%p: %c{1} - %m%n", debug_file, "");
+      }
+    }
+    d_debug_logger = DLOG;
+#endif /* HAVE_LOG4CXX */
+#else /* ENABLE_GR_LOG */
+    d_logger = NULL;
+    d_debug_logger = NULL;
+#endif /* ENABLE_GR_LOG */
 }
 
 gr_block::~gr_block ()
diff --git a/gnuradio-core/src/lib/runtime/gr_block.h b/gnuradio-core/src/lib/runtime/gr_block.h
index 0783e86848..e4b30267e6 100644
--- a/gnuradio-core/src/lib/runtime/gr_block.h
+++ b/gnuradio-core/src/lib/runtime/gr_block.h
@@ -26,6 +26,7 @@
 #include <gr_core_api.h>
 #include <gr_basic_block.h>
 #include <gr_tags.h>
+#include <gr_logger.h>
 
 /*!
  * \brief The abstract base class for all 'terminal' processing blocks.
@@ -616,6 +617,11 @@ class GR_CORE_API gr_block : public gr_basic_block {
    */ 
   gruel::mutex d_setlock;
 
+  /*! Used by blocks to access the logger system.
+   */ 
+  gr_logger_ptr d_logger;
+  gr_logger_ptr d_debug_logger;
+
   // These are really only for internal use, but leaving them public avoids
   // having to work up an ever-varying list of friend GR_CORE_APIs
 
diff --git a/gnuradio-core/src/lib/runtime/gr_log.cc b/gnuradio-core/src/lib/runtime/gr_log.cc
deleted file mode 100644
index 371878d7f4..0000000000
--- a/gnuradio-core/src/lib/runtime/gr_log.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- * 
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-/*
- * config.h is generated by configure.  It contains the results
- * of probing for features, options etc.  It should be the first
- * file included in your .cc file.
- */
-
-/*******************************************************************************
-* Copyright 2011 Johns Hopkins University Applied Physics Lab
-* Author: Mark Plett 
-* Description:
-*   The gr_log module wraps the log4cxx library for logging in gnuradio.
-*******************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h" 
-#endif
-
-#include <gr_log.h>
-#include <stdexcept>
-#include <algorithm>
-
-#ifdef ENABLE_GR_LOG
-
-void
-logger_load_config(const std::string &config_filename)
-{
-  if(config_filename.size() == 0) {
-    log4cxx::BasicConfigurator::configure();
-  }
-  else if(config_filename.find(".xml") != std::string::npos) {
-    log4cxx::xml::DOMConfigurator::configure(config_filename);
-  }
-  else {
-    log4cxx::PropertyConfigurator::configure(config_filename);
-  }
-}
-
-void
-logger_set_level(log4cxx::LoggerPtr logger, const std::string &level)
-{
-  std::string nocase = level;
-  std::transform(level.begin(), level.end(), nocase.begin(), ::tolower);
-  
-  if(nocase == "off")
-    logger_set_level(logger, log4cxx::Level::getOff());
-  else if(nocase == "all")
-    logger_set_level(logger, log4cxx::Level::getAll());
-  else if(nocase == "trace")
-    logger_set_level(logger, log4cxx::Level::getTrace());
-  else if(nocase == "debug")
-    logger_set_level(logger, log4cxx::Level::getDebug());
-  else if(nocase == "info")
-    logger_set_level(logger, log4cxx::Level::getInfo());
-  else if(nocase == "warn")
-    logger_set_level(logger, log4cxx::Level::getWarn());
-  else if(nocase == "error")
-    logger_set_level(logger, log4cxx::Level::getError());
-  else if(nocase == "fatal")
-    logger_set_level(logger, log4cxx::Level::getFatal());
-  else
-    throw std::runtime_error("logger_set_level: Bad level type.\n");
-}
-
-void
-logger_set_level(log4cxx::LoggerPtr logger, log4cxx::LevelPtr level)
-{
-  logger->setLevel(level);
-}
-
-void 
-logger_get_level(log4cxx::LoggerPtr logger,std::string &level)
-{
-  log4cxx::LevelPtr levelPtr = logger->getLevel();
-  if(levelPtr == log4cxx::Level::getOff()) level = "off";
-  if(levelPtr == log4cxx::Level::getAll()) level = "all";
-  if(levelPtr == log4cxx::Level::getTrace()) level = "trace";
-  if(levelPtr == log4cxx::Level::getDebug()) level = "debug";
-  if(levelPtr == log4cxx::Level::getInfo()) level = "info";
-  if(levelPtr == log4cxx::Level::getWarn()) level = "warn";
-  if(levelPtr == log4cxx::Level::getError()) level = "error";
-  if(levelPtr == log4cxx::Level::getFatal()) level = "fatal";
-};
-
-void 
-logger_get_level(log4cxx::LoggerPtr logger,log4cxx::LevelPtr level)
-{
-  level = logger->getLevel();
-}
-
-#endif /* ENABLE_GR_LOG */
diff --git a/gnuradio-core/src/lib/runtime/gr_log.h b/gnuradio-core/src/lib/runtime/gr_log.h
deleted file mode 100644
index 4a0449b203..0000000000
--- a/gnuradio-core/src/lib/runtime/gr_log.h
+++ /dev/null
@@ -1,380 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- * 
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-/*******************************************************************************
-* Copyright 2011 Johns Hopkins University Applied Physics Lab
-* Author: Mark Plett
-* Description:
-*   The gr_log module wraps the log4cxx library for logging in gnuradio
-*******************************************************************************/
-
-#ifndef INCLUDED_GR_LOG_H
-#define INCLUDED_GR_LOG_H
-
-/*!
-* \file gr_log.h
-* \ingroup logging
-* \brief GNURADIO logging wrapper for log4cxx library (C++ port of log4j)
-*
-*/
-
-#ifdef ENABLE_GR_LOG
-
-#include <gr_core_api.h>
-#include <stdio.h>
-#include <string>
-#include <stdlib.h>
-#include <assert.h>
-
-#include <log4cxx/logger.h>
-#include <log4cxx/logmanager.h>
-#include <log4cxx/basicconfigurator.h>
-#include <log4cxx/xml/domconfigurator.h>
-#include <log4cxx/propertyconfigurator.h>
-
-//using namespace log4cxx;
-//using namespace log4cxx::xml;
-//using namespace log4cxx::helpers;
-
-/*!
- * \brief GR_LOG macros
- * \ingroup logging
- *
- * These macros wrap the standard LOG4CXX_LEVEL macros.  The availablie macros
- * are:
- *  GR_LOG_TRACE
- *  GR_LOG_DEBUG
- *  GR_LOG_INFO
- *  GR_LOG_WARN
- *  GR_LOG_ERROR
- *  GR_LOG_FATAL
- */
-
-#define GR_CONFIG_LOGGER(config)	\
-  logger_load_config(config)
-
-#define GR_LOG_GETLOGGER(logger, name) \
-  log4cxx::LoggerPtr logger = gr_log::getLogger(name);
-
-#define GR_SET_LEVEL(name, level){ \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  logger_set_level(logger, level);}
-
-#define GR_LOG_SET_LEVEL(logger, level) \
-  logger_set_level(logger, level);
-
-#define GR_GET_LEVEL(name, level){ \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  logger_get_level(logger,level);}
-
-#define GR_LOG_GET_LEVEL(logger, level) \
-  logger_get_level(logger,level);
-
-
-/* Logger name referenced macros */
-#define GR_TRACE(name, msg) { \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  LOG4CXX_TRACE(logger, msg);}
-
-#define GR_DEBUG(name, msg) { \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  LOG4CXX_DEBUG(logger, msg);}
-
-#define GR_INFO(name, msg) { \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  LOG4CXX_INFO(logger, msg);}
-
-#define GR_WARN(name, msg) { \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  LOG4CXX_WARN(logger, msg);}
-
-#define GR_ERROR(name, msg) { \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  LOG4CXX_ERROR(logger, msg);}
-
-#define GR_FATAL(name, msg) { \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  LOG4CXX_FATAL(logger, msg);}
-
-#define GR_ERRORIF(name, cond, msg) { \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  LOG4CXX_ASSERT(logger, !(cond), msg);}
-
-#define GR_ASSERT(name, cond, msg) { \
-  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
-  LOG4CXX_ASSERT(logger, (cond), msg); \
-  assert((cond));}
-
-/* LoggerPtr Referenced Macros */
-#define GR_LOG_TRACE(logger, msg) { \
-  LOG4CXX_TRACE(logger, msg);}
-
-#define GR_LOG_DEBUG(logger, msg) { \
-  LOG4CXX_DEBUG(logger, msg);}
-
-#define GR_LOG_INFO(logger, msg) { \
-  LOG4CXX_INFO(logger, msg);}
-
-#define GR_LOG_WARN(logger, msg) { \
-  LOG4CXX_WARN(logger, msg);}
-
-#define GR_LOG_ERROR(logger, msg) { \
-  LOG4CXX_ERROR(logger, msg);}
-
-#define GR_LOG_FATAL(logger, msg) { \
-  LOG4CXX_FATAL(logger, msg);}
-
-#define GR_LOG_ERRORIF(logger,cond, msg) { \
-  LOG4CXX_ASSERT(logger, !(cond), msg);}
-
-#define GR_LOG_ASSERT(logger, cond, msg) { \
-  LOG4CXX_ASSERT(logger, (cond), msg); \
-  assert((cond));}
-
-
-/*!
- * \brief Load logger's configuration file.
- *
- * Initialize the GNU Radio logger by loading the configuration file
- * \p config_filename.
- *
- * \param config_filename The configuration file. Set to "" for the
- *        basic logger that outputs to the console.
- */
-GR_CORE_API void logger_load_config(const std::string &config_filename="");
-
-/*!
- * \brief Set the logger's output level.
- *
- * Sets the level of the logger. This takes a string that is
- * translated to the standard levels and can be (case insensitive):
- *
- * \li off
- * \li all
- * \li trace
- * \li debug
- * \li info
- * \li warn
- * \li error
- * \li fatal
- *
- * \param logger the logger to set the level of.
- * \param level  string to set the level to.
- */
-GR_CORE_API void logger_set_level(log4cxx::LoggerPtr logger, const std::string &level);
-
-/*!
- * \brief Set the logger's output level.
- *
- * Sets the level of the logger. This takes the actual Log4cxx::Level
- * data type, which can be:
- *
- * \li log4cxx::Level::getOff()
- * \li log4cxx::Level::getAll()
- * \li log4cxx::Level::getTrace()
- * \li log4cxx::Level::getDebug()
- * \li log4cxx::Level::getInfo()
- * \li log4cxx::Level::getWarn()
- * \li log4cxx::Level::getError()
- * \li log4cxx::Level::getFatal()
- *
- * \param logger the logger to set the level of.
- * \param level  new logger level of type Log4cxx::Level
- */
-void logger_set_level(log4cxx::LoggerPtr logger, log4cxx::LevelPtr level);
-
-
-/*!
- * \brief Get the logger's output level.
- *
- * Gets the level of the logger. This returns a string that
- * corresponds to the standard levels and can be (case insensitive):
- *
- * \li off
- * \li all
- * \li trace
- * \li debug
- * \li info
- * \li warn
- * \li error
- * \li fatal
- *
- * \param logger the logger to get the level of.
- * \param level  string to get the level into.
- */
-GR_CORE_API void logger_get_level(log4cxx::LoggerPtr logger,std::string &level);
-
-/*!
- * \brief Get the logger's output level.
- *
- * Gets the level of the logger. This returns the actual Log4cxx::Level
- * data type, which can be:
- *
- * \li log4cxx::Level::getOff()
- * \li log4cxx::Level::getAll()
- * \li log4cxx::Level::getTrace()
- * \li log4cxx::Level::getDebug()
- * \li log4cxx::Level::getInfo()
- * \li log4cxx::Level::getWarn()
- * \li log4cxx::Level::getError()
- * \li log4cxx::Level::getFatal()
- *
- * \param logger the logger to get the level of.
- */
-void logger_get_level(log4cxx::LoggerPtr logger,log4cxx::LevelPtr level);
-
-
-/*!
- * \brief instantiate (configure) logger.
- * \ingroup logging
- *
- */
-class gr_log
-{
- public:
-  /*!
-   * \brief contructor take log configuration file and configures loggers.
-   */
-  gr_log(std::string config_filename)
-  {
-    // Load configuration file
-    logger_load_config(config_filename);
-  };
-
-  /*!
-   * \brief contructor take log configuration file and watchtime and configures
-   */
-  gr_log(std::string config_filename, int watchPeriodSec)
-  {
-    // Load configuration file
-    if(config_filename.find(".xml")!=std::string::npos) {
-      log4cxx::xml::DOMConfigurator::configureAndWatch(config_filename, watchPeriodSec);
-    }
-    else {
-      log4cxx::PropertyConfigurator::configureAndWatch(config_filename, watchPeriodSec);
-    }
-  };
-
-  static log4cxx::LoggerPtr getLogger(std::string name)
-  {
-    if(log4cxx::LogManager::exists(name)) {
-      log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name);
-      return logger;
-    }
-    else {
-      log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name);
-      logger->setLevel(log4cxx::Level::getOff());
-      return logger;
-    };
-  };
-
-  // Wrappers for logging macros
-  /*! \brief inline function, wrapper to set the logger level */
-  void set_level(std::string name,std::string level){GR_SET_LEVEL(name,level);}
-  
-  /*! \brief inline function, wrapper to get the logger level */
-  void get_level(std::string name,std::string &level){GR_GET_LEVEL(name,level);}
-
-  /*! \brief inline function, wrapper for LOG4CXX_TRACE for TRACE message */
-  void trace(std::string name,std::string msg){GR_TRACE(name,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_DEBUG for DEBUG message */
-  void debug(std::string name,std::string msg){GR_DEBUG(name,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_INFO for INFO message */
-  void info(std::string name,std::string msg){GR_INFO(name,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_WARN for WARN message */
-  void warn(std::string name,std::string msg){GR_WARN(name,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_ERROR for ERROR message */
-  void error(std::string name,std::string msg){GR_ERROR(name,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_FATAL for FATAL message */
-  void fatal(std::string name,std::string msg){GR_FATAL(name,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_ASSERT for conditional ERROR message */
-  void errorIF(std::string name,bool cond,std::string msg){GR_ERRORIF(name,cond,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_ASSERT for conditional ERROR message */
-  void gr_assert(std::string name,bool cond,std::string msg){GR_ASSERT(name,cond,msg);};
-
-  // Wrappers for Logger Pointer referenced functions
-  /*! \brief inline function, wrapper to set the logger level */
-  void set_log_level(log4cxx::LoggerPtr logger,std::string level){GR_LOG_SET_LEVEL(logger,level);}
-
-  /*! \brief inline function, wrapper to get the logger level */
-  void get_log_level(log4cxx::LoggerPtr logger,std::string &level){GR_LOG_GET_LEVEL(logger,level);}
-
-  /*! \brief inline function, wrapper for LOG4CXX_TRACE for TRACE message */
-  void log_trace(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_TRACE(logger,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_DEBUG for DEBUG message */
-  void log_debug(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_DEBUG(logger,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_INFO for INFO message */
-  void log_info(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_INFO(logger,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_WARN for WARN message */
-  void log_warn(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_WARN(logger,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_ERROR for ERROR message */
-  void log_error(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_ERROR(logger,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_FATAL for FATAL message */
-  void log_fatal(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_FATAL(logger,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_ASSERT for conditional ERROR message */
-  void log_errorIF(log4cxx::LoggerPtr logger,bool cond,std::string msg){GR_LOG_ERRORIF(logger,cond,msg);};
-
-  /*! \brief inline function, wrapper for LOG4CXX_ASSERT for conditional ERROR message */
-  void log_assert(log4cxx::LoggerPtr logger,bool cond,std::string msg){GR_LOG_ASSERT(logger,cond,msg);};
-};
-
-
-//If ENABLE_GR_LOG not set then clear all logging macros
-#else
-#define GR_CONFIG_LOGGER(config)
-#define GR_LOG_GETLOGGER(logger, name) 
-#define GR_SET_LEVEL(logger, level)
-#define GR_GET_LEVEL(logger, level)
-#define GR_TRACE(name, msg)
-#define GR_DEBUG(name, msg)
-#define GR_INFO(name, msg)
-#define GR_WARN(name, msg) 
-#define GR_ERROR(name, msg) 
-#define GR_FATAL(name, msg) 
-#define GR_ERRORIF(name, cond, msg)
-#define GR_ASSERT(name, cond, msg)
-#define GR_LOG_SET_LEVEL(logger, level)
-#define GR_LOG_GET_LEVEL(logger, level)
-#define GR_LOG_TRACE(logger, msg)
-#define GR_LOG_DEBUG(logger, msg)
-#define GR_LOG_INFO(logger, msg) 
-#define GR_LOG_WARN(logger, msg) 
-#define GR_LOG_ERROR(logger, msg) 
-#define GR_LOG_FATAL(logger, msg) 
-#define GR_LOG_ERRORIF(logger, cond, msg)
-#define GR_LOG_ASSERT(logger, cond, msg)
-
-#endif /* ENABLE_GR_LOG */
-#endif /* INCLUDED_GR_LOG_H */
diff --git a/gnuradio-core/src/lib/runtime/gr_log.i b/gnuradio-core/src/lib/runtime/gr_log.i
deleted file mode 100644
index 5175ef95f7..0000000000
--- a/gnuradio-core/src/lib/runtime/gr_log.i
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- * 
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/*******************************************************************************
-* Copyright 2011 Johns Hopkins University Applied Physics Lab
-* Author: Mark Plett
-* Description:
-*   SWIG interface generator file for gr_log module.  gr_log wraps log4cxx logging
-*   for gnuradio.
-*******************************************************************************/
-
-%feature("autodoc", "1");		// generate python docstrings
-
-%include "exception.i"
-%import "gnuradio.i"			// the common stuff
-
-%{
-#include "gnuradio_swig_bug_workaround.h"	// mandatory bug fix
-#include <stdexcept>
-%}
-
-//-----------------------------------
-
-#ifdef ENABLE_GR_LOG
-
-%{
-// The .h files
-#include <gr_log.h>
-#include <log4cxx/logger.h>
-#include <log4cxx/logmanager.h>
-%}
-
-namespace log4cxx{
-class LoggerPtr {
-public:
- ~LoggerPtr();
-};
-};
-void logger_load_config(const std::string &config_filename);
-void logger_set_level(log4cxx::LoggerPtr logger, const std::string &level);
-
-%rename(log) gr_log;
-
-class gr_log
-{
-private:
-  
-public:
-  //gr_log(std::string config_filename);
-  gr_log(std::string config_filename,int watchPeriodSec);
-  void set_level(std::string name,std::string level);
-  void get_level(std::string name,std::string &level);
-  void trace(std::string name,std::string msg);
-  void debug(std::string name,std::string msg);
-  void info(std::string name,std::string msg);
-  void warn(std::string name,std::string msg);
-  void error(std::string name,std::string msg);
-  void fatal(std::string name,std::string msg);
-  void errorIF(std::string name,bool cond,std::string msg);
-  void gr_assert(std::string name,bool cond,std::string msg);
-
-  static log4cxx::LoggerPtr getLogger(std::string name);
-
-  void set_log_level(log4cxx::LoggerPtr logger,std::string level);
-  void get_log_level(log4cxx::LoggerPtr logger,std::string &level);
-  void log_trace(log4cxx::LoggerPtr logger,std::string msg);
-  void log_debug(log4cxx::LoggerPtr logger,std::string msg);
-  void log_info(log4cxx::LoggerPtr logger,std::string msg);
-  void log_warn(log4cxx::LoggerPtr logger,std::string msg);
-  void log_error(log4cxx::LoggerPtr logger,std::string msg);
-  void log_fatal(log4cxx::LoggerPtr logger,std::string msg);
-  void log_errorIF(log4cxx::LoggerPtr logger,bool cond,std::string msg);
-  void log_assert(log4cxx::LoggerPtr logger,bool cond,std::string msg);
-};
-
-#endif /* ENABLE_GR_LOG */
diff --git a/gnuradio-core/src/lib/runtime/gr_logger.cc b/gnuradio-core/src/lib/runtime/gr_logger.cc
new file mode 100644
index 0000000000..e337920a33
--- /dev/null
+++ b/gnuradio-core/src/lib/runtime/gr_logger.cc
@@ -0,0 +1,189 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/*******************************************************************************
+* Copyright 2011 Johns Hopkins University Applied Physics Lab
+* Author: Mark Plett 
+* Description:
+*   The gr_log module wraps the log4cxx library for logging in gnuradio.
+*******************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h" 
+#endif
+
+#include <gr_logger.h>
+#include <stdexcept>
+#include <algorithm>
+
+#ifdef ENABLE_GR_LOG
+#ifdef HAVE_LOG4CXX 
+
+bool gr_logger_configured(false);
+
+void
+logger_load_config(const std::string &config_filename)
+{
+  if(!gr_logger_configured) {
+    gr_logger_configured = true;
+    if(config_filename.size() > 0) {
+      if(config_filename.find(".xml") != std::string::npos) {
+        log4cxx::xml::DOMConfigurator::configure(config_filename);
+      }
+      else {
+        log4cxx::PropertyConfigurator::configure(config_filename);
+      }
+    }
+  }
+}
+
+void
+logger_load_config_and_watch(const std::string &config_filename,
+                             unsigned int watch_period)
+{
+  if(!gr_logger_configured) {
+    gr_logger_configured = true;
+    if(config_filename.size() > 0) {
+      if(config_filename.find(".xml") != std::string::npos) {
+        log4cxx::xml::DOMConfigurator::configureAndWatch(config_filename, watch_period);
+      }
+      else {
+        log4cxx::PropertyConfigurator::configureAndWatch(config_filename, watch_period);
+      }
+    }
+  }
+}
+
+void 
+logger_reset_config(void)
+{
+  log4cxx::LogManager::resetConfiguration();
+  gr_logger_configured=false;
+}
+
+void
+logger_set_level(gr_logger_ptr logger, const std::string &level)
+{
+  std::string nocase = level;
+  std::transform(level.begin(), level.end(), nocase.begin(), ::tolower);
+  
+  if(nocase == "off")
+    logger_set_level(logger, log4cxx::Level::getOff());
+  else if(nocase == "all")
+    logger_set_level(logger, log4cxx::Level::getAll());
+  else if(nocase == "trace")
+    logger_set_level(logger, log4cxx::Level::getTrace());
+  else if(nocase == "debug")
+    logger_set_level(logger, log4cxx::Level::getDebug());
+  else if(nocase == "info")
+    logger_set_level(logger, log4cxx::Level::getInfo());
+  else if(nocase == "warn")
+    logger_set_level(logger, log4cxx::Level::getWarn());
+  else if(nocase == "error")
+    logger_set_level(logger, log4cxx::Level::getError());
+  else if(nocase == "fatal")
+    logger_set_level(logger, log4cxx::Level::getFatal());
+  else
+    throw std::runtime_error("logger_set_level: Bad level type.\n");
+}
+
+void
+logger_set_level(gr_logger_ptr logger, log4cxx::LevelPtr level)
+{
+  logger->setLevel(level);
+}
+
+void 
+logger_get_level(gr_logger_ptr logger, std::string &level)
+{
+  log4cxx::LevelPtr levelPtr = logger->getLevel();
+  if(levelPtr == log4cxx::Level::getOff()) level = "off";
+  if(levelPtr == log4cxx::Level::getAll()) level = "all";
+  if(levelPtr == log4cxx::Level::getTrace()) level = "trace";
+  if(levelPtr == log4cxx::Level::getDebug()) level = "debug";
+  if(levelPtr == log4cxx::Level::getInfo()) level = "info";
+  if(levelPtr == log4cxx::Level::getWarn()) level = "warn";
+  if(levelPtr == log4cxx::Level::getError()) level = "error";
+  if(levelPtr == log4cxx::Level::getFatal()) level = "fatal";
+};
+
+void 
+logger_get_level(gr_logger_ptr logger, log4cxx::LevelPtr level)
+{
+  level = logger->getLevel();
+}
+
+void 
+logger_add_console_appender(gr_logger_ptr logger, std::string layout,
+                            std::string target)
+{
+  log4cxx::PatternLayout *playout =
+    new log4cxx::PatternLayout(layout);
+  log4cxx::ConsoleAppender *appender =
+    new log4cxx::ConsoleAppender(log4cxx::LayoutPtr(playout), target);
+  log4cxx::helpers::Pool p;
+  appender->activateOptions(p);
+  logger->addAppender(appender);
+}
+
+void
+logger_add_file_appender(gr_logger_ptr logger, std::string layout,
+                         std::string filename, bool append)
+{
+  log4cxx::PatternLayout *playout =
+    new log4cxx::PatternLayout(layout);
+  log4cxx::FileAppender *appender =
+    new log4cxx::FileAppender(log4cxx::LayoutPtr(playout), filename, append);
+  log4cxx::helpers::Pool p;
+  appender->activateOptions(p);
+  logger->addAppender(appender);
+}
+
+void 
+logger_add_rollingfile_appender(gr_logger_ptr logger, std::string layout,
+                                std::string filename, bool append,
+                                int bkup_index, std::string filesize)
+{
+  log4cxx::PatternLayout *playout =
+    new log4cxx::PatternLayout(layout);
+  log4cxx::RollingFileAppender *appender = 
+    new log4cxx::RollingFileAppender(log4cxx::LayoutPtr(playout), filename, append);
+  appender->setMaxBackupIndex(bkup_index);
+  appender->setMaxFileSize(filesize);
+  log4cxx::helpers::Pool p; 
+  appender->activateOptions(p);
+  logger->addAppender(appender);
+}
+
+void
+logger_get_logger_names(std::vector<std::string>& names)
+{
+  log4cxx::LoggerList list = log4cxx::LogManager::getCurrentLoggers();
+  log4cxx::LoggerList::iterator logger = list.begin();
+  names.clear();
+  for(; logger != list.end(); logger++) {
+    names.push_back((*logger)->getName());
+  }
+}
+
+#endif /* HAVE_LOG4CXX */
+#endif /* ENABLE_GR_LOGGER */
diff --git a/gnuradio-core/src/lib/runtime/gr_logger.h b/gnuradio-core/src/lib/runtime/gr_logger.h
new file mode 100644
index 0000000000..40684ec9d0
--- /dev/null
+++ b/gnuradio-core/src/lib/runtime/gr_logger.h
@@ -0,0 +1,498 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/*******************************************************************************
+* Copyright 2011 Johns Hopkins University Applied Physics Lab
+* Author: Mark Plett
+* Description:
+*   The gr_logger module wraps the log4cxx library for logging in gnuradio
+*******************************************************************************/
+
+#ifndef INCLUDED_GR_LOGGER_H
+#define INCLUDED_GR_LOGGER_H
+
+/*!
+* \file gr_logger.h
+* \ingroup logging
+* \brief GNURADIO logging wrapper for log4cxx library (C++ port of log4j)
+*
+*/
+
+#include <gr_core_api.h>
+#include <assert.h>
+#include <iostream>
+
+#ifdef ENABLE_GR_LOG
+
+// We have three configurations... first logging to stdout/stderr
+#ifndef HAVE_LOG4CXX
+//#warning GR logging Enabled and using std::cout
+
+typedef std::string gr_logger_ptr;
+
+#define GR_LOG_DECLARE_LOGPTR(logger)
+#define GR_LOG_ASSIGN_LOGPTR(logger,name)
+#define GR_CONFIG_LOGGER(config)
+#define GR_CONFIG_AND_WATCH_LOGGER(config)
+#define GR_LOG_GETLOGGER(logger, name) 
+#define GR_SET_LEVEL(name, level)
+#define GR_LOG_SET_LEVEL(logger, level) 
+#define GR_GET_LEVEL(name, level)
+#define GR_LOG_GET_LEVEL(logger, level)
+#define GR_ADD_CONSOLE_APPENDER(logger,layout)
+#define GR_LOG_ADD_CONSOLE_APPENDER(logger,layout)
+#define GR_ADD_FILE_APPENDER(logger,layout,filename,append)
+#define GR_LOG_ADD_FILE_APPENDER(logger,layout,filename,append)
+#define GR_ADD_ROLLINGFILE_APPENDER(logger,layout,filename,append,bkup_index,filesize)
+#define GR_LOG_ADD_ROLLINGFILE_APPENDER(logger,layout,filename,append,bkup_index,filesize)
+#define GR_GET_LOGGER_NAMES(names)
+#define GR_RESET_CONFIGURATION()
+#define GR_TRACE(name, msg) std::cout<<"TRACE:"<<msg<<std::endl
+#define GR_DEBUG(name, msg) std::cout<<"DEBUG:"<<msg<<std::endl
+#define GR_INFO(name, msg) std::cout<<"INFO:"<<msg<<std::endl
+#define GR_WARN(name, msg) std::cerr<<"WARN:"<<msg<<std::endl
+#define GR_ERROR(name, msg) std::cerr<<"ERROR:"<<msg<<std::endl
+#define GR_FATAL(name, msg) std::cerr<<"FATAL:"<<msg<<std::endl
+#define GR_ERRORIF(name, cond, msg) if((cond)) std::cerr<<"ERROR:"<<msg<<std::endl
+#define GR_ASSERT(name, cond, msg) std::cerr<<"ERROR:"<<msg<<std::endl; assert(cond)
+#define GR_LOG_SET_LEVEL(logger, level)
+#define GR_LOG_GET_LEVEL(logger, level)
+#define GR_LOG_TRACE(logger, msg) std::cout<<"TRACE:"<<msg<<std::endl
+#define GR_LOG_DEBUG(logger, msg) std::cout<<"DEBUG:"<<msg<<std::endl
+#define GR_LOG_INFO(logger, msg) std::cout<<"INFO:"<<msg<<std::endl
+#define GR_LOG_WARN(logger, msg) std::cerr<<"WARN:"<<msg<<std::endl
+#define GR_LOG_ERROR(logger, msg) std::cerr<<"ERROR:"<<msg<<std::endl
+#define GR_LOG_FATAL(logger, msg) std::cerr<<"FATAL:"<<msg<<std::endl
+#define GR_LOG_ERRORIF(logger, cond, msg) if((cond)) std::cerr<<"ERROR:"<<msg<<std::endl
+#define GR_LOG_ASSERT(logger, cond, msg) std::cerr<<"ERROR:"<<msg<<std::endl; assert(cond)
+
+#else /* HAVE_LOG4CXX */
+// Second configuration...logging to log4cxx
+//#warning GR logging Enabled and using LOG4CXX
+
+#include <log4cxx/logger.h>
+#include <log4cxx/logmanager.h>
+#include <log4cxx/basicconfigurator.h>
+#include <log4cxx/xml/domconfigurator.h>
+#include <log4cxx/propertyconfigurator.h>
+#include <log4cxx/helpers/pool.h>
+#include <log4cxx/fileappender.h>
+#include <log4cxx/rollingfileappender.h>
+#include <log4cxx/consoleappender.h>
+#include <log4cxx/patternlayout.h>
+
+/*!
+ * \brief GR_LOG macros
+ * \ingroup logging
+ *
+ * These macros wrap the standard LOG4CXX_LEVEL macros.  The availablie macros
+ * are:
+ *  GR_LOG_TRACE
+ *  GR_LOG_DEBUG
+ *  GR_LOG_INFO
+ *  GR_LOG_WARN
+ *  GR_LOG_ERROR
+ *  GR_LOG_FATAL
+ */
+
+typedef log4cxx::LoggerPtr gr_logger_ptr;
+
+/* Macros for Programmatic Configuration */
+#define GR_LOG_DECLARE_LOGPTR(logger) \
+  gr_logger_ptr logger;
+
+#define GR_LOG_ASSIGN_LOGPTR(logger,name) \
+  logger = gr_logger::getLogger(name);
+
+#define GR_CONFIG_LOGGER(config)	\
+  logger_load_config(config)
+
+#define GR_CONFIG_AND_WATCH_LOGGER(config,period)	\
+  logger_load_config_and_watch(config,period)
+
+#define GR_LOG_GETLOGGER(logger, name) \
+  log4cxx::LoggerPtr logger = gr_logger::getLogger(name);
+
+#define GR_SET_LEVEL(name, level){ \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  logger_set_level(logger, level);}
+
+#define GR_LOG_SET_LEVEL(logger, level) \
+  logger_set_level(logger, level);
+
+#define GR_GET_LEVEL(name, level){ \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  logger_get_level(logger,level);}
+
+#define GR_LOG_GET_LEVEL(logger, level) \
+  logger_get_level(logger,level);
+
+#define GR_ADD_CONSOLE_APPENDER(name,layout,terget){d      \
+  gr_logger_ptr logger = log4cxx::Logger::getLogger(name); \
+  logger_add_console_appender(logger,layout, target);}
+
+#define GR_LOG_ADD_CONSOLE_APPENDER(logger,layout,target){      \
+  logger_add_console_appender(logger,layout,target);}
+
+#define GR_ADD_FILE_APPENDER(name,layout,filename,append){\
+  gr_logger_ptr logger = log4cxx::Logger::getLogger(name); \
+  logger_add_file_appender(logger,layout,filename,append);}
+
+#define GR_LOG_ADD_FILE_APPENDER(logger,layout,filename,append){\
+  logger_add_file_appender(logger,layout,filename,append);}
+
+#define GR_ADD_ROLLINGFILE_APPENDER(name,layout,filename,append,bkup_index,filesize){\
+  gr_logger_ptr logger = log4cxx::Logger::getLogger(name); \
+  logger_add_rollingfile_appender(logger,layout,filename,append,bkup_index,filesize);}
+
+#define GR_LOG_ADD_ROLLINGFILE_APPENDER(logger,layout,filename,append,bkup_index,filesize){\
+  logger_add_rollingfile_appender(logger,layout,filename,append,bkup_index,filesize);}
+
+#define GR_GET_LOGGER_NAMES(names){ \
+  logger_get_logger_names(names);}
+
+#define GR_RESET_CONFIGURATION(){ \
+  logger_reset_config();}
+
+/* Logger name referenced macros */
+#define GR_TRACE(name, msg) { \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  LOG4CXX_TRACE(logger, msg);}
+
+#define GR_DEBUG(name, msg) { \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  LOG4CXX_DEBUG(logger, msg);}
+
+#define GR_INFO(name, msg) { \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  LOG4CXX_INFO(logger, msg);}
+
+#define GR_WARN(name, msg) { \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  LOG4CXX_WARN(logger, msg);}
+
+#define GR_ERROR(name, msg) { \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  LOG4CXX_ERROR(logger, msg);}
+
+#define GR_FATAL(name, msg) { \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  LOG4CXX_FATAL(logger, msg);}
+
+#define GR_ERRORIF(name, cond, msg) { \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  LOG4CXX_ASSERT(logger, !(cond), msg);}
+
+#define GR_ASSERT(name, cond, msg) { \
+  log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name); \
+  LOG4CXX_ASSERT(logger, (cond), msg); \
+  assert((cond));}
+
+/* LoggerPtr Referenced Macros */
+#define GR_LOG_TRACE(logger, msg) { \
+  LOG4CXX_TRACE(logger, msg);}
+
+#define GR_LOG_DEBUG(logger, msg) { \
+  LOG4CXX_DEBUG(logger, msg);}
+
+#define GR_LOG_INFO(logger, msg) { \
+  LOG4CXX_INFO(logger, msg);}
+
+#define GR_LOG_WARN(logger, msg) { \
+  LOG4CXX_WARN(logger, msg);}
+
+#define GR_LOG_ERROR(logger, msg) { \
+  LOG4CXX_ERROR(logger, msg);}
+
+#define GR_LOG_FATAL(logger, msg) { \
+  LOG4CXX_FATAL(logger, msg);}
+
+#define GR_LOG_ERRORIF(logger,cond, msg) { \
+  LOG4CXX_ASSERT(logger, !(cond), msg);}
+
+#define GR_LOG_ASSERT(logger, cond, msg) { \
+  LOG4CXX_ASSERT(logger, (cond), msg); \
+  assert((cond));}
+
+/*!
+ * \brief Load logger's configuration file.
+ *
+ * Initialize the GNU Radio logger by loading the configuration file
+ * \p config_filename.
+ *
+ * \param config_filename The configuration file. Set to "" for the
+ *        basic logger that outputs to the console.
+ */
+GR_CORE_API void logger_load_config(const std::string &config_filename="");
+
+
+GR_CORE_API void logger_load_config_and_watch(const std::string &config_filename,
+                                              unsigned int watch_period);
+
+GR_CORE_API void logger_reset_config(void);
+
+/*!
+ * \brief Set the logger's output level.
+ *
+ * Sets the level of the logger. This takes a string that is
+ * translated to the standard levels and can be (case insensitive):
+ *
+ * \li off
+ * \li all
+ * \li trace
+ * \li debug
+ * \li info
+ * \li warn
+ * \li error
+ * \li fatal
+ *
+ * \param logger the logger to set the level of.
+ * \param level  string to set the level to.
+ */
+GR_CORE_API void logger_set_level(gr_logger_ptr logger, const std::string &level);
+
+/*!
+ * \brief Set the logger's output level.
+ *
+ * Sets the level of the logger. This takes the actual Log4cxx::Level
+ * data type, which can be:
+ *
+ * \li log4cxx::Level::getOff()
+ * \li log4cxx::Level::getAll()
+ * \li log4cxx::Level::getTrace()
+ * \li log4cxx::Level::getDebug()
+ * \li log4cxx::Level::getInfo()
+ * \li log4cxx::Level::getWarn()
+ * \li log4cxx::Level::getError()
+ * \li log4cxx::Level::getFatal()
+ *
+ * \param logger the logger to set the level of.
+ * \param level  new logger level of type Log4cxx::Level
+ */
+GR_CORE_API void logger_set_level(gr_logger_ptr logger, log4cxx::LevelPtr level);
+
+
+/*!
+ * \brief Get the logger's output level.
+ *
+ * Gets the level of the logger. This returns a string that
+ * corresponds to the standard levels and can be (case insensitive):
+ *
+ * \li off
+ * \li all
+ * \li trace
+ * \li debug
+ * \li info
+ * \li warn
+ * \li error
+ * \li fatal
+ *
+ * \param logger the logger to get the level of.
+ * \param level  string to get the level into.
+ */
+GR_CORE_API void logger_get_level(gr_logger_ptr logger, std::string &level);
+
+/*!
+ * \brief Get the logger's output level.
+ *
+ * Gets the level of the logger. This returns the actual Log4cxx::Level
+ * data type, which can be:
+ *
+ * \li log4cxx::Level::getOff()
+ * \li log4cxx::Level::getAll()
+ * \li log4cxx::Level::getTrace()
+ * \li log4cxx::Level::getDebug()
+ * \li log4cxx::Level::getInfo()
+ * \li log4cxx::Level::getWarn()
+ * \li log4cxx::Level::getError()
+ * \li log4cxx::Level::getFatal()
+ *
+ * \param logger the logger to get the level of.
+ */
+GR_CORE_API void logger_get_level(gr_logger_ptr logger, log4cxx::LevelPtr level);
+
+
+GR_CORE_API void logger_add_console_appender(gr_logger_ptr logger, std::string layout,
+                                             std::string target);
+
+GR_CORE_API void logger_add_file_appender(gr_logger_ptr logger, std::string layout,
+                                          std::string filename, bool append);
+
+GR_CORE_API void logger_add_rollingfile_appender(gr_logger_ptr logger, std::string layout,
+                                                 std::string filename, bool append,
+                                                 int bkup_index, std::string filesize);
+
+GR_CORE_API void logger_get_logger_names(std::vector<std::string>& names);
+
+/*!
+ * \brief instantiate (configure) logger.
+ * \ingroup logging
+ *
+ */
+class gr_logger
+{
+ public:
+  /*!
+   * \brief contructor take log configuration file and configures loggers.
+   */
+  gr_logger(std::string config_filename)
+  {
+    // Load configuration file
+    logger_load_config(config_filename);
+  };
+
+  /*!
+   * \brief contructor take log configuration file and watchtime and configures
+   */
+  gr_logger(std::string config_filename, int watchPeriodSec)
+  {
+    // Load configuration file
+    if(config_filename.find(".xml")!=std::string::npos) {
+      log4cxx::xml::DOMConfigurator::configureAndWatch(config_filename, watchPeriodSec);
+    }
+    else {
+      log4cxx::PropertyConfigurator::configureAndWatch(config_filename, watchPeriodSec);
+    }
+  };
+
+  static log4cxx::LoggerPtr getLogger(std::string name)
+  {
+    if(log4cxx::LogManager::exists(name)) {
+      log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name);
+      return logger;
+    }
+    else {
+      log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(name);
+      logger->setLevel(log4cxx::Level::getOff());
+      return logger;
+    };
+  };
+
+  // Wrappers for logging macros
+  /*! \brief inline function, wrapper to set the logger level */
+  void set_level(std::string name,std::string level){GR_SET_LEVEL(name,level);}
+  
+  /*! \brief inline function, wrapper to get the logger level */
+  void get_level(std::string name,std::string &level){GR_GET_LEVEL(name,level);}
+
+  /*! \brief inline function, wrapper for LOG4CXX_TRACE for TRACE message */
+  void trace(std::string name,std::string msg){GR_TRACE(name,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_DEBUG for DEBUG message */
+  void debug(std::string name,std::string msg){GR_DEBUG(name,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_INFO for INFO message */
+  void info(std::string name,std::string msg){GR_INFO(name,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_WARN for WARN message */
+  void warn(std::string name,std::string msg){GR_WARN(name,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_ERROR for ERROR message */
+  void error(std::string name,std::string msg){GR_ERROR(name,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_FATAL for FATAL message */
+  void fatal(std::string name,std::string msg){GR_FATAL(name,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_ASSERT for conditional ERROR message */
+  void errorIF(std::string name,bool cond,std::string msg){GR_ERRORIF(name,cond,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_ASSERT for conditional ERROR message */
+  void gr_assert(std::string name,bool cond,std::string msg){GR_ASSERT(name,cond,msg);};
+
+  // Wrappers for Logger Pointer referenced functions
+  /*! \brief inline function, wrapper to set the logger level */
+  void set_log_level(log4cxx::LoggerPtr logger,std::string level){GR_LOG_SET_LEVEL(logger,level);}
+
+  /*! \brief inline function, wrapper to get the logger level */
+  void get_log_level(log4cxx::LoggerPtr logger,std::string &level){GR_LOG_GET_LEVEL(logger,level);}
+
+  /*! \brief inline function, wrapper for LOG4CXX_TRACE for TRACE message */
+  void log_trace(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_TRACE(logger,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_DEBUG for DEBUG message */
+  void log_debug(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_DEBUG(logger,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_INFO for INFO message */
+  void log_info(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_INFO(logger,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_WARN for WARN message */
+  void log_warn(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_WARN(logger,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_ERROR for ERROR message */
+  void log_error(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_ERROR(logger,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_FATAL for FATAL message */
+  void log_fatal(log4cxx::LoggerPtr logger,std::string msg){GR_LOG_FATAL(logger,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_ASSERT for conditional ERROR message */
+  void log_errorIF(log4cxx::LoggerPtr logger,bool cond,std::string msg){GR_LOG_ERRORIF(logger,cond,msg);};
+
+  /*! \brief inline function, wrapper for LOG4CXX_ASSERT for conditional ERROR message */
+  void log_assert(log4cxx::LoggerPtr logger,bool cond,std::string msg){GR_LOG_ASSERT(logger,cond,msg);};
+};
+
+
+#endif /* HAVE_LOG4CXX */
+
+// If Logger disable do nothing
+#else /* ENABLE_GR_LOG */
+
+typedef void* gr_logger_ptr;
+
+#define GR_LOG_DECLARE_LOGPTR(logger)
+#define GR_LOG_ASSIGN_LOGPTR(logger,name)
+#define GR_CONFIG_LOGGER(config)
+#define GR_CONFIG_AND_WATCH_LOGGER(config)
+#define GR_LOG_GETLOGGER(logger, name) 
+#define GR_SET_LEVEL(name, level)
+#define GR_LOG_SET_LEVEL(logger, level) 
+#define GR_GET_LEVEL(name, level)
+#define GR_LOG_GET_LEVEL(logger, level)
+#define GR_ADD_CONSOLE_APPENDER(logger,layout)
+#define GR_LOG_ADD_CONSOLE_APPENDER(logger,layout)
+#define GR_ADD_FILE_APPENDER(logger,layout,filename,append)
+#define GR_LOG_ADD_FILE_APPENDER(logger,layout)
+#define GR_ADD_ROLLINGFILE_APPENDER(logger,layout,filename,append,bkup_index,filesize)
+#define GR_LOG_ADD_ROLLINGFILE_APPENDER(logger,layout)
+#define GR_GET_LOGGER_NAMES(names)
+#define GR_RESET_CONFIGURATION()
+#define GR_TRACE(name, msg)
+#define GR_DEBUG(name, msg)
+#define GR_INFO(name, msg)
+#define GR_WARN(name, msg) 
+#define GR_ERROR(name, msg) 
+#define GR_FATAL(name, msg) 
+#define GR_ERRORIF(name, cond, msg)
+#define GR_ASSERT(name, cond, msg)
+#define GR_LOG_SET_LEVEL(logger, level)
+#define GR_LOG_GET_LEVEL(logger, level)
+#define GR_LOG_TRACE(logger, msg)
+#define GR_LOG_DEBUG(logger, msg)
+#define GR_LOG_INFO(logger, msg) 
+#define GR_LOG_WARN(logger, msg) 
+#define GR_LOG_ERROR(logger, msg) 
+#define GR_LOG_FATAL(logger, msg) 
+#define GR_LOG_ERRORIF(logger, cond, msg)
+#define GR_LOG_ASSERT(logger, cond, msg)
+
+#endif /* ENABLE_GR_LOG */
+#endif /* INCLUDED_GR_LOGGER_H */
diff --git a/gnuradio-core/src/lib/runtime/gr_logger.i b/gnuradio-core/src/lib/runtime/gr_logger.i
new file mode 100644
index 0000000000..1eedf3d60d
--- /dev/null
+++ b/gnuradio-core/src/lib/runtime/gr_logger.i
@@ -0,0 +1,96 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/*******************************************************************************
+* Copyright 2011 Johns Hopkins University Applied Physics Lab
+* Author: Mark Plett
+* Description:
+*   SWIG interface generator file for gr_logger module.  gr_logger wraps log4cxx logging
+*   for gnuradio.
+*******************************************************************************/
+
+%feature("autodoc", "1");		// generate python docstrings
+
+%include "exception.i"
+%import "gnuradio.i"			// the common stuff
+
+%{
+#include "gnuradio_swig_bug_workaround.h"	// mandatory bug fix
+#include <stdexcept>
+%}
+
+//-----------------------------------
+
+#ifdef ENABLE_GR_LOG
+#ifdef HAVE_LOG4CXX
+
+%{
+// The .h files
+#include <gr_logger.h>
+#include <log4cxx/logger.h>
+#include <log4cxx/logmanager.h>
+%}
+
+namespace log4cxx{
+class LoggerPtr {
+public:
+ ~LoggerPtr();
+};
+};
+void logger_load_config(const std::string &config_filename);
+void logger_set_level(log4cxx::LoggerPtr logger, const std::string &level);
+
+%rename(log) gr_logger;
+
+class gr_logger
+{
+private:
+  
+public:
+  //gr_logger(std::string config_filename);
+  gr_logger(std::string config_filename,int watchPeriodSec);
+  void set_level(std::string name,std::string level);
+  void get_level(std::string name,std::string &level);
+  void trace(std::string name,std::string msg);
+  void debug(std::string name,std::string msg);
+  void info(std::string name,std::string msg);
+  void warn(std::string name,std::string msg);
+  void error(std::string name,std::string msg);
+  void fatal(std::string name,std::string msg);
+  void errorIF(std::string name,bool cond,std::string msg);
+  void gr_assert(std::string name,bool cond,std::string msg);
+
+  static log4cxx::LoggerPtr getLogger(std::string name);
+
+  void set_log_level(log4cxx::LoggerPtr logger,std::string level);
+  void get_log_level(log4cxx::LoggerPtr logger,std::string &level);
+  void log_trace(log4cxx::LoggerPtr logger,std::string msg);
+  void log_debug(log4cxx::LoggerPtr logger,std::string msg);
+  void log_info(log4cxx::LoggerPtr logger,std::string msg);
+  void log_warn(log4cxx::LoggerPtr logger,std::string msg);
+  void log_error(log4cxx::LoggerPtr logger,std::string msg);
+  void log_fatal(log4cxx::LoggerPtr logger,std::string msg);
+  void log_errorIF(log4cxx::LoggerPtr logger,bool cond,std::string msg);
+  void log_assert(log4cxx::LoggerPtr logger,bool cond,std::string msg);
+};
+
+#endif /* HAVE_LOG4CXX */
+#endif /* ENABLE_GR_LOG */
diff --git a/gnuradio-core/src/lib/runtime/qa_gr_log.cc b/gnuradio-core/src/lib/runtime/qa_gr_log.cc
deleted file mode 100644
index a973408028..0000000000
--- a/gnuradio-core/src/lib/runtime/qa_gr_log.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- * 
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-/*
- * This class gathers together all the test cases for the example
- * directory into a single test suite.  As you create new test cases,
- * add them here.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <qa_gr_log.h>
-#include <gr_log.h>
-
-void
-qa_gr_log::t1()
-{
-#ifdef ENABLE_GR_LOG
-  // This doesn't really test anything, more just
-  // making sure nothing's gone horribly wrong.
-  GR_LOG_GETLOGGER(LOG,"errLoggerRoot");
-  GR_LOG_TRACE(LOG,"test from c++ 1");
-  GR_LOG_DEBUG(LOG,"test from c++ 1");
-  GR_LOG_INFO(LOG,"test from c++ 1");
-  GR_LOG_WARN(LOG,"test from c++ 1");
-  GR_LOG_ERROR(LOG,"test from c++ 1");
-  GR_LOG_FATAL(LOG,"test from c++ 1");
-  GR_LOG_ERRORIF(LOG,2>1,"test from c++ 1");
-  CPPUNIT_ASSERT(true);
-#endif
-}
diff --git a/gnuradio-core/src/lib/runtime/qa_gr_log.h b/gnuradio-core/src/lib/runtime/qa_gr_log.h
deleted file mode 100644
index 75e96d2e7a..0000000000
--- a/gnuradio-core/src/lib/runtime/qa_gr_log.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2012 Free Software Foundation, Inc.
- * 
- * This file is part of GNU Radio
- * 
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Example Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- * 
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Example Public License for more details.
- * 
- * You should have received a copy of the GNU Example Public License
- * along with GNU Radio; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifndef INCLUDED_QA_GR_LOG_H
-#define INCLUDED_QA_GR_LOG_H
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/TestSuite.h>
-
-//! collect all the tests for the example directory
-
-class qa_gr_log : public CppUnit::TestCase {
- public:
-  CPPUNIT_TEST_SUITE(qa_gr_log); 
-  CPPUNIT_TEST(t1);
-  CPPUNIT_TEST_SUITE_END();
-
- private:
-  void t1();
- 
-};
-
-#endif /* INCLUDED_QA_GR_LOG_H */
diff --git a/gnuradio-core/src/lib/runtime/qa_gr_logger.cc b/gnuradio-core/src/lib/runtime/qa_gr_logger.cc
new file mode 100644
index 0000000000..3d21c1f305
--- /dev/null
+++ b/gnuradio-core/src/lib/runtime/qa_gr_logger.cc
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This class gathers together all the test cases for the example
+ * directory into a single test suite.  As you create new test cases,
+ * add them here.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qa_gr_logger.h>
+#include <gr_logger.h>
+
+void
+qa_gr_logger::t1()
+{
+#ifdef ENABLE_GR_LOG
+  // This doesn't really test anything, more just
+  // making sure nothing's gone horribly wrong.
+  GR_LOG_GETLOGGER(LOG,"errLoggerRoot");
+  GR_LOG_TRACE(LOG,"test from c++ 1");
+  GR_LOG_DEBUG(LOG,"test from c++ 1");
+  GR_LOG_INFO(LOG,"test from c++ 1");
+  GR_LOG_WARN(LOG,"test from c++ 1");
+  GR_LOG_ERROR(LOG,"test from c++ 1");
+  GR_LOG_FATAL(LOG,"test from c++ 1");
+  GR_LOG_ERRORIF(LOG,2>1,"test from c++ 1");
+  CPPUNIT_ASSERT(true);
+#endif
+}
diff --git a/gnuradio-core/src/lib/runtime/qa_gr_logger.h b/gnuradio-core/src/lib/runtime/qa_gr_logger.h
new file mode 100644
index 0000000000..b0d3711523
--- /dev/null
+++ b/gnuradio-core/src/lib/runtime/qa_gr_logger.h
@@ -0,0 +1,42 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ * 
+ * This file is part of GNU Radio
+ * 
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Example Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ * 
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Example Public License for more details.
+ * 
+ * You should have received a copy of the GNU Example Public License
+ * along with GNU Radio; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_QA_GR_LOG_H
+#define INCLUDED_QA_GR_LOG_H
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestSuite.h>
+
+//! collect all the tests for the example directory
+
+class qa_gr_logger : public CppUnit::TestCase {
+ public:
+  CPPUNIT_TEST_SUITE(qa_gr_logger); 
+  CPPUNIT_TEST(t1);
+  CPPUNIT_TEST_SUITE_END();
+
+ private:
+  void t1();
+ 
+};
+
+#endif /* INCLUDED_QA_GR_LOG_H */
diff --git a/gnuradio-core/src/lib/runtime/qa_runtime.cc b/gnuradio-core/src/lib/runtime/qa_runtime.cc
index 90b345c04f..62c95ef5c4 100644
--- a/gnuradio-core/src/lib/runtime/qa_runtime.cc
+++ b/gnuradio-core/src/lib/runtime/qa_runtime.cc
@@ -34,7 +34,7 @@
 #include <qa_gr_io_signature.h>
 #include <qa_gr_block.h>
 #include <qa_gr_flowgraph.h>
-#include <qa_gr_log.h>
+#include <qa_gr_logger.h>
 #include <qa_gr_top_block.h>
 #include <qa_gr_hier_block2.h>
 #include <qa_gr_hier_block2_derived.h>
@@ -51,7 +51,7 @@ qa_runtime::suite ()
   s->addTest (qa_gr_io_signature::suite ());
   s->addTest (qa_gr_block::suite ());
   s->addTest (qa_gr_flowgraph::suite ());
-  s->addTest (qa_gr_log::suite ());
+  s->addTest (qa_gr_logger::suite ());
   s->addTest (qa_gr_top_block::suite ());
   s->addTest (qa_gr_hier_block2::suite ());
   s->addTest (qa_gr_hier_block2_derived::suite ());
diff --git a/gnuradio-core/src/lib/runtime/runtime.i b/gnuradio-core/src/lib/runtime/runtime.i
index 9e0e378290..8902c6103f 100644
--- a/gnuradio-core/src/lib/runtime/runtime.i
+++ b/gnuradio-core/src/lib/runtime/runtime.i
@@ -40,7 +40,7 @@
 #include <gr_sync_decimator.h>
 #include <gr_sync_interpolator.h>
 #include <gr_top_block.h>
-#include <gr_log.h>
+#include <gr_logger.h>
 %}
 
 %constant int sizeof_char 	= sizeof(char);
@@ -68,4 +68,4 @@
 %include <gr_sync_decimator.i>
 %include <gr_sync_interpolator.i>
 %include <gr_top_block.i>
-%include <gr_log.i>
+%include <gr_logger.i>
-- 
cgit v1.2.3