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.
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:
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:
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:
Then, after 5 seconds, you get a file named 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