diff --git a/ext/syslog/lib/syslog/logger.rb b/ext/syslog/lib/syslog/logger.rb
index 6b0336b..10c6b59 100644
--- a/ext/syslog/lib/syslog/logger.rb
+++ b/ext/syslog/lib/syslog/logger.rb
@@ -51,46 +51,42 @@ class Syslog::Logger
   # one level.  For example, a fatal message for ruby's Logger is considered
   # an error for syslog(3).
 
-  LOGGER_MAP = {
-    :unknown => :alert,
-    :fatal   => :err,
-    :error   => :warning,
-    :warn    => :notice,
-    :info    => :info,
-    :debug   => :debug,
+  LEVEL_MAP = {
+    ::Logger::UNKNOWN => Syslog::LOG_ALERT,
+    ::Logger::FATAL   => Syslog::LOG_ERR,
+    ::Logger::ERROR   => Syslog::LOG_WARNING,
+    ::Logger::WARN    => Syslog::LOG_NOTICE,
+    ::Logger::INFO    => Syslog::LOG_INFO,
+    ::Logger::DEBUG   => Syslog::LOG_DEBUG,
   }
 
   ##
-  # Maps Logger log levels to their values so we can silence.
+  # Returns the internal Syslog object that is initialized when the
+  # first instance is created.
 
-  LOGGER_LEVEL_MAP = {}
-
-  LOGGER_MAP.each_key do |key|
-    LOGGER_LEVEL_MAP[key] = ::Logger.const_get key.to_s.upcase
+  def self.syslog
+    @@syslog
   end
 
   ##
-  # Maps Logger log level values to syslog log levels.
-
-  LEVEL_LOGGER_MAP = {}
+  # Specifies the internal Syslog object to be used.
 
-  LOGGER_LEVEL_MAP.invert.each do |level, severity|
-    LEVEL_LOGGER_MAP[level] = LOGGER_MAP[severity]
+  def self.syslog= syslog
+    @@syslog = syslog
   end
 
   ##
   # Builds a methods for level +meth+.
 
   def self.make_methods meth
+    level = ::Logger.const_get(meth.upcase)
     eval <<-EOM, nil, __FILE__, __LINE__ + 1
-      def #{meth}(message = nil)
-        return true if #{LOGGER_LEVEL_MAP[meth]} < @level
-        SYSLOG.#{LOGGER_MAP[meth]} clean(message || yield)
-        return true
+      def #{meth}(message = nil, &block)
+        add(#{level}, message, &block)
       end
 
       def #{meth}?
-        @level <= ::Logger::#{meth.to_s.upcase}
+        @level <= #{level}
       end
     EOM
   end
@@ -131,8 +127,8 @@ class Syslog::Logger
   # Logs a +message+ at the debug (syslog debug) log level, or logs the
   # message returned from the block.
 
-  LOGGER_MAP.each_key do |level|
-    make_methods level
+  Logger::Severity::constants.each do |severity|
+    make_methods severity.downcase
   end
 
   ##
@@ -150,8 +146,7 @@ class Syslog::Logger
   def initialize program_name = 'ruby'
     @level = ::Logger::DEBUG
 
-    return if defined? SYSLOG
-    self.class.const_set :SYSLOG, Syslog.open(program_name)
+    @@syslog ||= Syslog.open(program_name)
   end
 
   ##
@@ -159,9 +154,9 @@ class Syslog::Logger
 
   def add severity, message = nil, progname = nil, &block
     severity ||= ::Logger::UNKNOWN
-    return true if severity < @level
-    SYSLOG.send LEVEL_LOGGER_MAP[severity], clean(message || block.call)
-    return true
+    @level <= severity and
+      @@syslog.log LEVEL_MAP[severity], '%s', clean(message || block.call)
+    true
   end
 
   private
@@ -170,10 +165,8 @@ class Syslog::Logger
   # Clean up messages so they're nice and pretty.
 
   def clean message
-    message = message.to_s.dup
-    message.strip!
-    message.gsub!(/%/, '%%')        # syslog(3) fails on % (printf)
-    message.gsub!(/\e\[[^m]*m/, '') # remove useless ansi color codes
+    message = message.to_s.strip
+    message.gsub!(/\e\[[0-9;]*m/, '') # remove useless ansi color codes
     return message
   end
 
diff --git a/test/syslog/test_syslog_logger.rb b/test/syslog/test_syslog_logger.rb
index d57e064..5763926 100644
--- a/test/syslog/test_syslog_logger.rb
+++ b/test/syslog/test_syslog_logger.rb
@@ -4,34 +4,43 @@ require 'syslog/logger'
 
 class TestSyslogRootLogger < Test::Unit::TestCase
 
-  module MockSyslog; end
+  module MockSyslog
+    LEVEL_LABEL_MAP = {}
 
-  class << MockSyslog
+    class << self
 
-    @line = nil
+      @line = nil
 
-    Syslog::Logger::LOGGER_MAP.values.uniq.each do |level|
-      eval <<-EOM
-        def #{level}(message)
-          @line = "#{level.to_s.upcase} - \#{message}"
-        end
-      EOM
-    end
+      %w[ALERT ERR WARNING NOTICE INFO DEBUG].each do |name|
+        level = Syslog.const_get("LOG_#{name}")
+        LEVEL_LABEL_MAP[level] = name
 
-    attr_reader :line
-    attr_reader :program_name
+        eval <<-EOM
+          def #{name.downcase}(format, *args)
+            log(#{level}, format, *args)
+          end
+        EOM
+      end
 
-    def open(program_name)
-      @program_name = program_name
-    end
+      def log(level, format, *args)
+        @line = "#{LEVEL_LABEL_MAP[level]} - \#{format % args}"
+      end
 
-    def reset
-      @line = ''
-    end
+      attr_reader :line
+      attr_reader :program_name
+
+      def open(program_name)
+        @program_name = program_name
+      end
+
+      def reset
+        @line = ''
+      end
 
+    end
   end
 
-  Syslog::Logger.const_set :SYSLOG, MockSyslog
+  Syslog::Logger.syslog = MockSyslog
 
   LEVEL_LABEL_MAP = {
     Logger::DEBUG => 'DEBUG',
@@ -452,15 +461,21 @@ class TestSyslogLogger < TestSyslogRootLogger
     @logger = Syslog::Logger.new
   end
 
+  SEVERITY_MAP = {}.tap { |map|
+    level2severity = Syslog::Logger::LEVEL_MAP.invert
+
+    MockSyslog::LEVEL_LABEL_MAP.each { |level, name|
+      map[name] = TestSyslogRootLogger::LEVEL_LABEL_MAP[level2severity[level]]
+    }
+  }
+
   class Log
     attr_reader :line, :label, :datetime, :pid, :severity, :progname, :msg
     def initialize(line)
       @line = line
       return unless /\A(\w+) - (.*)\Z/ =~ @line
       severity, @msg = $1, $2
-      severity = Syslog::Logger::LOGGER_MAP.invert[severity.downcase.intern]
-      @severity = severity.to_s.upcase
-      @severity = 'ANY' if @severity == 'UNKNOWN'
+      @severity = SEVERITY_MAP[severity]
     end
   end
 
