如何在Web服务器日志中显示HTTP状态代码?

时间:2018-12-24 08:48:42

标签: racket

我有一个使用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状态代码在哪里?对于这样不完整的日志,我怎么知道是否有任何页面导致500403404等?

如何使Web服务器日志显示HTTP状态代码?

更新:Issue on GitHub

1 个答案:

答案 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