Logging for Haskell Servant with wai-logger
概要
Servantのチュートリアルと同じ設定(デフォルト)ではWebリクエストに対するレスポンスのログが一切表示されません。これでは動作テストをしようにも問題が特定できず困ってしまいます。Loggerを適切に設定すればリクエストに対するログを標準出力やファイルに吐き出すことができます。
以下、ServantにLoggerを導入する方法の1つを紹介します。
本記事のソースコードは以下のリポジトリにおいてあります。
https://github.com/algas/haskell-servant-cookbook
標準出力にログを吐く
前回の記事(ログ出力なし)では、サーバを起動するために run
関数 (Network.Wai.Handler.Warp) を使いました。
-- run :: Port -> Application -> IO ()
run 8080 app
今回(ログ出力あり)は runSettings
(Network.Wai.Handler.Warp) を withStdoutLogger
(Network.Wai.Logger) とともに使用しています。
-- withStdoutLogger :: (ApacheLogger -> IO a) -> IO a
-- setLogger :: (Request -> Status -> Maybe Integer -> IO ()) -> Settings -> Settings
-- type ApacheLogger = Request -> Status -> Maybe Integer -> IO ()
-- runSettings :: Settings -> Application -> IO ()
main = do
withStdoutLogger $ \aplogger -> do
let settings = setPort 8080 $ setLogger aplogger defaultSettings
runSettings settings app
動作確認
$ stack exec logger
127.0.0.1 - - [25/May/2016:16:20:01 +0900] "GET / HTTP/1.1" 200 - "" "curl/7.43.0"
$ curl http://localhost:8080
curl などのクライアントからサーバにアクセスすると、
標準出力にリクエストのログが吐かれていることが確認できます。
ソースコード
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
module Main where
import Data.Text (Text)
import Network.Wai
import Network.Wai.Handler.Warp
import Network.Wai.Logger (withStdoutLogger)
import Servant
import Servant.API
type SimpleAPI = Get '[PlainText] Text
simpleApi :: Proxy SimpleAPI
simpleApi = Proxy
server :: Server SimpleAPI
server = return "Simple"
app :: Application
app = serve simpleApi server
main :: IO ()
main = do
withStdoutLogger $ \aplogger -> do
let settings = setPort 8080 $ setLogger aplogger defaultSettings
runSettings settings app
executable logger
hs-source-dirs: logger
main-is: Main.hs
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: base
, text
, aeson
, wai
, wai-logger
, warp
, servant
, servant-server
, haskell-servant-cookbook
default-language: Haskell2010
参考記事
http://www.parsonsmatt.org/2015/05/02/scotty_and_persistent.html
http://qiita.com/lotz/items/c357a41d4432942d8054