LoginSignup
4
4

More than 5 years have passed since last update.

Haskell Servant 入門 (Loggerの導入)

Posted at

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 などのクライアントからサーバにアクセスすると、
標準出力にリクエストのログが吐かれていることが確認できます。

ソースコード

logger/Main.hs
{-# 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
haskell-servant-cookbook.cabal
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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4