Skip to content

Commit

Permalink
Add stdio_logger extension for a minimal logger that Sequel::Database…
Browse files Browse the repository at this point in the history
… can use

This is mostly taken from the bin/sequel implementation, with
the main change that it should be more thread-safe by using
write instead of puts.

Change bin/sequel to use this extension instead of defining an
anonymous class.  Also have bin/sequel use sync for log files,
as that is what logger does.
  • Loading branch information
jeremyevans committed Jul 1, 2024
1 parent 2a8bc37 commit 0fb4446
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 17 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
=== master

* Add stdio_logger extension for a minimal logger that Sequel::Database can use (jeremyevans)

* Simplify Database#inspect output to database_type, host, database, and user (jeremyevans)

=== 5.82.0 (2024-07-01)
Expand Down
26 changes: 9 additions & 17 deletions bin/sequel
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,6 @@ load_dirs = []
exclusive_options = []
loggers = []

logger_class = Class.new do
def initialize(device)
@device = device
end

def debug(msg)
end

[:info, :warn, :error].each do |meth|
define_method(meth) do |msg|
@device.puts("#{Time.now.strftime('%Y-%m-%d %T')} #{meth.to_s.upcase}: #{msg}")
end
end
end

options = OptionParser.new do |opts|
opts.banner = "Sequel: The Database Toolkit for Ruby"
opts.define_head "Usage: sequel [options] <uri|path> [file]"
Expand Down Expand Up @@ -76,15 +61,17 @@ options = OptionParser.new do |opts|
end

opts.on("-E", "--echo", "echo SQL statements") do
loggers << logger_class.new($stdout)
loggers << $stdout
end

opts.on("-I", "--include dir", "specify $LOAD_PATH directory") do |v|
$: << v
end

opts.on("-l", "--log logfile", "log SQL statements to log file") do |v|
loggers << logger_class.new(File.open(v, 'a'))
file = File.open(v, 'a')
file.sync = true
loggers << file
end

opts.on("-L", "--load-dir DIR", "loads all *.rb under specifed directory") do |v|
Expand Down Expand Up @@ -168,6 +155,11 @@ begin
end
end

unless loggers.empty?
Sequel.extension :stdio_logger
loggers.map!{|io| Sequel::StdioLogger.new(io)}
end

DB = connect_proc[db]
load_dirs.each{|d| d.is_a?(Array) ? require(d.first) : Dir["#{d}/**/*.rb"].each{|f| load(f)}}
if migrate_dir
Expand Down
48 changes: 48 additions & 0 deletions lib/sequel/extensions/stdio_logger.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# frozen-string-literal: true
#
# The stdio_logger extension exposes a Sequel::StdioLogger class that
# can be used for logging with Sequel, as a minimal alternative to
# the logger library. It exposes debug/info/warn/error methods for the
# different warning levels. The debug method is a no-op, so that setting
# the Database sql_log_level to debug will result in no output for normal
# queries. The info/warn/error methods log the current time, log level,
# and the given message.
#
# To use this extension:
#
# Sequel.extension :stdio_logger
#
# Then you you can use Sequel::StdioLogger to wrap IO objects that you
# would like Sequel to log to:
#
# DB.loggers << Sequel::StdioLogger.new($stdout)
#
# log_file = File.open("db_queries.log", 'a')
# log_file.sync = true
# DB.loggers << Sequel::StdioLogger.new(log_file)
#
# This is implemented as a global extension instead of a Database extension
# because Database loggers must be set before Database extensions are loaded.
#
# Related module: Sequel::StdioLogger

#
module Sequel
class StdioLogger
def initialize(device)
@device = device
end

# Do not log debug messages. This is so setting the Database
# sql_log_level to debug will result in no output.
def debug(msg)
end

[:info, :warn, :error].each do |meth|
define_method(meth) do |msg|
@device.write("#{Time.now.strftime('%F %T')} #{meth.to_s.upcase}: #{msg}\n")
nil
end
end
end
end
25 changes: 25 additions & 0 deletions spec/extensions/stdio_logger_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
require_relative "spec_helper"

require 'stringio'

describe "stdio_logger extension: Sequel::StdioLogger" do
before do
Sequel.extension :stdio_logger
@output = StringIO.new
@logger = Sequel::StdioLogger.new(@output)
end

it "#debug should not log" do
@logger.debug("foo").must_be_nil
@output.rewind
@output.read.must_equal ''
end

[:info, :warn, :error].each do |level|
it "##{level} should log message with given level" do
@logger.send(level, "foo").must_be_nil
@output.rewind
@output.read.must_match(/ #{level.to_s.upcase}: foo\n\z/)
end
end
end

0 comments on commit 0fb4446

Please sign in to comment.