fluent/fluentd · error · Fluent::ConfigError

Parameter '# : # ' doesn't have timestamp placeholders for…

Error message

Parameter '#{name}: #{string}' doesn't have timestamp placeholders for timekey #{timekey.to_i}

What it means

A path/format-style parameter contains no strftime time directives at all, while the buffer chunks records by time (`time` chunk key with a `timekey`). If all time-keyed chunks expand to the same literal value, chunks overwrite each other or become indistinguishable, so the placeholder validator (`validate_time!`, `!sec && timekey`) rejects it at configure time.

Solutions

  1. Add time directives that vary at least as fast as the timekey, e.g. `path /logs/app.%Y%m%d%H.log`
  2. Or remove `time` from the chunk keys if per-time rotation is not wanted
  3. Match directive granularity to timekey: minute key → include %M, hour key → include %H

Example fix

# before
<buffer time>
  timekey 1h
</buffer>
path /logs/app.log

# after
<buffer time>
  timekey 1h
</buffer>
path /logs/app.%Y%m%d%H.log
Defensive patterns

Strategy: validation

Validate before calling

fluentd --dry-run -c /etc/fluent/fluent.conf
# lint: if buffer chunk keys include 'time', the path must contain a % time directive

Prevention

When it happens

Trigger: `path /logs/app.log` (no `%Y`/`%m`/`%H`...) together with `<buffer time>` and `timekey 1h` in a file/s3 output; any parameter passed through `placeholder_validate!(name, str)` with time chunking enabled but zero time placeholders in the string.

Common situations: Adding `time` to chunk keys for rotation but forgetting to add time patterns to `path`; switching `path` to a fixed filename during debugging and leaving the time chunk key in place.

Related errors


AI-assisted analysis of fluent/fluentd@dd45c6e18d (2026-08-21). Data as JSON: /api/errors/88f3d68673412788. Report an issue: GitHub.

Appendix: source

Thrown at lib/fluent/plugin/output.rb:733

        def keys?
          @type == :keys
        end

        def validate!
          case @type
          when :time then validate_time!
          when :tag  then validate_tag!
          when :keys then validate_keys!
          end
        end

        def validate_time!
          sec = @argument[:sec]
          title = @argument[:title]
          example = @argument[:example]
          timekey = @argument[:timekey]
          if !sec && timekey
            raise Fluent::ConfigError, "Parameter '#{name}: #{string}' doesn't have timestamp placeholders for timekey #{timekey.to_i}"
          end
          if sec && !timekey
            raise Fluent::ConfigError, "Parameter '#{name}: #{string}' has timestamp placeholders, but chunk key 'time' is not configured"
          end
          if sec && timekey && timekey < sec
            raise Fluent::ConfigError, "Parameter '#{name}: #{string}' doesn't have timestamp placeholder for #{title}('#{example}') for timekey #{timekey.to_i}"
          end
        end

        def validate_tag!
          parts = @argument[:parts]
          tagkey = @argument[:tagkey]
          if tagkey && parts.empty?
            raise Fluent::ConfigError, "Parameter '#{name}: #{string}' doesn't have tag placeholder"
          end
          if !tagkey && !parts.empty?
            raise Fluent::ConfigError, "Parameter '#{name}: #{string}' has tag placeholders, but chunk key 'tag' is not configured"
          end

View on GitHub (pinned to dd45c6e18d)