DEV: Add exception class/message to `DiscourseLogstashLogger` take 2 (#27815)

This is the second take of af2bd4cc50 to
account for messages which contains newlines.
This commit is contained in:
Alan Guo Xiang Tan 2024-07-10 11:04:17 +08:00 committed by GitHub
parent 0b64cb9d8c
commit b4b7fa17af
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 27 additions and 5 deletions

View File

@ -83,9 +83,9 @@ class DiscourseLogstashLogger < Logger
#
# In theory we could get logster to include the exception class and message in opts but logster currently does not
# need those options so we are parsing it from the message for now and not making a change in logster.
if progname == "web-exception" && message =~ /^(\w+) \((.+)\)\n/
if progname == "web-exception" && message =~ /\A([^\(\)]+)\s{1}\(([\s\S]+)\)/
event["exception.class"] = $1
event["exception.message"] = $2
event["exception.message"] = $2.strip
end
if (env = opts&.dig(:env)).present?

View File

@ -51,12 +51,34 @@ RSpec.describe DiscourseLogstashLogger do
it "logs a JSON string with the `exception_class` and `exception_message` fields when `progname` is `web-exception`" do
logger = described_class.logger(logdev: output, type: "test")
logger.add(Logger::ERROR, "StandardError (some error message)\ntest", "web-exception")
logger.add(
Logger::ERROR,
"Some::StandardError (this is a normal message)\ntest",
"web-exception",
)
output.rewind
parsed = JSON.parse(output.read.chomp)
expect(parsed["exception.class"]).to eq("StandardError")
expect(parsed["exception.message"]).to eq("some error message")
expect(parsed["exception.class"]).to eq("Some::StandardError")
expect(parsed["exception.message"]).to eq("this is a normal message")
end
it "logs a JSON string with the `exception_class` and `exception_message` fields when `progname` is `web-exception` and the exception message contains newlines" do
logger = described_class.logger(logdev: output, type: "test")
logger.add(
Logger::ERROR,
"Some::StandardError (\n\nsome error message\n\nsomething else\n\n)\ntest",
"web-exception",
)
output.rewind
parsed = JSON.parse(output.read.chomp)
expect(parsed["exception.class"]).to eq("Some::StandardError")
expect(parsed["exception.message"]).to eq("some error message\n\nsomething else")
end
it "logs a JSON string with the right fields when `customize_event` attribute is set" do