Custom Formatters
The formatting for each appender can be replaced with custom code. To replace the existing formatter supply a block of code when creating the appender.
The formatter proc receives a single parameter which is the entire Log Struct
.
For the format of the Log Struct
, see Log Struct
Example: Formatter that just returns the Log Struct
require "semantic_logger"
SemanticLogger.default_level = :trace
formatter = Proc.new do |log|
# This formatter just returns the log struct as a string
log.inspect
end
SemanticLogger.add_appender(io: $stdout, formatter: formatter)
logger = SemanticLogger["Hello"]
logger.info "Hello World"
Output:
#<struct SemanticLogger::Log level=:info, thread_name=70167090649820, name="Hello", message="Hello World", payload=nil, time=2012-10-24 10:09:33 -0400, duration=nil, tags=nil, level_index=2>
Example: Replace the default log file formatter
require "semantic_logger"
SemanticLogger.default_level = :trace
Create a custom formatter:
class MyFormatter < SemanticLogger::Formatters::Default
# Return the complete log level name in uppercase
def level
log.level.upcase
end
end
Specify the formatter when creating the appender:
SemanticLogger.add_appender(file_name: "development.log", formatter: MyFormatter.new)
Example usage:
Rails.logger.info "Hello World"
# => 2017-04-05 01:05:52.868286 INFO [13143:70216759638540 (irb):11] Rails -- Hello World
See SemanticLogger::Formatters::Default for all the methods that can be replaced to customize the output.
Example: Replace the colorized log file formatter
require "semantic_logger"
SemanticLogger.default_level = :trace
Create a custom formatter:
class MyFormatter < SemanticLogger::Formatters::Color
# Return the complete log level name in uppercase
def level
"#{color}log.level.upcase#{clear}"
end
end
Specify the formatter when creating the appender:
SemanticLogger.add_appender(file_name: "development.log", formatter: MyFormatter.new)
Example usage:
Rails.logger.info "Hello World"
# => 2017-04-05 01:05:52.868286 INFO [13143:70216759638540 (irb):11] Rails -- Hello World
See SemanticLogger::Formatters::Color for all the methods that can be replaced to customize the output.
Example: Replacing the format for an active logger, such as in Rails:
This example assumes you have gem "rails_semantic_logger"
in your Gemfile.
Create a file called config/initializers/semantic_logger.rb
:
# Find file appender:
appender = SemanticLogger.appenders.find{ |a| a.is_a?(SemanticLogger::Appender::File) }
appender.formatter = MyFormatter.new
Example: Do not log the process ID
When running docker containers with a single process which is always 1, or when running only one process on a server the PID ( Process ID ) is not relevant.
To leave out the pid, we can use a custom formatter:
class NoPidFormatter < SemanticLogger::Formatters::Default
# Leave out the pid
def pid
end
end
Specify the formatter when creating the appender:
SemanticLogger.add_appender(file_name: "development.log", formatter: NoPidFormatter.new)
Or to use the colorized formatter, use SemanticLogger::Formatters::Color
instead of
SemanticLogger::Formatters::Default
.
Or if the appender is already installed:
SemanticLogger.appenders.first.formatter = NoPidFormatter.new