From acecbd9e8d2cee9ed4963fd1c9a84ff25fb17b38 Mon Sep 17 00:00:00 2001 From: OsamaSayegh Date: Mon, 24 Feb 2020 10:11:43 +0300 Subject: [PATCH] FEATURE: Make log message max length configurable and bump the default to 2000 --- README.md | 4 +++- lib/logster/base_store.rb | 7 +++++++ lib/logster/configuration.rb | 4 +++- lib/logster/message.rb | 14 +------------- test/logster/test_base_store.rb | 14 ++++++++++++++ test/logster/test_message.rb | 6 ------ 6 files changed, 28 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index b9e8b4ac..2e445824 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,9 @@ Logster can be configured using `Logster.config`: - `Logster.config.allow_grouping` : Enable grouping of similar messages into one messages with an array of `env` of the grouped messages. Similar messages are messages that have identical backtraces, severity and log message. -- `Logster.config.maximum_message_size_bytes` : set a maximum size for messages. Default value is 10,000. If a message size exceeds this limit, Logster will first remove all occurrences of `gems_dir` (more on this config below) from the backtrace and computes the size again; if the message is still above the limit, Logster will remove as many as character as needed from the backtrace to bring the size below the limit. It's discouraged to set this config to a really low value (e.g. less than 2000) because a message needs a minimum amount of data in order to make sense (the minimum amount varies per message), so the closer the limit is to the mimimum amount of space needed, the more of the backtrace will be removed. Keep this in mind when tweaking this config. +- `Logster.config.maximum_message_length` : set a maximum length for log messages that are shown inside the `info` tab and in the message rows in the UI. Messages that exceed the specified length will be truncated and an ellipsis will be appended to indicate that the message has been truncated. Default value is 2000. + +- `Logster.config.maximum_message_size_bytes` : set a maximum size for message objects. Default value is 10,000. If a message size exceeds this limit, Logster will first remove all occurrences of `gems_dir` (more on this config below) from the backtrace and computes the size again; if the message is still above the limit, Logster will remove as many as character as needed from the backtrace to bring the size below the limit. It's discouraged to set this config to a really low value (e.g. less than 2000) because a message needs a minimum amount of data in order to make sense (the minimum amount varies per message), so the closer the limit is to the mimimum amount of space needed, the more of the backtrace will be removed. Keep this in mind when tweaking this config. - `Logster.config.max_env_bytes` : set a maximum size for `env`. Default value is 1000. In case `env` is an array of hashes, this limit applies to the individual hashes in the array rather than the whole array. If an `env` hash exceeds this limit, Logster will take the biggest subset of key-value pairs whose size is below the limit. If the hash has a key with the name `time`, it will always be included. diff --git a/lib/logster/base_store.rb b/lib/logster/base_store.rb index 00f179e4..bd1d24d5 100644 --- a/lib/logster/base_store.rb +++ b/lib/logster/base_store.rb @@ -152,6 +152,8 @@ def report(severity, progname, msg, opts = {}) return if (!msg || (String === msg && msg.empty?)) && skip_empty return if level && severity < level + msg = msg.inspect unless String === msg + msg = truncate_message(msg) message = Logster::Message.new(severity, progname, msg, opts[:timestamp], count: opts[:count]) env = opts[:env] || {} @@ -245,6 +247,11 @@ def clear_patterns_cache(key) private + def truncate_message(msg) + cap = Logster.config.maximum_message_length + msg.size <= cap ? msg : msg[0...cap] + "..." + end + def not_implemented raise "Not Implemented" end diff --git a/lib/logster/configuration.rb b/lib/logster/configuration.rb index b3555cb2..68afc0d2 100644 --- a/lib/logster/configuration.rb +++ b/lib/logster/configuration.rb @@ -17,7 +17,8 @@ class Configuration :enable_backtrace_links, :gems_dir, :max_env_bytes, - :max_env_count_per_message + :max_env_count_per_message, + :maximum_message_length ) attr_writer :subdirectory @@ -37,6 +38,7 @@ def initialize @project_directories = [] @enable_backtrace_links = true @gems_dir = Gem.dir + "/gems/" + @maximum_message_length = 2000 @allow_grouping = false diff --git a/lib/logster/message.rb b/lib/logster/message.rb index f124e097..fff67afa 100644 --- a/lib/logster/message.rb +++ b/lib/logster/message.rb @@ -4,8 +4,6 @@ require 'securerandom' module Logster - MAX_MESSAGE_LENGTH = 600 - class Message LOGSTER_ENV = "_logster_env".freeze ALLOWED_ENV = %w{ @@ -30,7 +28,7 @@ def initialize(severity, progname, message, timestamp = nil, key = nil, count: 1 @timestamp = timestamp || get_timestamp @severity = severity @progname = progname - @message = truncate_message(message) + @message = message @key = key || SecureRandom.hex @backtrace = nil @count = count || 1 @@ -57,10 +55,6 @@ def to_h(exclude_env: false) h end - def message=(m) - @message = truncate_message(m) - end - def to_json(opts = nil) exclude_env = Hash === opts && opts.delete(:exclude_env) JSON.fast_generate(to_h(exclude_env: exclude_env), opts) @@ -311,12 +305,6 @@ def truncate_env(env, limit) end end - def truncate_message(msg) - return msg unless msg - msg = msg.inspect unless String === msg - msg.size <= MAX_MESSAGE_LENGTH ? msg : msg[0...MAX_MESSAGE_LENGTH] + "..." - end - def get_timestamp (Time.new.to_f * 1000).to_i end diff --git a/test/logster/test_base_store.rb b/test/logster/test_base_store.rb index a224f810..201b5b14 100644 --- a/test/logster/test_base_store.rb +++ b/test/logster/test_base_store.rb @@ -162,4 +162,18 @@ def test_chained_loggers_dont_have_superfluous_frames_in_backtrace assert_includes(message.backtrace.lines.first, __method__.to_s) end end + + def test_log_message_is_truncated_when_above_maximum_message_length + orig = Logster.config.maximum_message_length + Logster.config.maximum_message_length = 300 + msg = @store.report(Logger::WARN, '', 'a' * 400) + # 3 is the ... at the end to indicate truncated message + assert_equal(300 + 3, msg.message.size) + + Logster.config.maximum_message_length = 100 + msg = @store.report(Logger::WARN, '', 'a' * 200) + assert_equal(100 + 3, msg.message.size) + ensure + Logster.config.maximum_message_length = orig + end end diff --git a/test/logster/test_message.rb b/test/logster/test_message.rb index 76b67f45..22e47a68 100644 --- a/test/logster/test_message.rb +++ b/test/logster/test_message.rb @@ -146,12 +146,6 @@ def test_message_to_json_respects_params refute_includes(msg.to_json(exclude_env: true), test_hash.to_json) end - def test_title_is_truncated_when_too_large - msg = Logster::Message.new(0, "", "a" * 1000) - # 3 is the ... at the end to indicate truncated message - assert_equal(600 + 3, msg.message.size) - end - def test_drop_redundant_envs message = Logster::Message.new(Logger::WARN, '', 'message') message.env = [{ a: 4 }] * 10