我有一个使用Racket的Web服务器编写的Web应用程序:
#lang racket
(require web-server/servlet-env)
; Some web app code here ...
;; Start the web server.
(serve/servlet request-handler
#:log-file "/dev/stdout")
当我启动Web服务器并通过浏览器访问Web应用程序时,日志显示如下:
127.0.0.1 - - [25/Dec/2018:12:34:56 +0000] "GET /servlets/standalone.rkt HTTP/1.1" - -
127.0.0.1 - - [25/Dec/2018:12:34:56 +0000] "GET /favicon.ico HTTP/1.1" - -
但是HTTP状态代码在哪里?对于这样不完整的日志,我怎么知道是否有任何页面导致500
,403
,404
等?
如何使Web服务器日志显示HTTP状态代码?
更新:Issue on GitHub。
答案 0 :(得分:0)
built-in logging只是请求日志记录,而不是请求和响应日志记录。我同意;省略了一些重要信息。
我建议您自己记录。至少我就是这么做的。
实际上,我通常围绕dispatch
的{{1}}过程进行一整套包装。其中之一进行日志记录。
例如:
dispatch-rules
(serve/servlet (~> ;Note: requests go UP this chain, responses DOWN
dispatch
wrap-gzip
wrap-not-modified
wrap-authorize
wrap-authenticate
wrap-http->https
wrap-timed-and-logged)
#:servlet-path "/"
#:servlet-regexp #px""
#:listen-ip #f
#:port (current-internal-port)
#:servlet-responder error-responder)
的示例定义:
wrap-timed-and-logged
(define handler? (-> request? response?))
(define wrapper? (-> handler? handler?))
(define/contract ((wrap-timed-and-logged handler) req) wrapper?
(define t0 (current-inexact-milliseconds))
(define resp (handler req))
(define t1 (current-inexact-milliseconds))
(define dur (round (- t1 t0)))
;; Let's use "structured logging" here to make it easier to search,
;; and do things like create CloudWatch metrics from CloudWatch Logs
;; filters (they have a syntax to extract things from JSON.)
(log-info
(jsexpr->string
(hasheq 'request (hasheq 'method (~a (request-method req))
'ip (request-client-ip req)
'path (url->string (request-uri req))
'headers (headers->hasheq (request-headers/raw req)))
'response (hasheq 'code (response-code resp)
'headers (headers->hasheq (response-headers resp))
'duration dur))))
resp)
(define (headers->hasheq hs)
(for/hasheq ([h (in-list hs)])
(values (string->symbol (~a (header-field h)))
(~a (header-value h)))))
的示例定义:
error-responder