webapi-eca/coffee/logging.coffee

85 lines
2.6 KiB
CoffeeScript

# Logging
# =======
# A Helper to handle the logging throughout the application. It uses
# [bunyan](https://github.com/trentm/node-bunyan) which allows for different streams
# to be attached to different log levels. [bunyan](https://github.com/trentm/node-bunyan)
# creates JSON entries for each log action. The bunyan module can then be used as a
# CLI to pretty print these logs, e.g.:
# `node myapp.js | bunyan`
# **Loads Modules:**
# - Node.js Module: [fs](http://nodejs.org/api/fs.html) and [path](http://nodejs.org/api/path.html)
fs = require 'fs'
path = require 'path'
# - External Module: [bunyan](https://github.com/trentm/node-bunyan)
bunyan = require 'bunyan'
###
Returns a bunyan logger according to the given arguments.
@public getLogger( *args* )
@param {Object} args
###
exports.getLogger = ( args ) =>
emptylog =
trace: () ->
debug: () ->
info: () ->
warn: () ->
error: () ->
fatal: () ->
# `args` holds the configuration settings for the logging, see either CLI arguments
# in [webapi-eca](webapi-eca.html) or the configuration parameters in [config](config.html).
args = args ? {}
# We need to check for string 'true' also since the cliArgs passed to
# the event-poller will be strings
if args.nolog is true or args.nolog is 'true'
# if the user doesn't want to have a log at all (e.g. during tests), it can be omitted with
# the nolog flag
emptylog
else
try
opt =
name: "webapi-eca"
# if we are in development mode, we also add information about where the call came from
# this should be turned off in productive mode since it slows down the logging.
if args['mode'] is 'development'
opt.src = true
# if there's a custom path defined for the log, we adopt the setting.
if args['file-path']
@logPath = path.resolve args['file-path']
else
@logPath = path.resolve __dirname, '..', 'logs', 'server.log'
# We try to write a temp file in the same folder to check if the log can be written
try
fs.writeFileSync @logPath + '.temp', 'temp'
fs.unlinkSync @logPath + '.temp'
catch e
console.error "Log folder '#{ @logPath }' is not writable"
return emptylog
# We attach two streams, one for the I/O and one for the log file.
# The log levels are defined per stream according to the CLI args or the configuration.
opt.streams = [
{
level: args['io-level']
stream: process.stdout
},
{
level: args['file-level']
path: @logPath
}
]
# Finally we create the bunyan logger and return it
bunyan.createLogger opt
# If something goes wrong we print the error and return an empty logger.
catch e
console.error e
emptylog