fluentd-node
Fluent Forward Protocol implementation for Node.js.
Built upon fluent-logger-node.
Install
$ npm install fluentd-node
Client
fluentd-node
provides a fully functional client that implements the Forward protocol. It supports reconnection, acknowledgements, timeouts, event retries, and more, and exposes its functionality through simple typed Promise interface.
For a full list of the client options and methods, see the FluentClient docs
Prerequisites
The fluent daemon should be listening in forward mode.
A simple starting configuration is the following:
<source>
@type forward
port 24224
</source>
<match **.*>
@type stdout
</match>
See the FluentD docs for more info.
Sending an event record to Fluentd
const FluentClient = require("fluentd-node").FluentClient;
const logger = new FluentClient("tag_prefix", {
socket: {
host: "localhost",
port: 24224,
timeout: 3000,
}
});
The emit method has following signature
emit(data: Record<string, any>): Promise<void>;
emit(data: Record<string, any>, timestamp: number | Date | EventTime): Promise<void>;
emit(label: string, data: Record<string, any>): Promise<void>;
emit(label: string, data: Record<string, any>, timestamp: number | Date | EventTime): Promise<void>;
The returned Promise is resolved once the event is written to the socket, or rejected if an error occurs.
Fluentd acknowledgements
Fluentd provides explicit support for acknowledgements, which allow the client to be sure that the event reached its destination.
Enabling acknowledgements means that the promise returned by emit
will be resolved once the client receives an explicit acknowledgement from the server.
const FluentClient = require("fluentd-node").FluentClient;
const logger = new FluentClient("tag_prefix", {
ack: {}
});
Event modes
Fluentd provides multiple message modes, Message
, Forward
, PackedForward
(default), CompressedPackedForward
. The Fluent client supports all of them.
const FluentClient = require("fluentd-node").FluentClient;
const logger = new FluentClient("tag_prefix", {
eventMode: "Message" | "Forward" | "PackedForward" | "CompressedPackedForward"
});
Disable automatic reconnect
const logger = new FluentClient("tag_prefix", {
socket: {
host: "localhost",
port: 24224,
timeout: 3000,
disableReconnect: true
}
});
logger.connect();
Shared key authentication
Logger configuration:
const logger = new FluentClient("tag_prefix", {
socket: {
host: "localhost",
port: 24224,
timeout: 3000,
}
security: {
clientHostname: "client.localdomain",
sharedKey: "secure_communication_is_awesome"
}
});
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 the Fluentd examples.
TLS/SSL encryption
Logger configuration:
const logger = new FluentClient("tag_prefix", {
socket: {
host: "localhost",
port: 24224,
timeout: 3000,
}
security: {
clientHostname: "client.localdomain",
sharedKey: "secure_communication_is_awesome"
}
tls: {
ca: fs.readFileSync("/path/to/ca_cert.pem")
}
});
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 the fluent-ca-generate
command since Fluentd 1.1.0.
See also How to enable TLS/SSL encryption.
Mutual TLS Authentication
Logger configuration:
const logger = new FluentClient("tag_prefix", {
socket: {
host: "localhost",
port: 24224,
timeout: 3000,
}
security: {
clientHostname: "client.localdomain",
sharedKey: "secure_communication_is_awesome"
}
tls: {
ca: fs.readFileSync("/path/to/ca_cert.pem"),
cert: fs.readFileSync("/path/to/client-cert.pem"),
key: fs.readFileSync("/path/to/client-key.pem"),
passphrase: "very-secret"
}
});
Server configuration:
<source>
@type forward
port 24224
<transport tls>
ca_path /path/to/ca-cert.pem
cert_path /path/to/server-cert.pem
private_key_path /path/to/server-key.pem
private_key_passphrase very_secret_passphrase
client_cert_auth true
</transport>
<security>
self_hostname input.testing.local
shared_key secure_communication_is_awesome
</security>
</source>
<match dummy.*>
@type stdout
</match>
EventTime support
We can also specify EventTime as timestamp. See the EventTime docs
const FluentClient = require("fluentd-node").FluentClient;
const EventTime = require("fluentd-node").EventTime;
const eventTime = new EventTime(1489547207, 745003500);
const logger = new FluentClient("tag_prefix", {
socket: {
host: "localhost",
port: 24224,
timeout: 3000,
}
});
logger.emit("tag", { message: "This is a message" }, eventTime);
Handling errors
The Fluent client will manage errors internally, and reject promises on errors. If you"d like to access the non-user facing internal errors, you can do so by passing errorHandler
const FluentClient = require("fluentd-node").FluentClient;
const logger = new FluentClient("tag_prefix", {
onSocketError: (err: Error) => {
console.error("error!", err)
}
});
Retrying events
Sometimes it makes sense to resubmit events if their initial submission failed. You can do this by specifying eventRetry
.
const FluentClient = require("fluentd-node").FluentClient;
const logger = new FluentClient("tag_prefix", {
eventRetry: {}
});
Server
fluentd-node
includes a fully functional forward server which can be used as a downstream Fluent sink.
const FluentServer = require("fluentd-node").FluentServer;
const server = new FluentServer({ listenOptions: { port: 24224 }});
await server.listen();
Fluentd config:
<match pattern>
@type forward
send_timeout 60s
recover_wait 10s
hard_timeout 60s
<server>
name fluent_node
host 127.0.0.1
port 24224
weight 60
</server>
<secondary>
@type file
path /var/log/fluent/forward-failed
</secondary>
</match>
See the FluentD docs for more info.
For a full list of the server options and methods, see the FluentServer docs
License
Apache License, Version 2.0.
About NodeJS versions
This package is compatible with NodeJS versions >= 12.