diff --git a/src/context.cr b/src/context.cr index a6dfec4..edafd6e 100644 --- a/src/context.cr +++ b/src/context.cr @@ -7,13 +7,13 @@ class Context property config : Config property library : Library property storage : Storage - property logger : MLogger + property logger : Logger property queue : MangaDex::Queue def initialize(@config, @logger, @library, @storage, @queue) end - {% for lvl in LEVELS %} + {% for lvl in Logger::LEVELS %} def {{lvl.id}}(msg) @logger.{{lvl.id}} msg end diff --git a/src/library.cr b/src/library.cr index 6b3e068..59d2c2f 100644 --- a/src/library.cr +++ b/src/library.cr @@ -89,7 +89,7 @@ class Title encoded_title : String, mtime : Time def initialize(@dir : String, @parent_id, storage, - @logger : MLogger, @library : Library) + @logger : Logger, @library : Library) @id = storage.get_id @dir, true @title = File.basename dir @encoded_title = URI.encode @title @@ -304,7 +304,7 @@ end class Library property dir : String, title_ids : Array(String), scan_interval : Int32, - logger : MLogger, storage : Storage, title_hash : Hash(String, Title) + logger : Logger, storage : Storage, title_hash : Hash(String, Title) def initialize(@dir, @scan_interval, @logger, @storage) # explicitly initialize @titles to bypass the compiler check. it will diff --git a/src/log_handler.cr b/src/log_handler.cr index 4990c7f..fb0bcca 100644 --- a/src/log_handler.cr +++ b/src/log_handler.cr @@ -2,7 +2,7 @@ require "kemal" require "./logger" class LogHandler < Kemal::BaseLogHandler - def initialize(@logger : MLogger) + def initialize(@logger : Logger) end def call(env) diff --git a/src/logger.cr b/src/logger.cr index 1e6d446..f00c73b 100644 --- a/src/logger.cr +++ b/src/logger.cr @@ -1,59 +1,58 @@ -require "./config" -require "logger" +require "log" require "colorize" -LEVELS = ["debug", "error", "fatal", "info", "warn"] -COLORS = [:light_cyan, :light_red, :red, :light_yellow, :light_magenta] +class Logger + LEVELS = ["debug", "error", "fatal", "info", "warn"] + SEVERITY_IDS = [0, 4, 5, 2, 3] + COLORS = [:light_cyan, :light_red, :red, :light_yellow, :light_magenta] -class MLogger - def initialize(config : Config) - @logger = Logger.new STDOUT - - @log_off = false - log_level = config.log_level - if log_level == "off" - @log_off = true - return - end + @@severity : Log::Severity = :info + def initialize(level : String) {% begin %} - case log_level - {% for lvl in LEVELS %} + case level.downcase + when "off" + @@severity = :none + {% for lvl, i in LEVELS %} when {{lvl}} - @logger.level = Logger::{{lvl.upcase.id}} + @@severity = Log::Severity.new SEVERITY_IDS[{{i}}] {% end %} else - raise "Unknown log level #{log_level}" + raise "Unknown log level #{level}" end {% end %} - @logger.formatter = Logger::Formatter.new do \ - |severity, datetime, progname, message, io| + @log = Log.for("") + @backend = Log::IOBackend.new + @backend.formatter = ->(entry : Log::Entry, io : IO) do color = :default {% begin %} - case severity.to_s().downcase + case entry.severity.label.to_s().downcase {% for lvl, i in LEVELS %} - when {{lvl}} + when {{lvl}}, "#{{{lvl}}}ing" color = COLORS[{{i}}] {% end %} + else end {% end %} - io << "[#{severity}]".ljust(8).colorize(color) - io << datetime.to_s("%Y/%m/%d %H:%M:%S") << " | " - io << message + io << "[#{entry.severity.label}]".ljust(10).colorize(color) + io << entry.timestamp.to_s("%Y/%m/%d %H:%M:%S") << " | " + io << entry.message end + + Log.builder.bind "*", @@severity, @backend + end + + # Ignores @@severity and always log msg + def log(msg) + @backend.write Log::Entry.new "", Log::Severity::None, msg, nil end {% for lvl in LEVELS %} def {{lvl.id}}(msg) - return if @log_off - @logger.{{lvl.id}} msg + @log.{{lvl.id}} { msg } end {% end %} - - def to_json(json : JSON::Builder) - json.string self - end end diff --git a/src/mangadex/downloader.cr b/src/mangadex/downloader.cr index 30043c1..266396d2 100644 --- a/src/mangadex/downloader.cr +++ b/src/mangadex/downloader.cr @@ -79,7 +79,7 @@ module MangaDex class Queue property downloader : Downloader? - def initialize(@path : String, @logger : MLogger) + def initialize(@path : String, @logger : Logger) dir = File.dirname path unless Dir.exists? dir @logger.info "The queue DB directory #{dir} does not exist. " \ @@ -253,7 +253,7 @@ module MangaDex def initialize(@queue : Queue, @api : API, @library_path : String, @wait_seconds : Int32, @retries : Int32, - @logger : MLogger) + @logger : Logger) @queue.downloader = self spawn do diff --git a/src/mango.cr b/src/mango.cr index b443099..29da3d0 100644 --- a/src/mango.cr +++ b/src/mango.cr @@ -25,7 +25,7 @@ parser = OptionParser.parse do |parser| end config = Config.load config_path -logger = MLogger.new config +logger = Logger.new config.log_level storage = Storage.new config.db_path, logger library = Library.new config.library_path, config.scan_interval, logger, storage queue = MangaDex::Queue.new config.mangadex["download_queue_db_path"].to_s, diff --git a/src/storage.cr b/src/storage.cr index 8d20e15..8dc7cd3 100644 --- a/src/storage.cr +++ b/src/storage.cr @@ -16,7 +16,7 @@ def random_str end class Storage - def initialize(@path : String, @logger : MLogger) + def initialize(@path : String, @logger : Logger) dir = File.dirname path unless Dir.exists? dir @logger.info "The DB directory #{dir} does not exist. " \ @@ -48,7 +48,7 @@ class Storage hash = hash_password random_pw db.exec "insert into users values (?, ?, ?, ?)", "admin", hash, nil, 1 - puts "Initial user created. You can log in with " \ + @logger.log "Initial user created. You can log in with " \ "#{{"username" => "admin", "password" => random_pw}}" end end