diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 26c6e569..b8e65c00 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -31,6 +31,7 @@ require 'toml' # internal requires require 'jekyll/version' require 'jekyll/utils' +require 'jekyll/log_writer' require 'jekyll/stevenson' require 'jekyll/deprecator' require 'jekyll/configuration' @@ -115,7 +116,11 @@ module Jekyll end def self.logger - @logger ||= Stevenson.new + @logger ||= LogWriter.new(Stevenson.new) + end + + def self.logger=(writer) + @logger = LogWriter.new(writer) end # Public: File system root diff --git a/lib/jekyll/log_writer.rb b/lib/jekyll/log_writer.rb new file mode 100644 index 00000000..c9320585 --- /dev/null +++ b/lib/jekyll/log_writer.rb @@ -0,0 +1,103 @@ +require 'logger' +module Jekyll + class LogWriter + attr_reader :writer + + LOG_LEVELS = { + debug: 0, + info: 1, + warn: 2, + error: 3 + } + + # Public: Create a new instance of Jekyll's log writer + # + # writer - Logger compatible instance + # log_level - (optional, symbol) the log level + # + # Returns nothing + def initialize(writer, level = :info) + @writer = writer + self.log_level = level + end + + # Public: Set the log level on the writer + # + # level - (symbol) the log level + # + # Returns nothing + def log_level=(level) + writer.level = LOG_LEVELS.fetch(level) + end + + # Public: Print a jekyll debug message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def debug(topic, message = nil) + writer.debug(message(topic, message)) + end + + # Public: Print a jekyll message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def info(topic, message = nil) + writer.info(message(topic, message)) + end + + # Public: Print a jekyll message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def warn(topic, message = nil) + writer.warn(message(topic, message).yellow) + end + + # Public: Print a jekyll error message + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns nothing + def error(topic, message = nil) + writer.error(message(topic, message).red) + end + + # Public: Print a Jekyll error message and immediately abort the process + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail (can be omitted) + # + # Returns nothing + def abort_with(topic, message = nil) + error(topic, message) + abort + end + + # Public: Build a Jekyll topic method + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # message - the message detail + # + # Returns the formatted message + def message(topic, message) + formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ') + end + + # Public: Format the topic + # + # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. + # + # Returns the formatted topic statement + def formatted_topic(topic) + "#{topic} ".rjust(20) + end + end +end diff --git a/lib/jekyll/stevenson.rb b/lib/jekyll/stevenson.rb index b50368c1..f940fa4a 100644 --- a/lib/jekyll/stevenson.rb +++ b/lib/jekyll/stevenson.rb @@ -1,102 +1,49 @@ +require 'logger' module Jekyll - class Stevenson - attr_accessor :log_level - - LOG_LEVELS = { - debug: 0, - info: 1, - warn: 2, - error: 3 - } - - # Public: Create a new instance of Stevenson, Jekyll's logger - # - # level - (optional, symbol) the log level - # - # Returns nothing - def initialize(level = :info) - @log_level = level + class Stevenson < ::Logger + def initialize + @progname = nil + @level = DEBUG + @default_formatter = Formatter.new + @logdev = $stdout + @formatter = proc do |severity, datetime, progname, msg| + "#{msg}" + end end - # Public: Print a jekyll debug message to stdout - # - # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. - # message - the message detail - # - # Returns nothing - def debug(topic, message = nil) - $stdout.puts(message(topic, message)) if should_log(:debug) + def add(severity, message = nil, progname = nil, &block) + severity ||= UNKNOWN + @logdev = set_logdevice(severity) + + if @logdev.nil? or severity < @level + return true + end + progname ||= @progname + if message.nil? + if block_given? + message = yield + else + message = progname + progname = @progname + end + end + @logdev.puts( + format_message(format_severity(severity), Time.now, progname, message)) + true end - # Public: Print a jekyll message to stdout - # - # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. - # message - the message detail - # - # Returns nothing - def info(topic, message = nil) - $stdout.puts(message(topic, message)) if should_log(:info) + def close + # No LogDevice in use end - # Public: Print a jekyll message to stderr - # - # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. - # message - the message detail - # - # Returns nothing - def warn(topic, message = nil) - $stderr.puts(message(topic, message).yellow) if should_log(:warn) - end + private - # Public: Print a jekyll error message to stderr - # - # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. - # message - the message detail - # - # Returns nothing - def error(topic, message = nil) - $stderr.puts(message(topic, message).red) if should_log(:error) - end - - # Public: Print a Jekyll error message to stderr and immediately abort the process - # - # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. - # message - the message detail (can be omitted) - # - # Returns nothing - def abort_with(topic, message = nil) - error(topic, message) - abort - end - - # Public: Build a Jekyll topic method - # - # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. - # message - the message detail - # - # Returns the formatted message - def message(topic, message) - formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ') - end - - # Public: Format the topic - # - # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. - # - # Returns the formatted topic statement - def formatted_topic(topic) - "#{topic} ".rjust(20) - end - - # Public: Determine whether the current log level warrants logging at the - # proposed level. - # - # level_of_message - the log level of the message (symbol) - # - # Returns true if the log level of the message is greater than or equal to - # this logger's log level. - def should_log(level_of_message) - LOG_LEVELS.fetch(log_level) <= LOG_LEVELS.fetch(level_of_message) + def set_logdevice(severity) + if severity > INFO + $stderr + else + $stdout + end end end end