diff --git a/lib/fluent/plugin/out_file.rb b/lib/fluent/plugin/out_file.rb index 7de4b90979..fffdb4e190 100644 --- a/lib/fluent/plugin/out_file.rb +++ b/lib/fluent/plugin/out_file.rb @@ -172,6 +172,15 @@ def configure(conf) log.warn "symlink_path is unavailable on Windows platform. disabled." @symlink_path = nil else + #add check if symlink_path has a tag placeholder. + placeholder_validators(:symlink_path, @symlink_path).reject{|v| v.type == :time }.each do |v| + begin + v.validate! + end + rescue Fluent::ConfigError => e + log.warn "#{e}. This means multiple chunks are competing for a single symlink_path, so some logs may not be taken from the symlink." + end + @buffer.extend SymlinkBufferMixin @buffer.symlink_path = @symlink_path @buffer.output_plugin_for_symlink = self diff --git a/test/plugin/test_out_file.rb b/test/plugin/test_out_file.rb index 5727bc1e69..d3d72569d1 100644 --- a/test/plugin/test_out_file.rb +++ b/test/plugin/test_out_file.rb @@ -130,7 +130,7 @@ def create_driver(conf = CONFIG, opts = {}) 'path' => "#{TMP_DIR}/${tag}/${type}/conf_test.%Y%m%d.%H%M.log", 'add_path_suffix' => 'false', 'append' => "true", - 'symlink_path' => "#{TMP_DIR}/conf_test.current.log", + 'symlink_path' => "#{TMP_DIR}/${tag}/conf_test.current.log", 'compress' => 'gzip', 'recompress' => 'true', }, [ @@ -183,6 +183,25 @@ def create_driver(conf = CONFIG, opts = {}) Fluent::Test::Driver::Output.new(Fluent::Plugin::NullOutput).configure(conf) end end + + test 'symlink path has not tag placeholder or key placeholder' do + conf = config_element('match', '**', { + 'path' => "#{TMP_DIR}/${tag}/${key1}/${key2}/conf_test.%Y%m%d.%H%M.log", + 'symlink_path' => "#{TMP_DIR}/conf_test.current.log", + }, [ + config_element('buffer', 'time,tag,key1,key2', { + '@type' => 'file', + 'timekey' => '1d', + 'path' => "#{TMP_DIR}/buf_conf_test", + }), + ]) + assert_nothing_raised do + d = create_driver(conf) + assert do + d.logs.count { |log| log.include?("symlink_path:") } == 2 + end + end + end end sub_test_case 'fully configured output' do