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 - ...

我希望记录真实 IP 地址

我在我的 Node.js/Express 应用程序中遇到了同样的问题,我在这里解决了这个问题:

Express.js:如何获取远程客户端地址

如何在 Scotty 中解决这个问题?

4

1 回答 1

10

有一种IPAddrSource数据类型wai-extra源自wai-logger包。因此,如果您希望 IP 地址来自标头,您可以执行以下操作:

{-# 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 回答