diff --git a/reclass/cli.py b/reclass/cli.py
index f09067d..c3a11a0 100644
--- a/reclass/cli.py
+++ b/reclass/cli.py
@@ -8,6 +8,7 @@
 #
 
 import sys, os, posix
+import logging
 
 from reclass import get_storage, output
 from reclass.core import Core
@@ -15,9 +16,11 @@
 from reclass.errors import ReclassException
 from reclass.defaults import *
 from reclass.constants import MODE_NODEINFO
-from reclass.logs import logger
 from reclass.version import *
 
+logger = logging.getLogger(RECLASS_NAME)
+
+
 def main():
     try:
         defaults = {'pretty_print' : OPT_PRETTY_PRINT,
diff --git a/reclass/config.py b/reclass/config.py
index 572cfed..9aa84cf 100644
--- a/reclass/config.py
+++ b/reclass/config.py
@@ -8,11 +8,14 @@
 #
 
 import yaml, os, optparse, posix, sys
+import logging
 
 import errors
 from defaults import *
 from constants import MODE_NODEINFO, MODE_INVENTORY
 
+logger = logging.getLogger(RECLASS_NAME)
+
 def make_db_options_group(parser, defaults={}):
     ret = optparse.OptionGroup(parser, 'Database options',
                                'Configure from where {0} collects data'.format(parser.prog))
@@ -186,17 +189,12 @@
     return options
 
 
-def vvv(msg):
-    #print >>sys.stderr, msg
-    pass
-
-
 def find_and_read_configfile(filename=CONFIG_FILE_NAME,
                              dirs=CONFIG_FILE_SEARCH_PATH):
     for d in dirs:
         f = os.path.join(d, filename)
         if os.access(f, os.R_OK):
-            vvv('Using config file: {0}'.format(f))
+            logger.debug('Using config file: {0}'.format(f))
             return yaml.safe_load(file(f))
         elif os.path.isfile(f):
             raise PermissionsError('cannot read %s' % f)
diff --git a/reclass/logs.py b/reclass/logs.py
index 41da08e..d01c320 100644
--- a/reclass/logs.py
+++ b/reclass/logs.py
@@ -14,7 +14,7 @@
 from reclass.version import VERSION, DESCRIPTION
 
 
-RECLASS_LOGGER = 'reclass'
+RECLASS_LOGGER = RECLASS_NAME
 
 options = get_options(RECLASS_NAME, VERSION, DESCRIPTION)
 LOG_LEVEL = 'ERROR'
diff --git a/reclass/storage/yaml_fs/__init__.py b/reclass/storage/yaml_fs/__init__.py
index 5a13050..01301d9 100644
--- a/reclass/storage/yaml_fs/__init__.py
+++ b/reclass/storage/yaml_fs/__init__.py
@@ -8,18 +8,20 @@
 #
 import os, sys
 import fnmatch
+import logging
+
+from reclass.defaults import RECLASS_NAME
 from reclass.storage import NodeStorageBase
 from yamlfile import YamlFile
 from directory import Directory
 from reclass.datatypes import Entity
 import reclass.errors
 
+logger = logging.getLogger(RECLASS_NAME)
+
 FILE_EXTENSION = '.yml'
 STORAGE_NAME = 'yaml_fs'
 
-def vvv(msg):
-    #print >>sys.stderr, msg
-    pass
 
 class ExternalNodeStorage(NodeStorageBase):
 
@@ -57,7 +59,7 @@
         ret = {}
         def register_fn(dirpath, filenames):
             filenames = fnmatch.filter(filenames, '*{0}'.format(FILE_EXTENSION))
-            vvv('REGISTER {0} in path {1}'.format(filenames, dirpath))
+            logger.debug('REGISTER {0} in path {1}'.format(filenames, dirpath))
             for f in filenames:
                 name = os.path.splitext(f)[0]
                 relpath = os.path.relpath(dirpath, basedir)
@@ -77,7 +79,7 @@
         return ret
 
     def get_node(self, name):
-        vvv('GET NODE {0}'.format(name))
+        logger.debug('GET NODE {0}'.format(name))
         try:
             relpath = self._nodes[name]
             path = os.path.join(self.nodes_uri, relpath)
@@ -88,7 +90,7 @@
         return entity
 
     def get_class(self, name, nodename=None):
-        vvv('GET CLASS {0}'.format(name))
+        logger.debug('GET CLASS {0}'.format(name))
         try:
             path = os.path.join(self.classes_uri, self._classes[name])
         except KeyError, e:
diff --git a/reclass/storage/yaml_fs/directory.py b/reclass/storage/yaml_fs/directory.py
index 03302b7..ac8395a 100644
--- a/reclass/storage/yaml_fs/directory.py
+++ b/reclass/storage/yaml_fs/directory.py
@@ -8,14 +8,16 @@
 #
 import os
 import sys
+import logging
+
+from reclass.defaults import RECLASS_NAME
 from reclass.errors import NotFoundError
 
+logger = logging.getLogger(RECLASS_NAME)
+
 SKIPDIRS = ( 'CVS', 'SCCS' )
 FILE_EXTENSION = '.yml'
 
-def vvv(msg):
-    #print >>sys.stderr, msg
-    pass
 
 class Directory(object):
 
@@ -31,7 +33,7 @@
 
     def _register_files(self, dirpath, filenames):
         for f in filter(lambda f: f.endswith(FILE_EXTENSION), filenames):
-            vvv('REGISTER {0}'.format(f))
+            logger.debug('REGISTER {0}'.format(f))
             f = os.path.join(dirpath, f)
             ptr = None if not self._fileclass else self._fileclass(f)
             self._files[f] = ptr
@@ -48,11 +50,11 @@
                                                     topdown=True,
                                                     onerror=_error,
                                                     followlinks=True):
-            vvv('RECURSE {0}, {1} files, {2} subdirectories'.format(
+            logger.debug('RECURSE {0}, {1} files, {2} subdirectories'.format(
                 dirpath.replace(os.getcwd(), '.'), len(filenames), len(dirnames)))
             for d in dirnames:
                 if d.startswith('.') or d in SKIPDIRS:
-                    vvv('   SKIP subdirectory {0}'.format(d))
+                    logger.debug('   SKIP subdirectory {0}'.format(d))
                     dirnames.remove(d)
             register_fn(dirpath, filenames)
 
