Skip to content

Commit c6a8cef

Browse files
authored
Merge pull request #14 from typesense/fix-log-level
Don't override application-level log level
2 parents 6366e5b + 3a9d74c commit c6a8cef

File tree

4 files changed

+72
-27
lines changed

4 files changed

+72
-27
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ sequel_data.sqlite3
2828

2929

3030
vendor
31+
32+
typesense-data

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ Typesense.configuration = {
4848
}],
4949
api_key: 'your-api-key',
5050
connection_timeout_seconds: 2,
51-
log_level: :info # Optional: Set logging level (:debug, :info, :warn, :error, :fatal, :unknown)
51+
log_level: :info # Messages below this level will be silenced. One of (:debug, :info, :warn, :error, :fatal)
5252
}
5353
```
5454

lib/typesense-rails.rb

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
end
1818

1919
require "logger"
20-
Rails.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT))
21-
Rails.logger.level = Logger::WARN
2220

2321
module Typesense
2422
class NotConfigured < StandardError; end
@@ -32,6 +30,37 @@ class NoBlockGiven < StandardError; end
3230

3331
class << self
3432
attr_reader :included_in
33+
attr_writer :logger
34+
35+
def logger
36+
return @logger if defined?(@logger) && @logger
37+
38+
rails_logger = (defined?(::Rails) && Rails.respond_to?(:logger)) ? Rails.logger : nil
39+
@logger = rails_logger || Logger.new($stdout)
40+
end
41+
42+
def log(severity, message = nil, &block)
43+
# If a min log level is configured, skip below-threshold messages
44+
min_level = log_level
45+
if min_level && !passes_min_level?(severity, min_level)
46+
return
47+
end
48+
49+
sev_const = log_level_to_const(severity)
50+
if logger.respond_to?(:tagged)
51+
logger.tagged("Typesense") { logger.add(sev_const, message, &block) }
52+
else
53+
logger.add(sev_const, message, &block)
54+
end
55+
end
56+
57+
def passes_min_level?(severity, min_level)
58+
return true if min_level.nil?
59+
60+
sev_const = log_level_to_const(severity)
61+
min_const = log_level_to_const(min_level)
62+
sev_const >= min_const
63+
end
3564

3665
def included(klass)
3766
@included_in ||= []
@@ -269,7 +298,7 @@ def typesense_create_collection(collection_name, settings = nil)
269298
metadata ? { "metadata" => metadata } : {}
270299
)
271300
)
272-
Rails.logger.debug "Collection '#{collection_name}' created!"
301+
Typesense.log(:debug, "Collection '#{collection_name}' created!")
273302

274303
typesense_multi_way_synonyms(collection_name, multi_way_synonyms) if multi_way_synonyms
275304

@@ -542,7 +571,7 @@ def typesense_index_objects_async(objects, batch_size = Typesense::IndexSettings
542571
end
543572
jsonl_object = documents.join("\n")
544573
ImportJob.perform(jsonl_object, collection_obj[:alias_name], batch_size)
545-
Rails.logger.debug "#{objects.length} objects enqueued for import into #{collection_obj[:collection_name]}"
574+
Typesense.log(:debug, "#{objects.length} objects enqueued for import into #{collection_obj[:collection_name]}")
546575
end
547576
nil
548577
end
@@ -557,7 +586,7 @@ def typesense_index_objects(objects, batch_size = Typesense::IndexSettings::DEFA
557586
end
558587
jsonl_object = documents.join("\n")
559588
import_documents(jsonl_object, "upsert", collection_obj[:alias_name], batch_size: batch_size)
560-
Rails.logger.debug "#{objects.length} objects upserted into #{collection_obj[:collection_name]}!"
589+
Typesense.log(:debug, "#{objects.length} objects upserted into #{collection_obj[:collection_name]}!")
561590
end
562591
nil
563592
end
@@ -588,7 +617,7 @@ def typesense_index!(object)
588617
begin
589618
api_response = delete_document(object_id, collection_obj[:collection_name])
590619
rescue Typesense::Error::ObjectNotFound => e
591-
Rails.logger.error "Object not found in index: #{e.message}"
620+
Typesense.log(:error, "Object not found in index: #{e.message}")
592621
end
593622
end
594623
end
@@ -611,9 +640,9 @@ def typesense_remove_from_index!(object)
611640
begin
612641
delete_document(object_id, collection_obj[:alias_name])
613642
rescue Typesense::Error::ObjectNotFound => e
614-
Rails.logger.error "Object #{object_id} could not be removed from #{collection_obj[:collection_name]} collection! Use reindex to update the collection."
643+
Typesense.log(:error, "Object #{object_id} could not be removed from #{collection_obj[:collection_name]} collection! Use reindex to update the collection.")
615644
end
616-
Rails.logger.debug "Removed document with object id '#{object_id}' from #{collection_obj[:collection_name]}"
645+
Typesense.log(:debug, "Removed document with object id '#{object_id}' from #{collection_obj[:collection_name]}")
617646
end
618647
nil
619648
end
@@ -626,7 +655,7 @@ def typesense_clear_index!
626655
collection_obj = typesense_ensure_init(options, settings, false)
627656

628657
delete_collection(collection_obj[:alias_name])
629-
Rails.logger.debug "Deleted #{collection_obj[:alias_name]} collection!"
658+
Typesense.log(:debug, "Deleted #{collection_obj[:alias_name]} collection!")
630659
@typesense_indexes[settings] = nil
631660
end
632661
nil

lib/typesense/config.rb

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
module Typesense
22
module Config
3+
@@pagination_backend = nil unless defined?(@@pagination_backend)
4+
@@log_level = nil unless defined?(@@log_level)
5+
@@configuration = nil unless defined?(@@configuration)
36
def initiliaze
47
@client = nil
58
end
@@ -13,34 +16,45 @@ def configuration=(configuration)
1316
@@pagination_backend = configuration[:pagination_backend] if configuration.key?(:pagination_backend)
1417
@@log_level = configuration[:log_level] if configuration.key?(:log_level)
1518
@@configuration = configuration
16-
17-
Rails.logger.level = log_level_to_const(configuration[:log_level])
1819
end
1920

2021
def pagination_backend
2122
@@pagination_backend
2223
end
2324

2425
def log_level
25-
@@log_level
26+
defined?(@@log_level) ? @@log_level : nil
2627
end
2728

2829
def log_level_to_const(level)
29-
case level
30-
when :debug
31-
Logger::DEBUG
32-
when :info
33-
Logger::INFO
34-
when :warn
35-
Logger::WARN
36-
when :error
37-
Logger::ERROR
38-
when :fatal
39-
Logger::FATAL
40-
when :unknown
41-
Logger::UNKNOWN
30+
# Be more forgiving in inputs.
31+
# Accepts Integer (e.g., Logger::WARN), Symbol/String (e.g., :warn, "warn", "WARN", "Logger::WARN")
32+
return level if level.is_a?(Integer)
33+
return Logger::WARN if level.nil?
34+
35+
str = level.to_s
36+
37+
# Handle fully-qualified constants like "Logger::WARN"
38+
if str.include?("::")
39+
const = str.split("::").last
40+
return Logger.const_get(const) if Logger.const_defined?(const)
41+
end
42+
43+
# Normalize common misnomer
44+
upper = str.upcase
45+
upper = "WARN" if upper == "WARNING"
46+
return Logger.const_get(upper) if Logger.const_defined?(upper)
47+
48+
# Fallback to explicit mapping
49+
case str.downcase.to_sym
50+
when :debug then Logger::DEBUG
51+
when :info then Logger::INFO
52+
when :warn, :warning then Logger::WARN
53+
when :error then Logger::ERROR
54+
when :fatal then Logger::FATAL
55+
when :unknown then Logger::UNKNOWN
4256
else
43-
Logger::WARN # default fallback
57+
Logger::WARN
4458
end
4559
end
4660

0 commit comments

Comments
 (0)