exec
The out_exec
TimeSliced Output plugin passes events to an external program. The program receives the path to a file containing the incoming events as its last argument. The file format is tab-separated values (TSV) by default.
It is included in Fluentd's core.
Example Configuration
<match pattern>
@type exec
command cmd arg arg
<format>
@type tsv
keys k1,k2,k3
</format>
<inject>
tag_key k1
time_key k2
time_format %Y-%m-%d %H:%M:%S
</inject>
</match>
Please see the Configuration File article for the basic structure and syntax of the configuration file.
Example: Running FizzBuzz Against Data Stream
This example illustrates how to run FizzBuzz with out_exec
.
We assume that the input file is specified by the last argument in the command line (ARGV[-1]
). The following script fizzbuzz.py
runs FizzBuzz against the new-line delimited sequence of natural numbers (1, 2, 3...) and writes the output to foobar.out
:
#!/usr/bin/env python
import sys
input = file(sys.argv[-1])
output = file("foobar.out", "a")
for line in input:
fizzbuzz = int(line.split("\t")[0])
s = ''
if fizzbuzz%3 == 0:
s += 'fizz'
if fizzbuzz%5 == 0:
s += 'buzz'
if len(s) > 0:
output.write(s+"\n")
else:
output.write(str(fizzbuzz)+"\n")
output.close
Note that this program is written in Python. For out_exec
(as well as out_exec_filter
and in_exec
), the program can be written in any language, not just Ruby.
Then, configure Fluentd as follows:
<source>
@type forward
</source>
<match fizzbuzz>
@type exec
command python /path/to/fizzbuzz.py
<buffer>
@type file
path /path/to/buffer_path
flush_interval 5s # for debugging/checking
</buffer>
<format>
@type tsv
keys fizzbuzz
</format>
</match>
The @type tsv
and keys fizzbuzz
in <format>
tells Fluentd to extract the fizzbuzz
field and output it as TSV. This simple example has a single key, but you can of course extract multiple fields and use format json
to output newline-delimited JSON.
The intermediate TSV is at /path/to/buffer_path
, and the command python /path/to/fizzbuzz.py /path/to/buffer_path
is run. This is why in fizzbuzz.py
, it is reading the file at sys.argv[-1]
.
If you start Fluentd and run this command:
$ for i in `seq 15`; do echo "{\"fizzbuzz\":$i}" | fluent-cat fizzbuzz; done
Then, after 5 seconds, you get a file named foobar.out
:
$ cat foobar.out
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
Supported Modes
Asynchronous
See Output Plugin Overview for more details.
Plugin Helpers
Parameters
@type
@type
The value must be exec
.
command
command
type
default
version
string
Nothing
0.14.0
The command (program) to execute. The exec
plugin passes the path of flushed buffer chunk as the last argument.
If you set command
parameter like this:
command cmd arg arg
The actual command execution is:
cmd arg arg /path/to/file
If cmd
does not exist in PATH, you need to specify the absolute path, e.g. /path/to/cmd
.
command_timeout
command_timeout
type
default
version
time
270
0.14.9
Command (program) execution timeout.
<format>
Section
<format>
SectionSee Format Section for more details.
@type
@type
type
default
version
string
tsv
0.14.9
The format used to map the incoming events to the program input.
Overwrites the default value in this plugin.
<inject>
Section
<inject>
SectionSee Inject Section for more details.
time_type
time_type
type
default
version
string
string
0.14.9
Overwrites the default value in this plugin.
localtime
localtime
type
default
version
bool
false
0.14.9
Overwrites the default value in this plugin.
<buffer>
Section
<buffer>
SectionSee Buffer Section for more details.
delayed_commit_timeout
delayed_commit_timeout
type
default
version
time
300
0.14.9
Overwrites the default value in this plugin.
If this article is incorrect or outdated, or omits critical information, please let us know. Fluentd is an open-source project under Cloud Native Computing Foundation (CNCF). All components are available under the Apache 2 License.
Last updated
Was this helpful?