copy即复制,out_copy的作用就是将日志事件复制到多个输出,这样就可以对同一份日志做不同类型的分析处理。
out_copy内置于Fluentd,无需单独安装。
- 示例配置
<match pattern>
@type copy
<store>
@type file
path /var/log/fluent/myapp1
...
</store>
<store>
...
</store>
<store>
...
</store>
</match>
这个示例将日志输出到本地文件和其他n个目的地。这些目的地由
- 参数说明
2.1 @type 插件类型,取值为copy
2.2 copy_mode
指定日志事件在
包含以下几种传递方式:
- no_copy:不产生日志拷贝,各
<store>
共享一份日志事件。这是默认的传递方式。这意味着,如果某个<store>
对日志进行了修改,其他<store>
也会继承这个修改。 - shallow:采用浅拷贝的方式在
<store>
之间传递日志事件。
复制是为了避免某个<store>
对日志的修改会影响到其他<store>
。
浅拷贝和深拷贝是对象复制的两种方式,主要是针对对象中是否存在嵌套引用对象的情况。
如果对象嵌套引用了其他对象,浅拷贝不会对引用对象进行复制,而深拷贝则会复制引用对象指向的内容。
如果<store>
中的插件要修改日志事件,但不对嵌套的引用对象进行修改,则可以使用shallow拷贝;
如果<store>
需要修改嵌套的引用对象,则需要使用下边两种深拷贝方式。
- deep:采用深拷贝的方式在
<store>
插件中传递日志事件。其内部使用msgpack-ruby进行数据拷贝。 - marshal:如果msgpack-ruby无法进行数据深拷贝,则可以尝试使用marshal这种方式。需要注意的是,marshal速度很慢。
2.3 <store>
指定存储目的地。其使用方法和
out_copy插件至少要配置一个<store>
。
<store>
支持一个可选的参数:ignore_error。
在使用多个<store>
的场景下,若某个<store>
抛出了错误,会影响到其他<store>
。
比如:
<match app.**>
@type copy
<store>
@type plugin1
</store>
<store>
@type plugin2
</store>
</match>
如果plugin1发生错误,plugin2便不会被执行。
可在<store>
中启用ignore_error,以避免此种情况的发生。
<match app.**>
@type copy
<store ignore_error>
@type plugin1
</store>
<store>
@type plugin2
</store>
</match>