fluent-logger for Node.js
fluent-logger implementation for Node.js inspired by fluent-logger-python.
Install
$ npm install fluent-logger
Prerequistes
Fluent daemon should listen on TCP port.
Simple configuration is following:
<source>
@type forward
port 24224
</source>
<match **.*>
@type stdout
</match>
Usage
Send an event record to Fluentd
Singleton style
var logger = require('fluent-logger')
logger.configure('tag_prefix', {
host: 'localhost',
port: 24224,
timeout: 3.0,
reconnectInterval: 600000
});
logger.emit('label', {record: 'this is a log'});
Instance style
var logger = require('fluent-logger').createFluentSender('tag_prefix', {
host: 'localhost',
port: 24224,
timeout: 3.0,
reconnectInterval: 600000
});
The emit method has following signature
.emit([label string], <record object>, [timestamp number/date], [callback function])
Where only the record
argument is required. If the label is set it will be
appended to the configured tag.
Shared key authentication
Logger configuration:
var logger = require('fluent-logger').createFluentSender('dummy', {
host: 'localhost',
port: 24224,
timeout: 3.0,
reconnectInterval: 600000,
security: {
clientHostname: "client.localdomain",
sharedKey: "secure_communication_is_awesome"
}
});
logger.emit('debug', { message: 'This is a message' });
Server configuration:
<source>
@type forward
port 24224
<security>
self_hostname input.testing.local
shared_key secure_communication_is_awesome
</security>
</source>
<match dummy.*>
@type stdout
</match>
See also Fluentd examples.
TLS/SSL encryption
Logger configuration:
var logger = require('fluent-logger').createFluentSender('dummy', {
host: 'localhost',
port: 24224,
timeout: 3.0,
reconnectInterval: 600000,
security: {
clientHostname: "client.localdomain",
sharedKey: "secure_communication_is_awesome"
},
tls: true,
tlsOptions: {
ca: fs.readFileSync('/path/to/ca_cert.pem')
}
});
logger.emit('debug', { message: 'This is a message' });
Server configuration:
<source>
@type forward
port 24224
<transport tls>
ca_cert_path /path/to/ca_cert.pem
ca_private_key_path /path/to/ca_key.pem
ca_private_key_passphrase very_secret_passphrase
</transport>
<security>
self_hostname input.testing.local
shared_key secure_communication_is_awesome
</security>
</source>
<match dummy.*>
@type stdout
</match>
FYI: You can generate certificates using fluent-ca-generate command since Fluentd 1.1.0.
See also How to enable TLS/SSL encryption.
EventTime support
We can also specify EventTime as timestamp.
var FluentLogger = require('fluent-logger');
var EventTime = FluentLogger.EventTime;
var logger = FluentLogger.createFluentSender('tag_prefix', {
var eventTime = new EventTime(1489547207, 745003500);
logger.emit('tag', { message: 'This is a message' }, eventTime);
Events
var logger = require('fluent-logger').createFluentSender('tag_prefix', {
host: 'localhost',
port: 24224,
timeout: 3.0,
reconnectInterval: 600000
});
logger.on('error', (error) => {
console.log(error);
});
logger.on('connect', () => {
console.log('connected!');
});
Logging Library Support
log4js
Use log4js-fluent-appender.
winston
Before using winston support, you should install it IN YOUR APPLICATION.
var winston = require('winston');
var config = {
host: 'localhost',
port: 24224,
timeout: 3.0,
requireAckResponse: true
};
var fluentTransport = require('fluent-logger').support.winstonTransport();
var logger = winston.createLogger({
transports: [new fluentTransport('mytag', config), new (winston.transports.Console)()]
});
logger.on('logging', (transport, level, message, meta) => {
if (meta.end && transport.sender && transport.sender.end) {
transport.sender.end();
}
});
logger.log('info', 'this log record is sent to fluent daemon');
logger.info('this log record is sent to fluent daemon');
logger.info('end of log message', { end: true });
stream
Several libraries use stream as output.
'use strict';
const Console = require('console').Console;
var sender = require('fluent-logger').createFluentSender('tag_prefix', {
host: 'localhost',
port: 24224,
timeout: 3.0,
reconnectInterval: 600000
});
var logger = new Console(sender.toStream('stdout'), sender.toStream('stderr'));
logger.log('this log record is sent to fluent daemon');
setTimeout(()=> sender.end(), 5000);
Options
tag_prefix
The tag prefix string.
You can specify null
when you use FluentSender
directly.
In this case, you must specify label
when you call emit
.
host
The hostname. Default value = 'localhost'.
See socket.connect
port
The port to listen to. Default value = 24224.
See socket.connect
path
The path to your Unix Domain Socket.
If you set path
then fluent-logger ignores host
and port
.
See socket.connect
timeout
Set the socket to timetout after timeout
milliseconds of inactivity
on the socket.
See socket.setTimeout
reconnectInterval
Set the reconnect interval in milliseconds.
If error occurs then reconnect after this interval.
requireAckResponse
Change the protocol to at-least-once. The logger waits the ack from destination.
ackResponseTimeout
This option is used when requireAckResponse is true. The default is 190. This default value is based on popular tcp_syn_retries
.
eventMode
Set Event Modes. This logger supports Message
, PackedForward
and CompressedPackedForward
.
Default is Message
.
NOTE: We will change default to PackedForward
and drop Message
in next major release.
flushInterval
Set flush interval in milliseconds. This option has no effect in Message mode.
The logger stores emitted events in buffer and flush events for each interval.
Default 100
.
security.clientHostname
Set hostname of this logger. Use this value for hostname based authentication.
security.sharedKey
Shared key between client and server.
security.username
Set username for user based authentication. Default values is empty string.
security.password
Set password for user based authentication. Default values is empty string.
tls
Enable TLS for socket.
tlsOptions
Options to pass to tls.connect when tls is true.
For more details, see following documents
internalLogger
Set internal logger object for FluentLogger. Use console
by default.
This logger requires info
and error
method.
License
Apache License, Version 2.0.
About NodeJS versions
This package is compatible with NodeJS versions > 4.