diff --git a/System/Log/FastLogger.hs b/System/Log/FastLogger.hs
--- a/System/Log/FastLogger.hs
+++ b/System/Log/FastLogger.hs
@@ -4,7 +4,6 @@
   -- * Creating a logger set
     BufSize
   , defaultBufSize
-  , logOpen
   , LoggerSet
   , newLoggerSet
   , renewLoggerSet
@@ -13,8 +12,8 @@
   -- * Log messages
   , LogStr
   , ToLogStr(..)
+  , fromLogStr
   , logStrLength
-  , logStrBuilder
   -- * Writing a log message
   , pushLogStr
   -- * Flushing buffered log messages
@@ -27,8 +26,9 @@
 import Control.Concurrent (getNumCapabilities, myThreadId, threadCapability, takeMVar)
 import Control.Monad (when, replicateM)
 import Data.Array (Array, listArray, (!))
+import Data.Maybe (isJust)
 import GHC.IO.Device (close)
-import GHC.IO.FD (FD(..), openFile)
+import GHC.IO.FD (FD(..), openFile, stdout)
 import GHC.IO.IOMode (IOMode(..))
 import System.Log.FastLogger.File
 import System.Log.FastLogger.IO
@@ -48,20 +48,25 @@
 --   The number of loggers is the capabilities of GHC RTS.
 --   You can specify it with \"+RTS -N\<x\>\".
 --   A buffer is prepared for each capability.
-data LoggerSet = LoggerSet (IORef FD) (Array Int Logger)
+data LoggerSet = LoggerSet (Maybe FilePath) (IORef FD) (Array Int Logger)
 
 -- | Creating a new 'LoggerSet'.
-newLoggerSet :: BufSize -> FD -> IO LoggerSet
-newLoggerSet size fd = do
+--   If 'Nothing' is specified to the second argument,
+--   stdout is used.
+newLoggerSet :: BufSize -> Maybe FilePath -> IO LoggerSet
+newLoggerSet size mfile = do
+    fd <- case mfile of
+        Nothing   -> return stdout
+        Just file -> logOpen file
     n <- getNumCapabilities
     loggers <- replicateM n $ newLogger size
     let arr = listArray (0,n-1) loggers
     fref <- newIORef fd
-    return $ LoggerSet fref arr
+    return $ LoggerSet mfile fref arr
 
 -- | Writing a log message to the corresponding buffer.
 pushLogStr :: LoggerSet -> LogStr -> IO ()
-pushLogStr (LoggerSet fref arr) logmsg = do
+pushLogStr (LoggerSet _ fref arr) logmsg = do
     (i, _) <- myThreadId >>= threadCapability
     let logger = arr ! i
     fd <- readIORef fref
@@ -69,28 +74,31 @@
 
 -- | Flushing log messages in buffers.
 flushLogStr :: LoggerSet -> IO ()
-flushLogStr (LoggerSet fref arr) = do
+flushLogStr (LoggerSet _ fref arr) = do
     n <- getNumCapabilities
     fd <- readIORef fref
     mapM_ (flushIt fd) [0..n-1]
   where
     flushIt fd i = flushLog fd (arr ! i)
 
--- | Renewing 'FD' in 'LoggerSet'. Old 'FD' is closed.
-renewLoggerSet :: LoggerSet -> FD -> IO ()
-renewLoggerSet (LoggerSet fref _) newfd = do
+-- | Renewing the internal file information in 'LoggerSet'.
+renewLoggerSet :: LoggerSet -> IO ()
+renewLoggerSet (LoggerSet Nothing     _    _) = return ()
+renewLoggerSet (LoggerSet (Just file) fref _) = do
+    newfd <- logOpen file
     oldfd <- atomicModifyIORef' fref (\fd -> (newfd, fd))
     close oldfd
 
--- | Flushing the buffers, closing 'FD' and freeing the buffers.
+-- | Flushing the buffers, closing the internal file information
+--   and freeing the buffers.
 rmLoggerSet :: LoggerSet -> IO ()
-rmLoggerSet (LoggerSet fref arr) = do
+rmLoggerSet (LoggerSet mfile fref arr) = do
     n <- getNumCapabilities
     fd <- readIORef fref
     let nums = [0..n-1]
     mapM_ (flushIt fd) nums
     mapM_ freeIt nums
-    when (fdFD fd /= 1) $ close fd
+    when (isJust mfile) $ close fd
   where
     flushIt fd i = flushLog fd (arr ! i)
     freeIt i = do
diff --git a/System/Log/FastLogger/LogStr.hs b/System/Log/FastLogger/LogStr.hs
--- a/System/Log/FastLogger/LogStr.hs
+++ b/System/Log/FastLogger/LogStr.hs
@@ -4,22 +4,25 @@
 module System.Log.FastLogger.LogStr (
     Builder
   , LogStr(..)
+  , logStrLength
+  , fromLogStr
   , ToLogStr(..)
   , mempty
   , (<>)
   ) where
 
 #if MIN_VERSION_bytestring(0,10,2)
-import Data.ByteString.Builder (Builder, byteString)
+import Data.ByteString.Builder (Builder)
+import qualified Data.ByteString.Builder as B
 #else
-import qualified Blaze.ByteString.Builder as BB (fromByteString)
+import qualified Blaze.ByteString.Builder as BB
 import Blaze.ByteString.Builder.Internal.Types as BB (Builder(..))
 #endif
-import Data.ByteString.Internal (ByteString(..))
-import Data.Monoid (Monoid, mempty, mappend)
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Char8 as S8
-import qualified Data.ByteString.Lazy as L
+import Data.ByteString.Internal (ByteString(..))
+import qualified Data.ByteString.Lazy as BL
+import Data.Monoid (Monoid, mempty, mappend)
 #if MIN_VERSION_base(4,5,0)
 import Data.Monoid ((<>))
 #endif
@@ -36,23 +39,27 @@
 (<>) = mappend
 #endif
 
-#if !MIN_VERSION_bytestring(0,10,2)
-byteString :: ByteString -> Builder
-byteString = BB.fromByteString
+toBuilder :: ByteString -> Builder
+#if MIN_VERSION_bytestring(0,10,2)
+toBuilder = B.byteString
+#else
+toBuilder = BB.fromByteString
 #endif
 
+fromBuilder :: Builder -> ByteString
+#if MIN_VERSION_bytestring(0,10,2)
+fromBuilder = BL.toStrict . B.toLazyByteString
+#else
+fromBuilder = BB.toByteString
+#endif
+
 ----------------------------------------------------------------
 
 -- | Log message builder. Use ('<>') to append two LogStr in O(1).
-data LogStr = LogStr {
-  -- | Obtaining the length of 'LogStr'.
-    logStrLength :: !Int
-  -- | Obtaining the 'Builder' of 'LogStr'.
-  , logStrBuilder :: Builder
-  }
+data LogStr = LogStr !Int Builder
 
 instance Monoid LogStr where
-    mempty = LogStr 0 (byteString BS.empty)
+    mempty = LogStr 0 (toBuilder BS.empty)
     LogStr s1 b1 `mappend` LogStr s2 b2 = LogStr (s1 + s2) (b1 <> b2)
 
 instance IsString LogStr where
@@ -64,9 +71,9 @@
 instance ToLogStr LogStr where
     toLogStr = id
 instance ToLogStr S8.ByteString where
-    toLogStr = fromByteString
-instance ToLogStr L.ByteString where
-    toLogStr = fromByteString . S8.concat . L.toChunks
+    toLogStr bs = LogStr (BS.length bs) (toBuilder bs)
+instance ToLogStr BL.ByteString where
+    toLogStr = toLogStr . S8.concat . BL.toChunks
 instance ToLogStr String where
     toLogStr = toLogStr . TL.pack
 instance ToLogStr T.Text where
@@ -74,6 +81,10 @@
 instance ToLogStr TL.Text where
     toLogStr = toLogStr . TL.encodeUtf8
 
--- | Creating 'LogStr'
-fromByteString :: ByteString -> LogStr
-fromByteString bs = LogStr (BS.length bs) (byteString bs)
+-- | Obtaining the length of 'LogStr'.
+logStrLength :: LogStr -> Int
+logStrLength (LogStr n _) = n
+
+-- | Converting 'LogStr' to 'ByteString'.
+fromLogStr :: LogStr -> ByteString
+fromLogStr (LogStr _ builder) = fromBuilder builder
diff --git a/fast-logger.cabal b/fast-logger.cabal
--- a/fast-logger.cabal
+++ b/fast-logger.cabal
@@ -1,5 +1,5 @@
 Name:                   fast-logger
-Version:                2.0.3
+Version:                2.1.0
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -14,7 +14,7 @@
   GHC-Options:          -Wall
   Exposed-Modules:      System.Log.FastLogger
                         System.Log.FastLogger.File
-                        System.Log.FastLogger.IO
+  Other-Modules:        System.Log.FastLogger.IO
                         System.Log.FastLogger.IORef
                         System.Log.FastLogger.LogStr
                         System.Log.FastLogger.Logger
