spec/ecs_logging/logger_spec.rb (107 lines of code) (raw):
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# frozen_string_literal: true
require "spec_helper"
require "ecs_logging/logger"
require "spec/spec_validator"
module EcsLogging
RSpec.describe Logger do
let(:io) { StringIO.new }
let(:log) { io.rewind; io.read }
before(:all) do
@validator =
SpecValidator.new(JSON.parse(File.read('spec/fixtures/spec/spec.json')))
end
subject { described_class.new(io) }
it "logs in ECS format" do
subject.info("very informative")
json = JSON.parse(log)
expect(json).to match(
"@timestamp" => /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,
"log.level" => "INFO",
"message" => "very informative",
"ecs.version" => "1.4.0",
)
expect(@validator.validate!(json)).to be true
end
it "has methods for all severities" do
subject.unknown('ok', process: { id: 1 })
subject.fatal('ok', process: { id: 1 })
subject.error('ok', process: { id: 1 })
subject.warn('ok', process: { id: 1 })
subject.info('ok', process: { id: 1 })
subject.debug('ok', process: { id: 1 })
expect(log.lines.count).to be 6
end
it "adds extra keys" do
subject.info("ok", process: { id: 1 })
json = JSON.parse(log)
expect(json).to match(
"@timestamp" => String,
"log.level" => "INFO",
"message" => "ok",
"ecs.version" => "1.4.0",
"process" => { "id" => 1 }
)
expect(@validator.validate!(json)).to be true
end
describe "with progname" do
it "includes it" do
subject.info("yes") { "ok" }
json = JSON.parse(log)
expect(json["log.logger"]).to eq "yes"
expect(@validator.validate!(json)).to be true
end
end
describe 'include_origin:' do
it 'includes origin fields' do
subject.info("very informative", include_origin: true)
json = JSON.parse(log)
expect(json).to match(
"@timestamp" => /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,
"log.level" => "INFO",
"message" => "very informative",
"ecs.version" => "1.4.0",
"log.origin" => {
"file.line" => Integer,
"file.name" => "logger_spec.rb",
"function" => /block.*in.*EcsLogging/
}
)
expect(@validator.validate!(json)).to be true
end
end
context "when running alongside the Elastic APM agent" do
before do
module ::ElasticAPM
def self.running?
true
end
def self.current_transaction
Struct.new(:id, :trace_id).new('abc', 'xyz')
end
def self.current_span
Struct.new(:id).new('def')
end
end
end
after do
Object.send(:remove_const, :ElasticAPM)
raise if defined?(ElasticAPM)
end
it "add transaction and trace ids" do
subject.info("very informative")
json = JSON.parse(log)
expect(json).to(
match(
"@timestamp" => /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,
"log.level" => "INFO",
"message" => "very informative",
"ecs.version" => "1.4.0",
"transaction.id" => "abc",
"trace.id" => "xyz",
"span.id" => "def"
)
)
expect(@validator.validate!(json)).to be true
end
end
end
end