74 lines
1.4 KiB
Crystal
74 lines
1.4 KiB
Crystal
require "logger"
|
|
|
|
enum LogLevel
|
|
Debug
|
|
Info
|
|
Warn
|
|
Error
|
|
end
|
|
|
|
class Invidious::LogHandler < Kemal::BaseLogHandler
|
|
def initialize(@io : IO = STDOUT, @level = LogLevel::Warn)
|
|
end
|
|
|
|
def call(context : HTTP::Server::Context)
|
|
time = Time.utc
|
|
call_next(context)
|
|
elapsed_text = elapsed_text(Time.utc - time)
|
|
|
|
@io << time << ' ' << context.response.status_code << ' ' << context.request.method << ' ' << context.request.resource << ' ' << elapsed_text << '\n'
|
|
|
|
if @io.is_a? File
|
|
@io.flush
|
|
end
|
|
|
|
context
|
|
end
|
|
|
|
def puts(message : String)
|
|
@io << message << '\n'
|
|
|
|
if @io.is_a? File
|
|
@io.flush
|
|
end
|
|
end
|
|
|
|
def write(message : String, level = @level)
|
|
@io << message
|
|
|
|
if @io.is_a? File
|
|
@io.flush
|
|
end
|
|
end
|
|
|
|
def set_log_level(level : String)
|
|
case level.downcase
|
|
when "debug"
|
|
set_log_level(LogLevel::Debug)
|
|
when "info"
|
|
set_log_level(LogLevel::Info)
|
|
when "warn"
|
|
set_log_level(LogLevel::Warn)
|
|
when "error"
|
|
set_log_level(LogLevel::Error)
|
|
end
|
|
end
|
|
|
|
def set_log_level(level : LogLevel)
|
|
@level = level
|
|
end
|
|
|
|
{% for level in %w(debug info warn error) %}
|
|
def {{level.id}}(message : String)
|
|
puts(message, LogLevel::{{level.id.capitalize}})
|
|
end
|
|
{% end %}
|
|
|
|
private def elapsed_text(elapsed)
|
|
millis = elapsed.total_milliseconds
|
|
return "#{millis.round(2)}ms" if millis >= 1
|
|
|
|
"#{(millis * 1000).round(2)}µs"
|
|
end
|
|
end
|