【发布时间】:2018-12-17 00:14:11
【问题描述】:
我有一个基于 Servant 构建的应用程序,现在我想向应用程序添加日志记录。我浏览了 Haskell 日志包,我认为这个提供了我需要的东西:https://github.com/serokell/log-warper/blob/master/log-warper/examples/HowTo.md
使用 Servant 构建应用程序时经常使用的“设计模式”之一是使用 Reader monad,因此我对应用程序使用这种方法:我有包含 AppConfig 的 AppEnv。通常,我可以向 AppEnv 添加类似“记录器”实体的内容,然后在处理程序中使用它。虽然,log-warper 不提供“记录器”,但它使用了不同的方法(我认为这似乎是另一个单子;请参阅上面链接中的示例)。所以我不知道如何将这个记录器与仆人一起使用。
这是我基于 Servant 的应用程序(使用最新版本的 Servant,基于文档中的示例:http://haskell-servant.readthedocs.io/en/stable/tutorial/Server.html#welcome-hoistserver):
data AppEnv = AppEnv { config :: Config }
type MyHandler = ReaderT AppEnv (ExceptT ServantErr IO)
startApp :: AppEnv -> IO ()
startApp env = do
run 16384 (app env)
app :: AppEnv -> Application
app env = serve readerAPI (readerServer env)
readerAPI :: Proxy ReaderAPI
readerAPI = Proxy
readerToHandler :: AppEnv -> Reader AppEnv a -> Handler a
readerToHandler env r = return (runReader r env)
readerServer :: AppEnv -> Server ReaderAPI
readerServer env = hoistServer readerAPI (readerToHandler env) readerServerT
b :: Reader AppEnv Bool
b = do
c <- config <$> ask
let
s = getServerConfig c
p = getServerPort s
return (p == 1)
getServerConfig :: Config -> ServerConfig
getServerConfig (Config s _) = s
getServerPort :: ServerConfig -> Int
getServerPort (ServerConfig _ p) = p
readerServerT :: ServerT ReaderAPI (Reader AppEnv)
readerServerT = a :<|> b where
a :: Reader AppEnv Int
a = return 1797
这里是主要功能:
main :: IO ()
main = do
config <- loadYamlSettings ["etc/config.yaml"] [] useEnv
print (config :: Config)
let
env = AppEnv config
startApp env
现在,如何将 log-warper 添加到应用程序中,以便我可以初始化记录器(我假设使用 launchFromFile),然后在应用程序中使用日志记录(logInfo、logError 等)(特别是在处理程序中,但也可能在其他功能中)?
谢谢
【问题讨论】:
-
您好!我是 Hackage 上最新的
log-warper版本的作者。我真的很喜欢你使用图书馆的事实!但该版本不再由该组织维护。教程适用于最新版本,但master分支包含对log-warper的完全重写。而且我不知道这个图书馆的未来计划。我可以帮助您解决问题,但首先使用log-warper可能不是一个好主意。 -
@Shersh 非常感谢您提供的详细信息!因此,如果不再支持该项目,您是否可以为haskell 推荐一些不错的日志库? (我的意思是,你似乎很擅长这个话题)
-
我还没有写出像样的日志库 ;) 但是开玩笑。在我们的工作中,我们在不同的项目中使用
katip和monad-logger,我们仍在思考哪个更好。我想你可以选择katip或monad-logger,你更喜欢哪一个。这些库之间的一个显着区别:monad-logger在单独的线程中运行日志记录。这可能会提高日志记录的性能,但有时也会导致奇怪的错误。 -
顺便说一句,如果你仍然感兴趣,我已经完成了我正在研究的库。您甚至可以阅读博文:kowainik.github.io/posts/2018-09-25-co-log 请随时分享任何反馈并提出任何问题 :)