微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWS CloudWatch的正确格式

如何解决AWS CloudWatch的正确格式

我在运行于AWS ECS的Docker容器中使用Servantcolog

HTTP请求已完美登录到AWS CloudWatch,但没有手动登录

我以这种方式启动了我的WAI服务器:

main :: IO ()
main = do
  withStdoutLogger $ \aplogger -> do
    let settings = setPort 8080 $ setLogger aplogger defaultSettings
    initializeApplication >>= runSettings settings

我还尝试通过以下方式模仿Apache Logging风格:

logStringStdoutCloudWatch :: Monadio m => LogAction m String
logStringStdoutCloudWatch = LogAction $ \x -> liftIO $ do
  let format = "%d/%b/%Y:%T %z"
  time <- getCurrentTime
  putStrLn $ "- - - [" ++ formatTime defaultTimeLocale format time ++ "] \"log\" - - \"\" \"" ++ x ++ "\""

它给了我以下日志:

- - - [12/Nov/2020:16:36:16 +0000] "log" - - "" "A log message"
127.0.0.1 - - [12/Nov/2020:17:36:16 +0100] "POST /event HTTP/1.1" 400 - "" "Client"

但是只有最后一行记录在CloudWatch中。

我的格式有什么问题?或者:是否有专用的lib / function具有正确的格式?

解决方法

实际上,我欺骗了将日志格式更改为json,首先是在Servant级别:

import Network.Wai.Middleware
import Network.Wai.Middleware.RequestLogger
import Network.Wai.Middleware.RequestLogger.JSON(formatAsJSONWithHeaders)

initializeApplication :: IO Application
initializeApplication = do
  logger <- 
  mkRequestLogger def {outputFormat = CustomOutputFormatWithDetailsAndHeaders formatAsJSONWithHeaders}
  return
    $ logger
    $ serve (Proxy @API)
    $ hoistServer (Proxy @API) (toHandler env) server

main :: IO ()
main = do
  let settings = setPort 8080 defaultSettings
  initializeApplication >>= runSettings settings

和记录器:

logStringStdoutCloudWatch :: MonadIO m => LogAction m String
logStringStdoutCloudWatch = LogAction $ \x -> liftIO $ do
  let format = "%d/%b/%Y:%T %z"
  time <- getCurrentTime
  putStrLn $ "{\"time\":\"" ++ formatTime defaultTimeLocale format time ++ "\",\"log\":\"" ++ x ++ "\"}"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。