diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,22 @@
+## 2.4.2
+
+* Fixing a buf of long log messages [#80](https://github.com/kazu-yamamoto/logger/pull/80)
+* Log rotation support for Windows [#79](https://github.com/kazu-yamamoto/logger/pull/79)
+* Unsupporting GHC 7.4.
+
+## 2.4.1
+
+* Restore compatibility with bytestring < 0.10
+* Mark fast-logger modules as Safe/Trustworth [#68](https://github.com/kazu-yamamoto/logger/pull/68)
+
+## 2.4.0
+
+* Providing pushLogStrLn. [#64](https://github.com/kazu-yamamoto/logger/pull/64)
+
+## 2.3.1
+
+* No changes.
+
 ## 2.3.0
 
 * Move from blaze-builder to `Data.ByteString.Builder` [#55](https://github.com/kazu-yamamoto/logger/pull/55)
diff --git a/System/Log/FastLogger.hs b/System/Log/FastLogger.hs
--- a/System/Log/FastLogger.hs
+++ b/System/Log/FastLogger.hs
@@ -1,6 +1,6 @@
 -- | This module provides a fast logging system which
 --   scales on multicore environments (i.e. +RTS -N\<x\>).
-{-# LANGUAGE BangPatterns, CPP #-}
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE Safe #-}
 
 module System.Log.FastLogger (
@@ -38,23 +38,15 @@
 import Control.Monad (when, replicateM)
 import Data.Array (Array, listArray, (!), bounds)
 import Data.Maybe (isJust)
-import GHC.IO.Device (close)
-import GHC.IO.FD (FD(..), openFile, stderr, stdout)
-import GHC.IO.IOMode (IOMode(..))
 import System.Log.FastLogger.File
 import System.Log.FastLogger.IO
+import System.Log.FastLogger.FileIO
 import System.Log.FastLogger.IORef
 import System.Log.FastLogger.LogStr
 import System.Log.FastLogger.Logger
 
 ----------------------------------------------------------------
 
--- | Opening a log file.
-logOpen :: FilePath -> IO FD
-logOpen file = fst <$> openFile file AppendMode False
-
-----------------------------------------------------------------
-
 -- | A set of loggers.
 --   The number of loggers is the capabilities of GHC RTS.
 --   You can specify it with \"+RTS -N\<x\>\".
@@ -63,15 +55,15 @@
 
 -- | Creating a new 'LoggerSet' using a file.
 newFileLoggerSet :: BufSize -> FilePath -> IO LoggerSet
-newFileLoggerSet size file = logOpen file >>= newFDLoggerSet size (Just file)
+newFileLoggerSet size file = openFileFD file >>= newFDLoggerSet size (Just file)
 
 -- | Creating a new 'LoggerSet' using stdout.
 newStdoutLoggerSet :: BufSize -> IO LoggerSet
-newStdoutLoggerSet size = newFDLoggerSet size Nothing stdout
+newStdoutLoggerSet size = getStdoutFD >>= newFDLoggerSet size Nothing
 
 -- | Creating a new 'LoggerSet' using stderr.
 newStderrLoggerSet :: BufSize -> IO LoggerSet
-newStderrLoggerSet size = newFDLoggerSet size Nothing stderr
+newStderrLoggerSet size = getStderrFD >>= newFDLoggerSet size Nothing
 
 {-# DEPRECATED newLoggerSet "Use newFileLoggerSet etc instead" #-}
 -- | Creating a new 'LoggerSet'.
@@ -139,9 +131,9 @@
 renewLoggerSet :: LoggerSet -> IO ()
 renewLoggerSet (LoggerSet Nothing     _    _ _) = return ()
 renewLoggerSet (LoggerSet (Just file) fref _ _) = do
-    newfd <- logOpen file
+    newfd <- openFileFD file
     oldfd <- atomicModifyIORef' fref (\fd -> (newfd, fd))
-    close oldfd
+    closeFD oldfd
 
 -- | Flushing the buffers, closing the internal file information
 --   and freeing the buffers.
@@ -152,7 +144,7 @@
     let nums = [l .. u]
     mapM_ (flushIt fd) nums
     mapM_ freeIt nums
-    when (isJust mfile) $ close fd
+    when (isJust mfile) $ closeFD fd
   where
     flushIt fd i = flushLog fd (arr ! i)
     freeIt i = do
diff --git a/System/Log/FastLogger/FileIO.hs b/System/Log/FastLogger/FileIO.hs
new file mode 100644
--- /dev/null
+++ b/System/Log/FastLogger/FileIO.hs
@@ -0,0 +1,61 @@
+{-# LANGUAGE CPP #-}
+
+module System.Log.FastLogger.FileIO where
+
+import Foreign.Ptr (Ptr)
+import Data.Word (Word8)
+
+#ifdef mingw32_HOST_OS
+import System.Win32.Types (HANDLE)
+import System.Win32.File
+import Graphics.Win32.Misc (getStdHandle, sTD_OUTPUT_HANDLE, sTD_ERROR_HANDLE)
+import Data.Bits ((.|.))
+
+type FD = HANDLE
+
+closeFD :: FD -> IO ()
+closeFD = closeHandle
+
+openFileFD :: FilePath -> IO FD
+openFileFD f = createFile f
+                         (gENERIC_READ .|. gENERIC_WRITE)
+                         (fILE_SHARE_READ .|. fILE_SHARE_DELETE)
+                         Nothing
+                         oPEN_ALWAYS
+                         fILE_ATTRIBUTE_NORMAL
+                         Nothing
+
+getStderrFD :: IO FD
+getStderrFD = getStdHandle sTD_ERROR_HANDLE
+
+getStdoutFD :: IO FD
+getStdoutFD = getStdHandle sTD_OUTPUT_HANDLE
+
+writeRawBufferPtr2FD :: FD -> Ptr Word8 -> Int -> IO Int
+writeRawBufferPtr2FD h bf len = fromIntegral `fmap` win32_WriteFile h bf (fromIntegral len) Nothing
+
+#else
+
+import GHC.IO.Device (close)
+import qualified GHC.IO.FD as POSIX (FD(..))
+import GHC.IO.FD (openFile, stderr, stdout,  writeRawBufferPtr)
+import GHC.IO.IOMode (IOMode(..))
+
+type FD = POSIX.FD
+
+closeFD :: FD -> IO ()
+closeFD = close
+
+openFileFD :: FilePath -> IO FD
+openFileFD f = fst `fmap` openFile f AppendMode False
+
+getStderrFD :: IO FD
+getStderrFD = return stderr
+
+getStdoutFD :: IO FD
+getStdoutFD = return stdout
+
+writeRawBufferPtr2FD :: FD -> Ptr Word8 -> Int -> IO Int
+writeRawBufferPtr2FD fd bf len = fromIntegral `fmap` writeRawBufferPtr "write" fd bf 0 (fromIntegral len)
+
+#endif
diff --git a/System/Log/FastLogger/IO.hs b/System/Log/FastLogger/IO.hs
--- a/System/Log/FastLogger/IO.hs
+++ b/System/Log/FastLogger/IO.hs
@@ -38,6 +38,5 @@
              More minSize writer'
                | size < minSize -> error "toBufIOWith: More: minSize"
                | otherwise      -> loop writer'
-             Chunk (PS fptr off siz) writer'
-               | len == 0  -> loop writer' -- flushing
-               | otherwise -> withForeignPtr fptr $ \ptr -> io (ptr `plusPtr` off) siz
+             Chunk (PS fptr off siz) writer' ->
+               withForeignPtr fptr $ \ptr -> io (ptr `plusPtr` off) siz >> loop writer'
diff --git a/System/Log/FastLogger/Logger.hs b/System/Log/FastLogger/Logger.hs
--- a/System/Log/FastLogger/Logger.hs
+++ b/System/Log/FastLogger/Logger.hs
@@ -11,7 +11,7 @@
 import Control.Concurrent (MVar, newMVar, withMVar)
 import Control.Monad (when)
 import Foreign.Ptr (plusPtr)
-import GHC.IO.FD (FD, writeRawBufferPtr)
+import System.Log.FastLogger.FileIO
 import System.Log.FastLogger.IO
 import System.Log.FastLogger.LogStr
 import System.Log.FastLogger.IORef
@@ -77,6 +77,6 @@
 write fd buf len' = loop buf (fromIntegral len')
   where
     loop bf !len = do
-        written <- writeRawBufferPtr "write" fd bf 0 (fromIntegral len)
+        written <- writeRawBufferPtr2FD fd bf len
         when (written < len) $
             loop (bf `plusPtr` fromIntegral written) (len - written)
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.4.1
+Version:                2.4.2
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -16,10 +16,11 @@
   Exposed-Modules:      System.Log.FastLogger
                         System.Log.FastLogger.File
   Other-Modules:        System.Log.FastLogger.IO
+                        System.Log.FastLogger.FileIO
                         System.Log.FastLogger.IORef
                         System.Log.FastLogger.LogStr
                         System.Log.FastLogger.Logger
-  Build-Depends:        base >= 4.4 && < 5
+  Build-Depends:        base >= 4.5 && < 5
                       , array
                       , auto-update >= 0.1.2
                       , bytestring
@@ -27,6 +28,9 @@
                       , directory
                       , filepath
                       , text
+  if os(windows)
+    Build-Depends:
+                      Win32
 
 Test-Suite spec
     Main-Is:         Spec.hs
