kestra-io/kestra · critical · KestraRuntimeException

No log store configured through the application property '%s

Error message

No log store configured through the application property '%s' (nor a fallback '%s'). Supported types are: %s

What it means

Thrown by KestraBeansFactory when no log data-store backend is configured. It reads kestra.logs.type, falling back to kestra.repository.type; if both are null it cannot construct a LogDataStoreInterface and throws KestraRuntimeException listing the config property names and the supported type ids. This is a bootstrap/configuration error that prevents application startup.

Source

Thrown at core/src/main/java/io/kestra/core/contexts/KestraBeansFactory.java:109

        final ApplicationContext applicationContext) {
        return new LogDataStoreInterfaceFactory(pluginRegistry, validator, applicationContext);
    }

    @Requires(property = "kestra.server-type", notEquals = "WORKER")
    @Singleton
    public LogDataStoreInterface logDataStore(final LogDataStoreInterfaceFactory logDataStoreInterfaceFactory) {
        String pluginId = getLogDataStorePluginId(logDataStoreInterfaceFactory);
        return logDataStoreInterfaceFactory.make(pluginId, logsConfig.getLogConfig(pluginId));
    }

    /**
     * Resolves the configured log data store type, falling back to {@code kestra.repository.type} so
     * that existing installs (no {@code kestra.logs.type}) keep storing logs in the main database.
     */
    public String getLogDataStorePluginId(LogDataStoreInterfaceFactory logDataStoreInterfaceFactory) {
        String type = logsConfig.type().orElse(repositoryConfiguration.type());
        if (type == null) {
            throw new KestraRuntimeException(
                String.format(
                    "No log store configured through the application property '%s' (nor a fallback '%s'). Supported types are: %s",
                    KESTRA_LOGS_TYPE_CONFIG, "kestra.repository.type", logDataStoreInterfaceFactory.getLoggableTypeIds()
                )
            );
        }
        // The in-memory backend is H2 with an in-memory datasource.
        return "memory".equalsIgnoreCase(type) ? "h2" : type;
    }

    @ConfigurationProperties("kestra")
    public record StorageConfig(
        @Nullable
        @MapFormat(keyFormat = StringConvention.CAMEL_CASE, transformation = MapFormat.MapTransformation.NESTED) Map<String, Object> storage) {

        /**
         * Returns the configuration for the configured storage.
         *

View on GitHub (pinned to 823fada927)

Solutions

  1. Set kestra.repository.type to a supported value (e.g. h2, postgres, mysql, elasticsearch) in application.yml.
  2. Or set kestra.logs.type explicitly to decouple logs from the main repository.
  3. Use the 'memory' alias for local H2/testing (it maps to the h2 backend).
  4. Cross-check the value against getLoggableTypeIds() in the exception message to avoid typos.

Example fix

# before (no storage type)
# kestra:
#   repository:
#     type:
# after
kestra:
  repository:
    type: postgres
Defensive patterns

Strategy: validation

Validate before calling

String type = logsConfig.type().orElse(repositoryConfiguration.type());
if (type == null) {
  throw new IllegalStateException('Configure kestra.repository.type or kestra.logs.type before startup');
}

Prevention

When it happens

Trigger: getLogDataStorePluginId reads logsConfig.type() = empty and repositoryConfiguration.type() = null; the null branch throws KestraRuntimeException formatted with KESTRA_LOGS_TYPE_CONFIG, 'kestra.repository.type', and the factory's getLoggableTypeIds().

Common situations: Fresh install with incomplete application.yml (no repository type set), a config migration that removed kestra.repository.type without adding kestra.logs.type, env-var override blanking the value, or a profile that omits storage config.

Related errors


AI-assisted analysis of kestra-io/kestra@823fada927 (2026-08-14). Data as JSON: /api/errors/1a22b11aef4fc5f4. Report an issue: GitHub.