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
大就知道了!所以(因为你没有对我的代码做任何评论;-))我推断它并不是太糟糕。关于快速记录器,在这种情况下它有意义吗? – gueux 2014-12-02 12:00:13
出于好奇,为什么这个bug不影响Yesod? – gueux 2014-12-02 12:05:06
Yesod使用'messageLoggerSource'来格式化日志消息,因此它没有碰到monad-logger的越野车部分。关于快速记录器:您可以尝试切换,看看它是否会提高速度。我会想象它会的,但我无法肯定地预测这一点。 – 2014-12-02 12:12:42