5

これは私の scotty アプリです。リクエストをコンソールに記録する方法に注目してください。

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.RequestLogger

import Data.Monoid (mconcat)

main = scotty 3000 $ do
    --log requests to console
    middleware logStdoutDev

    get "/:word" $ do
        beam <- param "word"
        html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

私の scotty アプリは、プロキシ メカニズムを使用して nginx の背後で実行されます。これにより、scotty アプリは次のようにログに記録します。

127.0.0.1 - - [27/Aug/2014:15:12:00 +0000] "GET / HTTP/1.0" 200 - ...

REAL IP ADDRESSをログに記録したい。

Node.js/Express アプリで同じ問題が発生し、次のように解決しました。

Express.js: リモート クライアント アドレスを取得する方法

Scotty でこの問題を解決するにはどうすればよいですか?

4

1 に答える 1

10

パッケージに由来するIPAddrSourceデータ型があります。したがって、IP アドレスをヘッダーから取得したい場合は、次のようにすることができます。wai-extrawai-logger

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.RequestLogger

import Control.Monad.IO.Class
import Data.Monoid (mconcat)
import Data.Default

main = scotty 3000 $ do
    --log requests to console
    logger <- liftIO $ mkRequestLogger def { outputFormat = Apache FromHeader }
    middleware logger

    get "/:word" $ do
        beam <- param "word"
        html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

Apache FromFallback説明から、最初にヘッダーをチェックし、ヘッダーが見つからない場合はソケット IP アドレスを使用するようにも見えます。

アップデート

scotty関数の外でロガーを作成することもできます。

main = do
    logger <- mkRequestLogger def { outputFormat = Apache FromHeader }
    scotty 3000 $ do
        middleware logger

        get "/:word" $ do
            beam <- param "word"
            html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]
于 2014-08-28T00:00:13.413 に答える