-
Notifications
You must be signed in to change notification settings - Fork 11
/
logger.cr
58 lines (48 loc) 路 1.47 KB
/
logger.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
require "http/server/handler"
require "logger"
require "colorize"
require "time_format"
# `HTTP::Handler` which logs requests colorfully into specified *logger*.
#
# ```
# require "prism/handlers/logger"
# logger = Prism::Handlers::Logger.new(Logger.new(STDOUT))
#
# # INFO -- : GET /users 200 102渭s
# # INFO -- : GET /favicon.ico 404 52渭s
# # INFO -- : POST /users 201 3.74ms
# ```
class Prism::Handlers::Logger
include HTTP::Handler
WS_COLOR = :cyan
def initialize(@logger : ::Logger)
end
def call(context)
time = Time.now
websocket = context.request.headers["Upgrade"]? == "websocket"
if websocket
method = "WS".rjust(7).colorize(WS_COLOR).mode(:bold)
resource = context.request.resource.colorize(WS_COLOR)
progess = "pending".colorize(:dark_gray)
@logger.info("#{method} #{resource} #{progess}")
end
begin
call_next(context)
ensure
time = TimeFormat.auto(Time.now - time).colorize(:dark_gray)
color = :red
case context.response.status_code
when 100..199
color = :cyan
when 200..299
color = :green
when 300..399
color = :yellow
end
method = (websocket ? "WS" : context.request.method).rjust(7).colorize(color).mode(:bold)
resource = context.request.resource.colorize(color)
status_code = context.response.status_code.colorize(color).mode(:bold)
@logger.info("#{method} #{resource} #{status_code} #{time}")
end
end
end