A log level is an integer representing the importance or severity of a log event. The higher the level, the more severe the event.

It's recommended to specify a log level whenever you create a log. Primarily, it's to indicate how serious or important the log message is. It also helps with filtering and finding specific logs from the log files.

In addition to info and error, the logger provides following levels of logging.

logger.debug('Maximal debugging info') # log level: 0
logger.info('Non-error information')   # log level: 1
logger.warn('Non-error warning')       # log level: 2
logger.error('Non-fatal error')        # log level: 3
logger.fatal('Fatal error')            # log level: 4
logger.unknown('Most severe')          # log level: 5

Behind the scenes, these shorthand methods use logging levels like Logger::DEBUGLogger::WARN, etc.

When you call any of these methods, the entry may or may not be written to the log, depending on the entry’s severity and on the log level. The logger only writes logs with severity higher or equal to its current log level.

By default, when you create a new Logger instance, it's set to the lowest level of logging, which is Logger::DEBUG. It means that all log messages above this log level will be written to the logs.

logger = Logger.new('development.log')

puts logger.level  # 0

However, you can set the level when you create the logger.

logger = Logger.new('development.log', level: Logger::ERROR)

Now only errorfatal, and unknown levels of logs will be written to the log file.

require 'logger'

logger = Logger.new('development.log', level: Logger::ERROR)

puts logger.level  # 3

logger.info 'this is not added to the logs'
logger.error 'could not connect to the database'
logger.unknown 'something went wrong'

If you already have a logger instance, you can directly re-assign its level, or use one of the shorthand methods:

require 'logger'

logger = Logger.new('development.log', level: Logger::ERROR)
puts logger.level  # 3

logger.level = Logger::WARN  # re-assign log level
puts logger.level  # 2

logger.fatal!                # shorthand
puts logger.level  # 4

# Output
3
2
4

To check the current log level, use these methods:

logger.level = Logger::ERROR
logger.debug? # => false
logger.info?  # => false
logger.warn?  # => false
logger.error? # => true
logger.fatal? # => true

Now you can log as much as you want, but there're two levels I can think of where logs are important.

So most of the time, I'll stick to either info or error logs. In rare cases, when I need to crash and exit, I'll resort to fatal level.