Journalctl
This is a module for accessing systemd journal.
API
You can find the documentation page here
Require the module and create a new instance:
const Journalctl = require('@bryopsida/journalctl')
const journalctl = new Journalctl([opts])
The optional object opts
can have the following properties:
identifier
: Just output logs of the given syslog identifier (cf. man journalctl, option '-t')unit
: Just output logs originated from the given unit file (cf. man journalctl, option '-u')filter
: An array of matches to filter by (cf. man journalctl, matches)all
: Show all fields in full, even if they include unprintable characters or are very long. (cf. man journalctl, option '-a')lines
: Show the most recent journal events and limit the number of events shown (cf. man journalctl, option '-n')since
: Start showing entries on or newer than the specified date (cf. man journalctl, option '-S')
Event: 'json-message'
journalctl.on('json-message', event => {})
Is fired on every decoded json message.
Event: 'raw-message'
journalctl.on('raw-message', buffer => {})
Is fired on every data event from the journalctl sub process.
Event: 'error'
journalctl.on('error', err => {})
Is fired whenever the journalctl sub process emits an error or the class encounters an error condition.
Event: 'close'
journalctl.on('close', () => {})
Is fired whenever the journalctl sub process exits with status code 0.
Method: stop
journalctl.stop([callback])
Method: getStdout
journalctl.getStdout().pipe(process.stdout)
Returns the stdout stream from the journalctl sub process.
Method: getStderr
journalctl.getStderr().pipe(process.stderr)
Returns the stderr stream from the journalctl sub process.
Examples
Decode and tail all logs
const Journalctl = require('@bryopsida/journalctl')
const logger = new Journalctl().on('json-message', e => {
console.log(e)
})
process.on('SIGINT', () => {
logger.stop(() => {
process.exit()
})
})
Pipe raw output
const Journalctl = require('@bryopsida/journalctl')
const j = new Journalctl({
disableJSONMessages: true,
emitRawMessages: false
})
j.getStdout().pipe(process.stdout)
j.getStderr().pipe(process.stderr)
process.on('SIGINT', () => {
j.stop(() => {
process.exit()
})
})
Process raw events
const Journalctl = require('@bryopsida/journalctl')
const j = new Journalctl({
disableJSONMessages: true,
emitRawMessages: true
}).on('raw-message', buffer => {
process.stdout.write(buffer)
})
process.on('SIGINT', () => {
j.stop(() => {
process.exit()
})
})
Use command prefix
const Journalctl = require('@bryopsida/journalctl')
const j = new Journalctl({
commandPrefix: ['vagrant', 'ssh', '-c'],
quoteArgs: true,
spawnOptions: {
shell: true
}
}).on('json-message', e => {
console.log(e)
})
process.on('SIGINT', () => {
j.stop(() => {
process.exit()
})
})
Test Environment
If you need a test environment with journald running, and you have vagrant installed, you can spin one up with vagrant up
and remove it with vagrant destroy
once you are finished.
You can access the environment by using vagrant ssh
. This project is available at /vagrant
inside the vagrant box.