2014-12-01 105 views
1

我有一个Yesod应用程序与购物车,它的效果很好。我现在想要在外部应用程序(脚手架中的“app/tasks.hs”)中清除过期的购物车,这些应用程序将使用cron运行。下面的代码有效,但每条日志消息后面都有一个空白行。难道我做错了什么?旁边的问题:我怎么能把它转换成快速记录器?我读过的脚手架Application.hs但我没有管理如何避免基础的创作...如何在没有Foundation的情况下记录空行?

import Control.Monad.Logger     (runStdoutLoggingT, LoggingT) 
import Database.Persist.Sqlite    (runSqlPool) 
import Data.Text       (append) 
import Import 
import qualified Database.Esqueleto as E 

runQueries :: UTCTime -> NominalDiffTime -> SqlPersistT (ResourceT (LoggingT IO))() 
runQueries now expiration = do 
    $(logInfo) "Delete expired shopping carts." 
    carts <- 
     E.select $ 
     E.from $ \(c, u) -> do 
     E.where_ ( c E.^. CartUpdated E.<. E.val (addUTCTime (- expiration) now) 
       E.&&. c E.^. CartCustomer E.==. u E.^. UserId 
       ) 
     return (c, u) 
    forM_ carts $ \(cart, user) -> do 
     cartitems <- selectList [ CartItemCart ==. entityKey cart ] [] 
     forM_ cartitems $ \ci -> do 
      update (cartItemItem $ entityVal ci) [ItemStock +=. (cartItemQuantity $ entityVal ci)] 
      delete $ entityKey ci 
     delete $ entityKey cart 
     $(logInfo) $ "Deleted cart: " `append` (userEmail $ entityVal user) 

main :: IO() 
main = do 
    -- Get the settings from all relevant sources 
    settings <- loadAppSettingsArgs 
     -- fall back to compile-time values, set to [] to require values at runtime 
     [configSettingsYmlValue] 

     -- allow environment variables to override 
     useEnv 

    now <- getCurrentTime 

    pool <- createPoolConfig (appDatabaseConf settings) 

    runStdoutLoggingT $ runResourceT $ runSqlPool (runQueries now $ appCartExpiration settings) pool 

回答

3

良好的渔获物,这实际上是在单子记录器中的错误。我已经发布了解决它的版本0.3.10.1。

编辑下面是使用快速记录器与单子记录器的一个例子:

​​
+0

大就知道了!所以(因为你没有对我的代码做任何评论;-))我推断它并不是太糟糕。关于快速记录器,在这种情况下它有意义吗? – gueux 2014-12-02 12:00:13

+0

出于好奇,为什么这个bug不影响Yesod? – gueux 2014-12-02 12:05:06

+0

Yesod使用'messageLoggerSource'来格式化日志消息,因此它没有碰到monad-logger的越野车部分。关于快速记录器:您可以尝试切换,看看它是否会提高速度。我会想象它会的,但我无法肯定地预测这一点。 – 2014-12-02 12:12:42

相关问题