Enhancing the `logs-*-*` index template with a default ingest pipeline that is first doing a pre-flight check if the `message` field might be JSON and then uses the JSON processor to decode the JSON and merge it top-level with the document.

See also this prototype: https://gist.github.com/felixbarny/a9a2f6243153d5508643fd95ac968a88#file-routing-yml-L114-L174

Open questions and things to consider
* How do users opt-out of default JSON parsing? They could override the index template. Maybe that's good enough.
* Similarly to the logs@custom component template, should we call out to a custom index pipeline? Align with naming in Fleet.
x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/template/IndexTemplateRegistry.java
JsonXContent.jsonXContent.createParser(XContentParserConfiguration.EMPTY, indexTemplateConfig.loadBytes())
                );
            } catch (IOException e) {
                throw new AssertionError(e);
            }
        }));
    }
    private void addIngestPipelinesIfMissing(ClusterState state) {
        for (IngestPipelineConfig requiredPipeline : getIngestPipelines()) {
            final AtomicBoolean creationCheck = pipelineCreationsInProgress.computeIfAbsent(
                requiredPipeline.getId(),
                key -> new AtomicBoolean(false)
            );
            if (creationCheck.compareAndSet(false, true)) {
                PipelineConfiguration existingPipeline = findInstalledPipeline(state, requiredPipeline.getId());
                if (existingPipeline != null) {
                    Integer existingPipelineVersion = existingPipeline.getVersion();
                    if (existingPipelineVersion == null || existingPipelineVersion < requiredPipeline.getVersion()) {
                        logger.info(
                            "upgrading ingest pipeline [{}] for [{}] from version [{}] to version [{}]",
                            requiredPipeline.getId(),
                            getOrigin(),
                            existingPipelineVersion,
                            requiredPipeline.getVersion()
                        );
                        putIngestPipeline(requiredPipeline, creationCheck);
                    } else {
                        logger.debug(
                            "not adding ingest pipeline [{}] for [{}], because it already exists",
                            requiredPipeline.getId(),