@logone/core
This library is logger that supports structured logging by generating a single line of JSON format for your specified lifecycle.
Inspired by logone-go.
Installation
npm install @logone/core @logone/adapter-node
Usage
The simple example
import { createLogone } from '@logone/core'
import { createAdapter } from '@logone/adapter-node'
const logone = createLogone(createAdapter())
const main = () => {
const { logger, finish } = logone.start('example')
logger.info('hello world')
finish()
}
The express example
This is internal implementation of @logone/express.
import express from 'express'
import { createLogone } from '@logone/core'
import { createAdapter } from '@logone/adapter-node'
const app = express()
app.use((req, res, next) => {
const logone = createLogone(createAdapter())
const { logger, finish } = logone.start('request', {
method: req.method,
url: req.url
})
req.logger = logger
res.on('close', () => {
setTimeout(() => {
finish()
}, 0)
})
next()
})
app.use((error, req, res) => {
req.logger.error(error)
res.send(500)
})
app.get('/example', (req, res) => {
req.logger.info('example')
res.send(200)
})
Filter by log level
can narrow down to only those severities with a specified log level or higher.
const logone = createLogone(createAdapter(), {
logLevel: 'INFO'
})
const main = () => {
const { logger, finish } = logone.start('example')
logger.debug('no output')
logger.info('output')
logger.error('output')
finish()
}
Severity
- debug
- info
- warning
- error
- critical
Streaming Support
The library now supports real-time log streaming for scenarios like Server-Sent Events (SSE).
Using StreamingAdapter
import { createLogone, StreamingAdapter } from '@logone/core'
class SSEAdapter implements StreamingAdapter {
constructor(private response: Response) {}
onEntry(entry: LogRecord, config: LogoneConfig) {
const data = JSON.stringify({ type: 'log', entry })
this.response.write(`data: ${data}\n\n`)
}
output(record: LoggerRecord) {
const data = JSON.stringify({ type: 'summary', record })
this.response.write(`data: ${data}\n\n`)
this.response.end()
}
}
app.get('/logs/stream', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream')
res.setHeader('Cache-Control', 'no-cache')
const adapter = new SSEAdapter(res)
const logone = createLogone(adapter, { logLevel: 'INFO' })
const { logger, finish } = logone.start('sse-request')
req.on('close', () => finish())
})
Using Subscribe/Unsubscribe Pattern
import { Logone } from '@logone/core'
const logone = new Logone(adapter)
const unsubscribe = logone.subscribe((entry) => {
console.log('New log entry:', entry)
})
const { logger, finish } = logone.start('example')
logger.info('This will trigger the subscriber')
unsubscribe()
finish()
Multiple Subscribers
const subscribers = new Set()
const unsub1 = logone.subscribe(entry => console.log('Sub1:', entry))
const unsub2 = logone.subscribe(entry => console.log('Sub2:', entry))
unsub1()
unsub2()