sta*_*ser 5 haskell haskell-wai haskell-warp scotty
这是我的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>"]
Run Code Online (Sandbox Code Playgroud)
我的scotty app使用代理机制在nginx后面运行.这导致scotty应用程序像这样记录:
127.0.0.1 - - [27/Aug/2014:15:12:00 +0000] "GET / HTTP/1.0" 200 - ...
Run Code Online (Sandbox Code Playgroud)
我希望记录REAL IP ADDRESS.
我在我的Node.js/Express应用程序中遇到了同样的问题,我解决了这个问题:
我如何在Scotty中解决这个问题?
Sha*_*eep 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>"]
Run Code Online (Sandbox Code Playgroud)
从描述中,它看起来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>"]
Run Code Online (Sandbox Code Playgroud)