Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions lib/boot/boot/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ async function bootAllServices (options) {

const bootedServices = {}

// Register core default logger as a Tymly service
bootedServices.logger = options.logger

const config = options.config || {}

for (const serviceComponent of options.parsedServices) {
Expand Down
13 changes: 12 additions & 1 deletion lib/boot/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,14 @@ const applyMods = require('./mods/apply')

const startupMessages = require('./../startup-messages')

const LoggerService = require('./../logger-service')

async function bootTymlyServices (options, callback) {
// Initialise a core default logger
const loggerService = new LoggerService()
loggerService.boot()
options.logger = loggerService

const messages = options.messages || startupMessages()
options.messages = messages

Expand Down Expand Up @@ -55,6 +62,9 @@ async function bootTymly (options, messages) {
messages
)

// In case an alternative logger was booted
options.logger = bootedServices.logger

await postBootTymlyRefResolution(
loadedComponents,
bootedServices,
Expand Down Expand Up @@ -111,7 +121,8 @@ async function bootServices (
pluginPaths: loadedComponents.pluginPaths,
blueprintPaths: loadedComponents.blueprintPaths,
config: options.config,
messages: messages
messages: messages,
logger: options.logger
})
return bootedServices
} catch (err) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
const LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'fatal']
const nullLogger = require('./null-logger')(LEVELS)
const LOG_LEVELS = require('./log-levels')
const nullLogger = require('./null-logger')(LOG_LEVELS)
const pino = require('pino')
const pinoPretty = require('pino-pretty')
const moment = require('moment')
const path = require('path')
const fs = require('fs')
const { isPlainObject } = require('lodash')

class Logger {
boot (options) {
this.shouldLog = [...LEVELS, 'ON', '*'].includes(process.env.LOGGER)
class LoggerService {
boot () {
this.shouldLog = [...LOG_LEVELS, 'ON', '*'].includes(process.env.LOGGER)

if (this.shouldLog) {
this.level = LEVELS.includes(process.env.LOGGER)
this.level = LOG_LEVELS.includes(process.env.LOGGER)
? process.env.LOGGER
: (process.env.LOGGER === '*' ? 'trace' : 'info')
this.loggerOutputFilePath = generateFilePath(process.env.LOGGER_OUTPUT_DIR_PATH)

options.messages.info(`Logger level set to: ${this.level}`)
options.messages.info(this.loggerOutputFilePath ? `Output logs to ${this.loggerOutputFilePath}` : 'No output file')
console.log(`Logger level set to: ${this.level}`)
console.log(this.loggerOutputFilePath ? `Output logs to ${this.loggerOutputFilePath}` : 'No output file')
} else {
options.messages.info('Using default logger')
console.log('Using default logger')
}

this.logger = this.createLogger()

const createLogFn = level => { this[level] = msg => this.logger[level](msg) }
LEVELS.forEach(createLogFn)
LOG_LEVELS.forEach(createLogFn)

this.info('Logger initialised')
}
Expand All @@ -40,7 +40,7 @@ class Logger {
// addLogger (namespace = 'logger') {
// const fns = {}
// const createLogFn = level => { fns[level] = (...args) => this.logger[level](`[${namespace}] ${args.join(' ')}`) }
// LEVELS.forEach(createLogFn)
// LOG_LEVELS.forEach(createLogFn)
// return fns
// }

Expand Down Expand Up @@ -75,7 +75,7 @@ class Logger {
}

isValidLevel (level) {
return LEVELS.includes(level)
return LOG_LEVELS.includes(level)
}
}

Expand Down Expand Up @@ -120,8 +120,4 @@ function createMultistream (filepath, level) {
return pino.multistream(streams)
}

module.exports = {
schema: require('./schema.json'),
serviceClass: Logger,
bootBefore: ['tymly']
}
module.exports = LoggerService
1 change: 1 addition & 0 deletions lib/logger-service/log-levels.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = ['trace', 'debug', 'info', 'warn', 'error', 'fatal']
3 changes: 0 additions & 3 deletions lib/plugin/components/services/logger/doc/index.js

This file was deleted.

5 changes: 0 additions & 5 deletions lib/plugin/components/services/logger/schema.json

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
const { isPlainObject } = require('lodash')
const levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal']

class AlternativeLogger {
boot () {
this.shouldLog = true
this.level = process.env.LOGGER

this.logs = []

const logFn = level => (...args) => {
const message = args.join(' ')
console.log(`[${level}] ${message}`)
this.logs.push({ level, message })
}

const logger = {}
levels.forEach(level => { logger[level] = logFn(level) })
logger.child = () => logger
this.logger = logger
}

child (arg) {
const namespace = (typeof arg === 'string' ? arg : (isPlainObject(arg) ? arg.namespace : '')) || 'logger'
const opts = { namespace }
return this.logger.child(opts)
}
}

module.exports = {
serviceClass: AlternativeLogger,
bootBefore: ['tymly']
}
1 change: 1 addition & 0 deletions test/fixtures/plugins/alternative-logger-plugin/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = {}
26 changes: 21 additions & 5 deletions test/logger-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ function readLogFile (filepath) {
.split('\n')
.filter(line => line)
.map(JSON.parse)
.filter(line => line.msg !== 'Logger initialised')
}

function expectAllLevels (logs) {
logs.shift()
// logs.shift()
const levels = logs.map(l => l.level)

const notLogged = Object.values(LEVEL_MAP).filter(l => !levels.includes(l))
Expand Down Expand Up @@ -61,7 +62,7 @@ function expectAllLevels (logs) {
}

function expectSomeLevels (logs, expectedLevels) {
logs.shift()
// logs.shift()
const levels = logs.map(l => l.level)

for (const [key, value] of Object.keys(LEVEL_MAP)) {
Expand Down Expand Up @@ -147,7 +148,7 @@ describe('Logger tests', function () {
it('check output file contents', () => {
const filepath = bootedServices.logger.loggerOutputFilePath
const logs = readLogFile(filepath)
expect(logs.length).to.eql(7)
expect(logs.length).to.eql(6)
expectAllLevels(logs)
})

Expand Down Expand Up @@ -178,7 +179,7 @@ describe('Logger tests', function () {
it('check output file contents', () => {
const filepath = bootedServices.logger.loggerOutputFilePath
const logs = readLogFile(filepath)
expect(logs.length).to.eql(5)
expect(logs.length).to.eql(4)
expectSomeLevels(logs, ['info', 'warn', 'error', 'fatal'])
})

Expand Down Expand Up @@ -240,7 +241,7 @@ describe('Logger tests', function () {
it('check output file contents', () => {
const filepath = bootedServices.logger.loggerOutputFilePath
const logs = readLogFile(filepath)
expect(logs.length).to.eql(7)
expect(logs.length).to.eql(6)
expectAllLevels(logs)
})

Expand All @@ -254,6 +255,21 @@ describe('Logger tests', function () {
})
})

describe('boot Tymly with an alternative logger service', () => {
it('boot tymly', async () => {
process.env.LOGGER = 'trace'
bootedServices = await tymly.boot({
pluginPaths: [
path.resolve(__dirname, './fixtures/plugins/logger-plugin'),
path.resolve(__dirname, './fixtures/plugins/alternative-logger-plugin')
]
})
expect(bootedServices.logger.shouldLog).to.eql(true)
expect(bootedServices.logger.level).to.eql('trace')
expect(bootedServices.logger.logs.length).to.eql(6)
})
})

after('reset logging environment variables', () => {
process.env.LOGGER = null
process.env.LOGGER_OUTPUT_DIR_PATH = null
Expand Down