• Stars
    star
    311
  • Rank 134,521 (Top 3 %)
  • Language
    Ruby
  • License
    MIT License
  • Created about 13 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Yell - Your Extensible Logging Library

Yell Gem Version Build Status Code Climate Coverage Status

Yell - Your Extensible Logging Library is a comprehensive logging replacement for Ruby.

Yell works and its test suite currently runs on:

  • ruby-head, 2.3.1, 2.2.5, 2.2.2, 2.1.0, 2.0.0
  • jruby-head, jruby-9.1.0.0, jruby-9.0.0.0

If you want to conveniently use Yell with Rails, then head over to yell-rails. You'll find all the documentation in this repository, though.

Installation

System wide:

gem install yell

Or in your Gemfile:

gem "yell"

Usage

On the basics, you can use Yell just like any other logging library with a more sophisticated message formatter.

logger = Yell.new STDOUT

logger.info "Hello World"
#=> "2012-02-29T09:30:00+01:00 [ INFO] 65784 : Hello World"
#    ^                         ^       ^       ^
#    ISO8601 Timestamp         Level   Pid     Message

The strength of Yell, however, comes when using multiple adapters. The already built-in ones are IO-based and require no further configuration. Also, there are additional ones available as separate gems. Please consult the wiki on that - they are listed there.

The standard adapters are:

:stdout : Messages will be written to STDOUT
:stderr : Messages will be written to STDERR
:file : Messages will be written to a file
:datefile : Messages will be written to a timestamped file

Here are some short examples on how to combine them:

Example: Notice messages go into STDOUT and error messages into STDERR
logger = Yell.new do |l|
  l.adapter STDOUT, level: [:debug, :info, :warn]
  l.adapter STDERR, level: [:error, :fatal]
end
Example: Typical production Logger

We setup a logger that starts passing messages at the :info level. Severities below :error go into the 'production.log', whereas anything higher is written into the 'error.log'.

logger = Yell.new do |l|
  l.level = 'gte.info' # will only pass :info and above to the adapters

  l.adapter :datefile, 'production.log', level: 'lte.warn' # anything lower or equal to :warn
  l.adapter :datefile, 'error.log', level: 'gte.error' # anything greater or equal to :error
end
Example: Typical production Logger for Heroku

When deploying to Heroku, the "rails_log_stdout" gem gets injected to your Rails project. Yell does not need that when properly configured (see yell-rails for a more convenient integration with Rails).

logger = Yell.new do |l|
  l.level = 'gte.info'

  l.adapter :stdout, level: 'lte.warn'
  l.adapter :stderr, level: 'gte.error'
end

But I'm used to Log4r and I don't want to move on

One of the really nice features of Log4r is its repository. The following example is taken from the official Log4r documentation.

require 'log4r'
include Log4r

# create a logger named 'mylog' that logs to stdout
mylog = Logger.new 'mylog'
mylog.outputters = Outputter.stdout

# later in the code, you can get the logger back
Logger['mylog']

With Yell you can do the same thing with less:

require 'yell'

# create a logger named 'mylog' that logs to stdout
Yell.new :stdout, name: 'mylog'

# later in the code, you can get the logger back
Yell['mylog']

There is no need to define outputters separately and you don't have to taint you global namespace with Yell's subclasses.

Adding a logger to an existing class

Yell comes with a simple module: +Yell::Loggable+. Simply include this in a class and you are good to go.

# Before you can use it, you will need to define a logger and 
# provide it with the `:name` of your class.
Yell.new :stdout, name: 'Foo'

class Foo
  include Yell::Loggable
end

# Now you can log
Foo.logger.info "Hello World"
Foo.new.logger.info "Hello World"

It even works with class inheritance:

# Given the above example, we inherit from Foo
class Bar < Foo
end

# The logger will fallback to the Foo superclass
Bar.logger.info "Hello World"
Bar.new.logger.info "Hello World"

Adding a logger to all classes at once (global logger)

Derived from the example above, simply do the following.

# Define a logger and pass `Object` as name. Internally, Yell adds this
# logger to the repository where you can access it later on.
Yell.new :stdout, name: Object

# Enable logging for the class that (almost) every Ruby class inherits from
Object.send :include, Yell::Loggable

# now you are good to go... from wherever you are
logger.info "Hello from anything"
Integer.logger.info "Hello from Integer"

Suppress log messages with silencers

In case you woul like to suppress certain log messages, you may define silencers with Yell. Use this to get control of a noisy log environment. For instance, you can suppress logging messages that contain secure information or more simply, to skip information about serving your Rails assets. Provide a string or a regular expression of the message patterns you would like to exclude.

logger = Yell.new do |l|
  l.silence /^Started GET "\/assets/
  l.silence /^Served asset/
end

logger.debug 'Started GET "/assets/logo.png" for 127.0.0.1 at 2013-06-20 10:18:38 +0200'
logger.debug 'Served asset /logo.png - 304 Not Modified (0ms)'

Alter log messages with modifiers

Further Readings

How To: Setting The Log Level
How To: Formatting Log Messages
How To: Using Adapters
How To: The Datefile Adapter
How To: Different Adapters for Different Log Levels

Additional Adapters

Syslog
syslog-sd
Graylog2 (GELF)
Fluentd

Development

How To: Writing Your Own Adapter

You can find further examples and additional adapters in the wiki. or have a look into the examples folder.

Copyright © 2011-current Rudolf Schmidt, released under the MIT license

More Repositories

1

mongodb-maintenance

Compact and backup scripts for MongoDB
JavaScript
34
star
2

yell-rails

Yell for Rails
Ruby
27
star
3

google_charts

Google Charts with Ruby
Ruby
19
star
4

capistrano-strategy-copy-bundled

Ruby
18
star
5

alertify-rails

Ruby
13
star
6

quarry.nvim

Neovim plugin to simplify mason, mason-lspconfig and lspconfig configuration.
Lua
10
star
7

git-stats

some scripts to get stats out of git
Ruby
6
star
8

cottontail

Handle AMQP with style
Ruby
5
star
9

jquery.multiSelect

This is an extended version of Cory S.N. LaViska's jQuery.multiSelect plugin
JavaScript
4
star
10

little_log_friend

An easy way to set your standard logger to a more readable format
Ruby
4
star
11

bookmarkaby

Bookmarkaby provides a helper to enable your app with social bookmark capabilities
Ruby
4
star
12

yummy-dotenv

A yummy dotenv library
JavaScript
3
star
13

yell-adapters-syslog

Syslog adapter for Yell
Ruby
3
star
14

yell-adapters-gelf

Graylog2 adapter for Yell
Ruby
3
star
15

shoulda_deferred

Always wanted to defer or postpone shoulda tests? Well, then this is the plugin for you! You can put an 'x' in front of any shoulda macro to run that test later.
Ruby
2
star
16

canonical_dude

Easy canonical URL generation
Ruby
2
star
17

lerna-monorepo-template

A template for a lerna monorepo serving UMD packages
JavaScript
2
star
18

tictactoe-vuejs

JavaScript
2
star
19

nav

Navigation made easy
Ruby
2
star
20

yummy-named-routes.js

TypeScript
1
star
21

capistrano-strategy-copy-working-dir

Capistrano recipe to deploy via :copy with already bundled gems
Ruby
1
star
22

rack-http-enforcer

A simple Rack middleware to enforce HTTP connections
Ruby
1
star
23

jquery.radioSelect

extends a HTML multi select into select with radiobuttons and search capabilities
1
star
24

work_queue

github mirror for the work_queue gem (gone from rubygems.org)
Ruby
1
star
25

jquery.slide.js

jQuery slider plugin
JavaScript
1
star
26

gd2

git mirror from RubyForge gd2
Ruby
1
star
27

dotfiles

CSS
1
star