discourse/lib/truncate_logs_formatter.rb

30 lines
1.1 KiB
Ruby

# frozen_string_literal: true
# This log formatter limits the number of characters in each log message to prevent malicious requests from filling up the disk
# in a short amount of time. The number of characters is determined by the `log_line_max_chars` global setting which can be
# configured via the `DISCOURSE_MAX_LOG_LINES` environment variable or via the `discourse_defaults.conf` file.
class TruncateLogsFormatter < ::ActiveSupport::Logger::SimpleFormatter
include ::ActiveSupport::TaggedLogging::Formatter
def initialize(log_line_max_chars:)
@log_line_max_chars = log_line_max_chars
end
def call(*args)
# Lograge formatters are only called with a single argument instead of the usual 4 arguments of `severity`, `datetime`, `progname` and `message`.
message =
if args.length == 1
args[0]
else
args[3]
end
if message.length > @log_line_max_chars
newlines = message.length - message.chomp.length
"#{message[0, @log_line_max_chars]}...(truncated)#{"\n" * newlines}"
else
message
end
end
end