# 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