diff --git a/System/Log/FastLogger.hs b/System/Log/FastLogger.hs
--- a/System/Log/FastLogger.hs
+++ b/System/Log/FastLogger.hs
@@ -31,7 +31,7 @@
 import Control.Applicative ((<$>))
 import Control.Concurrent (getNumCapabilities, myThreadId, threadCapability, takeMVar)
 import Control.Monad (when, replicateM)
-import Data.Array (Array, listArray, (!))
+import Data.Array (Array, listArray, (!), bounds)
 import Data.Maybe (isJust)
 import GHC.IO.Device (close)
 import GHC.IO.FD (FD(..), openFile, stderr, stdout)
@@ -91,7 +91,13 @@
 pushLogStr :: LoggerSet -> LogStr -> IO ()
 pushLogStr (LoggerSet _ fref arr) logmsg = do
     (i, _) <- myThreadId >>= threadCapability
-    let logger = arr ! i
+    -- The number of capability could be dynamically changed.
+    -- So, let's check the upper boundary of the array.
+    let u = snd $ bounds arr
+        lim = u + 1
+        j | i < lim   = i
+          | otherwise = i `mod` lim
+    let logger = arr ! j
     fd <- readIORef fref
     pushLog fd logger logmsg
 
@@ -100,9 +106,9 @@
 --   being terminated.
 flushLogStr :: LoggerSet -> IO ()
 flushLogStr (LoggerSet _ fref arr) = do
-    n <- getNumCapabilities
+    let (l,u) = bounds arr
     fd <- readIORef fref
-    mapM_ (flushIt fd) [0..n-1]
+    mapM_ (flushIt fd) [l .. u]
   where
     flushIt fd i = flushLog fd (arr ! i)
 
@@ -119,9 +125,9 @@
 --   and freeing the buffers.
 rmLoggerSet :: LoggerSet -> IO ()
 rmLoggerSet (LoggerSet mfile fref arr) = do
-    n <- getNumCapabilities
+    let (l,u) = bounds arr
     fd <- readIORef fref
-    let nums = [0..n-1]
+    let nums = [l .. u]
     mapM_ (flushIt fd) nums
     mapM_ freeIt nums
     when (isJust mfile) $ close fd
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.1.4
+Version:                2.1.5
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
