From 3848713182c0cdb1e0e78cee9233a278d69cf3ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Jeanneret?= <cjeanner@redhat.com>
Date: Fri, 18 May 2018 10:18:43 +0200
Subject: [PATCH] Correct log location in container environment for Fluentd

Since we moved services in containers, their logs aren't in the old location, but
in /var/log/containers/<service>. This patch fixes the generated Hiera hash used
by Fluentd for its configuration

Regarding Designate config service: some of the yaml doesn't use at all the
`service_config_settings` parameter - they will need to be updated accordingly
once it's supported

Co-Authored-By: Thomas Herve <therve@redhat.com>, Steven Hardy <shardy@redhat.com>
Change-Id: I1bc0930de4053dc1c34b50477e82d9ccdab7ae2e
Closes-Bug: 1769051
Related-Bug: 1674715
---
 docker/services/ceilometer-agent-central.yaml | 14 ++++++-
 docker/services/ceilometer-agent-ipmi.yaml    | 14 ++++++-
 .../ceilometer-agent-notification.yaml        | 14 ++++++-
 docker/services/cinder-api.yaml               | 14 ++++++-
 docker/services/cinder-scheduler.yaml         | 14 ++++++-
 docker/services/cinder-volume.yaml            | 14 ++++++-
 docker/services/designate-producer.yaml       |  5 +++
 docker/services/designate-sink.yaml           |  5 +++
 docker/services/designate-worker.yaml         |  5 +++
 docker/services/ec2-api.yaml                  | 14 ++++++-
 docker/services/glance-api.yaml               | 14 ++++++-
 docker/services/gnocchi-api.yaml              | 14 ++++++-
 docker/services/heat-api-cfn.yaml             | 14 ++++++-
 docker/services/heat-api.yaml                 | 14 ++++++-
 docker/services/heat-engine.yaml              | 14 ++++++-
 docker/services/keystone.yaml                 | 14 ++++++-
 docker/services/neutron-api.yaml              | 14 ++++++-
 docker/services/neutron-dhcp.yaml             | 14 ++++++-
 docker/services/neutron-l3.yaml               | 14 ++++++-
 docker/services/neutron-metadata.yaml         | 14 ++++++-
 docker/services/neutron-ovs-agent.yaml        | 14 ++++++-
 docker/services/nova-api.yaml                 | 14 ++++++-
 docker/services/nova-compute.yaml             | 14 ++++++-
 docker/services/nova-conductor.yaml           | 14 ++++++-
 docker/services/nova-consoleauth.yaml         | 14 ++++++-
 docker/services/nova-metadata.yaml            | 14 ++++++-
 docker/services/nova-placement.yaml           | 14 ++++++-
 docker/services/nova-scheduler.yaml           | 14 ++++++-
 docker/services/nova-vnc-proxy.yaml           | 14 ++++++-
 docker/services/octavia-api.yaml              | 14 ++++++-
 docker/services/octavia-health-manager.yaml   | 14 ++++++-
 docker/services/octavia-housekeeping.yaml     | 14 ++++++-
 docker/services/octavia-worker.yaml           | 14 ++++++-
 docker/services/ovn-metadata.yaml             |  5 +++
 docker/services/sahara-api.yaml               | 14 ++++++-
 docker/services/sahara-engine.yaml            | 14 ++++++-
 docker/services/tripleo-ui.yaml               |  5 +++
 tools/yaml-validate.py                        | 41 +++++++++++++++++++
 38 files changed, 482 insertions(+), 32 deletions(-)

diff --git a/docker/services/ceilometer-agent-central.yaml b/docker/services/ceilometer-agent-central.yaml
index 37ec60f6e3..407793f691 100644
--- a/docker/services/ceilometer-agent-central.yaml
+++ b/docker/services/ceilometer-agent-central.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerCeilometerConfigImage:
     description: The container image to use for the ceilometer config_volume
     type: string
+  CeilometerAgentCentralLoggingSource:
+    type: json
+    default:
+      tag: openstack.ceilometer.agent.central
+      path: /var/log/containers/ceilometer/central.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -64,7 +69,14 @@ outputs:
       config_settings: {get_attr: [CeilometerAgentCentralBase, role_data, config_settings]}
       logging_source: {get_attr: [CeilometerAgentCentralBase, role_data, logging_source]}
       logging_groups: {get_attr: [CeilometerAgentCentralBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [CeilometerAgentCentralBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [CeilometerAgentCentralBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_ceilometer_agent_central:
+                - ceilometer
+              tripleo_fluentd_sources_ceilometer_agent_central:
+                - {get_param: CeilometerAgentCentralLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: ceilometer
diff --git a/docker/services/ceilometer-agent-ipmi.yaml b/docker/services/ceilometer-agent-ipmi.yaml
index 414fd79027..a77de5b237 100644
--- a/docker/services/ceilometer-agent-ipmi.yaml
+++ b/docker/services/ceilometer-agent-ipmi.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerCeilometerConfigImage:
     description: The container image to use for the ceilometer config_volume
     type: string
+  CeilometerAgentIpmiLoggingSource:
+    type: json
+    default:
+      tag: openstack.ceilometer.agent.ipmi
+      path: /var/log/containers/ceilometer/ipmi.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -64,7 +69,14 @@ outputs:
       config_settings: {get_attr: [CeilometerAgentIpmiBase, role_data, config_settings]}
       logging_source: {get_attr: [CeilometerAgentIpmiBase, role_data, logging_source]}
       logging_groups: {get_attr: [CeilometerAgentIpmiBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [CeilometerAgentIpmiBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [CeilometerAgentIpmiBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_ceilometer_agent_ipmi:
+                - ceilometer
+              tripleo_fluentd_sources_ceilometer_agent_ipmi:
+                - {get_param: CeilometerAgentIpmiLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: ceilometer
diff --git a/docker/services/ceilometer-agent-notification.yaml b/docker/services/ceilometer-agent-notification.yaml
index 0e9c64b6ee..fe2fb8e48b 100644
--- a/docker/services/ceilometer-agent-notification.yaml
+++ b/docker/services/ceilometer-agent-notification.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerCeilometerConfigImage:
     description: The container image to use for the ceilometer config_volume
     type: string
+  CeilometerAgentNotificationLoggingSource:
+    type: json
+    default:
+      tag: openstack.ceilometer.agent.notification
+      path: /var/log/containers/ceilometer/agent-notification.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -64,7 +69,14 @@ outputs:
       config_settings: {get_attr: [CeilometerAgentNotificationBase, role_data, config_settings]}
       logging_source: {get_attr: [CeilometerAgentNotificationBase, role_data, logging_source]}
       logging_groups: {get_attr: [CeilometerAgentNotificationBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [CeilometerAgentNotificationBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [CeilometerAgentNotificationBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_ceilometer_agent_notification:
+                - ceilometer
+              tripleo_fluentd_sources_ceilometer_agent_notification:
+                - {get_param: CeilometerAgentNotificationLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: ceilometer
diff --git a/docker/services/cinder-api.yaml b/docker/services/cinder-api.yaml
index 3047fe9b6b..1482fac68c 100644
--- a/docker/services/cinder-api.yaml
+++ b/docker/services/cinder-api.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerCinderConfigImage:
     description: The container image to use for the cinder config_volume
     type: string
+  CinderApiLoggingSource:
+    type: json
+    default:
+      tag: openstack.cinder.api
+      path: /var/log/containers/cinder/cinder-api.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -74,7 +79,14 @@ outputs:
       config_settings: {get_attr: [CinderBase, role_data, config_settings]}
       logging_source: {get_attr: [CinderBase, role_data, logging_source]}
       logging_groups: {get_attr: [CinderBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [CinderBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [CinderBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_cinder_api:
+                - cinder
+              tripleo_fluentd_sources_cinder_api:
+                - {get_param: CinderApiLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: cinder
diff --git a/docker/services/cinder-scheduler.yaml b/docker/services/cinder-scheduler.yaml
index dc84ea8f6c..6c7d9849db 100644
--- a/docker/services/cinder-scheduler.yaml
+++ b/docker/services/cinder-scheduler.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerCinderConfigImage:
     description: The container image to use for the cinder config_volume
     type: string
+  CinderSchedulerLoggingSource:
+    type: json
+    default:
+      tag: openstack.cinder.scheduler
+      path: /var/log/containers/cinder/cinder-scheduler.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -67,7 +72,14 @@ outputs:
       config_settings: {get_attr: [CinderBase, role_data, config_settings]}
       logging_source: {get_attr: [CinderBase, role_data, logging_source]}
       logging_groups: {get_attr: [CinderBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [CinderBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [CinderBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_cinder_scheduler:
+                - cinder
+              tripleo_fluentd_sources_cinder_scheduler:
+                - {get_param: CinderSchedulerLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: cinder
diff --git a/docker/services/cinder-volume.yaml b/docker/services/cinder-volume.yaml
index feb5ddc1e8..6d9368a3e2 100644
--- a/docker/services/cinder-volume.yaml
+++ b/docker/services/cinder-volume.yaml
@@ -14,6 +14,11 @@ parameters:
     default: ['nofile=131072']
     description: ulimit for Cinder Volume Container
     type: comma_delimited_list
+  CinderVolumeLoggingSource:
+    type: json
+    default:
+      tag: openstack.cinder.volume
+      path: /var/log/containers/cinder/cinder-volume.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -98,7 +103,14 @@ outputs:
           - tripleo::profile::base::lvm::enable_udev: false
       logging_source: {get_attr: [CinderBase, role_data, logging_source]}
       logging_groups: {get_attr: [CinderBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [CinderBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [CinderBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_cinder_volume:
+                - cinder
+              tripleo_fluentd_sources_cinder_volume:
+                - {get_param: CinderVolumeLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: cinder
diff --git a/docker/services/designate-producer.yaml b/docker/services/designate-producer.yaml
index 1f050086c7..3913311dee 100644
--- a/docker/services/designate-producer.yaml
+++ b/docker/services/designate-producer.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerDesignateConfigImage:
     description: The container image to use for the designate config_volume
     type: string
+  DesignateProducerLoggingSource:
+    type: json
+    default:
+      tag: openstack.designate.producer
+      path: /var/log/containers/designate/designate-producer.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
diff --git a/docker/services/designate-sink.yaml b/docker/services/designate-sink.yaml
index a9d901062a..2eab4ea479 100644
--- a/docker/services/designate-sink.yaml
+++ b/docker/services/designate-sink.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerDesignateConfigImage:
     description: The container image to use for the designate config_volume
     type: string
+  DesignateSinkLoggingSource:
+    type: json
+    default:
+      tag: openstack.designate.sink
+      path: /var/log/containers/designate/designate-sink.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
diff --git a/docker/services/designate-worker.yaml b/docker/services/designate-worker.yaml
index d8482c3b99..3ec66bffed 100644
--- a/docker/services/designate-worker.yaml
+++ b/docker/services/designate-worker.yaml
@@ -13,6 +13,11 @@ parameters:
   DockerDesignateConfigImage:
     description: The container image to use for the designate config_volume
     type: string
+  DesignateWorkerLoggingSource:
+    type: json
+    default:
+      tag: openstack.designate.worker
+      path: /var/log/containers/designate/designate-worker.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
diff --git a/docker/services/ec2-api.yaml b/docker/services/ec2-api.yaml
index 87ec514fa3..3ce54918ec 100644
--- a/docker/services/ec2-api.yaml
+++ b/docker/services/ec2-api.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerEc2ApiConfigImage:
     description: The container image to use for the ec2_api config_volume
     type: string
+  Ec2ApiLoggingSource:
+    type: json
+    default:
+      tag: openstack.ec2.api
+      path: /var/log/containers/ec2api/ec2api.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -69,7 +74,14 @@ outputs:
       config_settings: {get_attr: [Ec2ApiPuppetBase, role_data, config_settings]}
       logging_source: {get_attr: [Ec2ApiPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [Ec2ApiPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [Ec2ApiPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [Ec2ApiPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_ec2_api:
+                - nova
+              tripleo_fluentd_sources_ec2_api:
+                - {get_param: Ec2ApiLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: ec2_api
diff --git a/docker/services/glance-api.yaml b/docker/services/glance-api.yaml
index 9cb41e7ac8..c67f423212 100644
--- a/docker/services/glance-api.yaml
+++ b/docker/services/glance-api.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerGlanceApiConfigImage:
     description: The container image to use for the glance_api config_volume
     type: string
+  GlanceApiLoggingSource:
+    type: json
+    default:
+      tag: openstack.glance.api
+      path: /var/log/containers/glance/api.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -130,7 +135,14 @@ outputs:
           - tripleo::glance::nfs_mount::edit_fstab: false
       logging_source: {get_attr: [GlanceApiPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [GlanceApiPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [GlanceApiPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [GlanceApiPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_glance_api:
+                - glance
+              tripleo_fluentd_sources_glance_api:
+                - {get_param: GlanceApiLoggingSource}
       # BEGIN DOCKER SETTINGS #
       puppet_config:
         config_volume: glance_api
diff --git a/docker/services/gnocchi-api.yaml b/docker/services/gnocchi-api.yaml
index dbec26fb62..273796be5b 100644
--- a/docker/services/gnocchi-api.yaml
+++ b/docker/services/gnocchi-api.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerGnocchiConfigImage:
     description: The container image to use for the gnocchi config_volume
     type: string
+  GnocchiApiLoggingSource:
+    type: json
+    default:
+      tag: openstack.gnocchi.api
+      path: /var/log/containers/gnocchi/app.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -85,7 +90,14 @@ outputs:
           - apache::default_vhost: false
       logging_source: {get_attr: [GnocchiApiPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [GnocchiApiPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [GnocchiApiPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [GnocchiApiPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_gnocchi_api:
+                - gnocchi
+              tripleo_fluentd_sources_gnocchi_api:
+                - {get_param: GnocchiApiLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: gnocchi
diff --git a/docker/services/heat-api-cfn.yaml b/docker/services/heat-api-cfn.yaml
index ac20f81c27..cfb690d93b 100644
--- a/docker/services/heat-api-cfn.yaml
+++ b/docker/services/heat-api-cfn.yaml
@@ -11,6 +11,11 @@ parameters:
   DockerHeatApiCfnConfigImage:
     description: The container image to use for the heat_api_cfn config_volume
     type: string
+  HeatApiCfnLoggingSource:
+    type: json
+    default:
+      tag: openstack.heat.api.cfn
+      path: /var/log/containers/heat/heat-api-cfn.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -75,7 +80,14 @@ outputs:
           - apache::default_vhost: false
       logging_source: {get_attr: [HeatBase, role_data, logging_source]}
       logging_groups: {get_attr: [HeatBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [HeatBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [HeatBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_heat_api_cfn:
+                - heat
+              tripleo_fluentd_sources_heat_api_cfn:
+                - {get_param: HeatApiCfnLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: heat_api_cfn
diff --git a/docker/services/heat-api.yaml b/docker/services/heat-api.yaml
index 86d7fe9219..33a48d2682 100644
--- a/docker/services/heat-api.yaml
+++ b/docker/services/heat-api.yaml
@@ -11,6 +11,11 @@ parameters:
   DockerHeatApiConfigImage:
     description: The container image to use for the heat_api config_volume
     type: string
+  HeatApiLoggingSource:
+    type: json
+    default:
+      tag: openstack.heat.api
+      path: /var/log/containers/heat/heat-api.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -83,7 +88,14 @@ outputs:
           - apache::default_vhost: false
       logging_source: {get_attr: [HeatBase, role_data, logging_source]}
       logging_groups: {get_attr: [HeatBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [HeatBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [HeatBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_heat_api:
+                - heat
+              tripleo_fluentd_sources_heat_api:
+                - {get_param: HeatApiLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: heat_api
diff --git a/docker/services/heat-engine.yaml b/docker/services/heat-engine.yaml
index 6f94a49d96..b330817021 100644
--- a/docker/services/heat-engine.yaml
+++ b/docker/services/heat-engine.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerHeatConfigImage:
     description: The container image to use for the heat config_volume
     type: string
+  HeatEngineLoggingSource:
+    type: json
+    default:
+      tag: openstack.heat.engine
+      path: /var/log/containers/heat/heat-engine.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -69,7 +74,14 @@ outputs:
           - apache::default_vhost: false
       logging_source: {get_attr: [HeatBase, role_data, logging_source]}
       logging_groups: {get_attr: [HeatBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [HeatBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [HeatBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_heat_engine:
+                - heat
+              tripleo_fluentd_sources_heat_engine:
+                - {get_param: HeatEngineLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: heat
diff --git a/docker/services/keystone.yaml b/docker/services/keystone.yaml
index f6a48c4b36..479eb69547 100644
--- a/docker/services/keystone.yaml
+++ b/docker/services/keystone.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerKeystoneConfigImage:
     description: The container image to use for the keystone config_volume
     type: string
+  KeystoneLoggingSource:
+    type: json
+    default:
+      tag: openstack.keystone
+      path: /var/log/containers/keystone/keystone.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -87,7 +92,14 @@ outputs:
           - apache::default_vhost: false
       logging_source: {get_attr: [KeystoneBase, role_data, logging_source]}
       logging_groups: {get_attr: [KeystoneBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [KeystoneBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [KeystoneBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_keystone:
+                - keystone
+              tripleo_fluentd_sources_keystone:
+                - {get_param: KeystoneLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: keystone
diff --git a/docker/services/neutron-api.yaml b/docker/services/neutron-api.yaml
index 2a44dea3da..a6136c5dfb 100644
--- a/docker/services/neutron-api.yaml
+++ b/docker/services/neutron-api.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNeutronConfigImage:
     description: The container image to use for the neutron config_volume
     type: string
+  NeutronApiLoggingSource:
+    type: json
+    default:
+      tag: openstack.neutron.api
+      path: /var/log/containers/neutron/server.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -90,7 +95,14 @@ outputs:
         map_merge:
           - get_attr: [NeutronBase, role_data, config_settings]
           - get_attr: [NeutronLogging, config_settings]
-      service_config_settings: {get_attr: [NeutronBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NeutronBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_neutron_api:
+                - neutron
+              tripleo_fluentd_sources_neutron_api:
+                - {get_param: NeutronApiLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: neutron
diff --git a/docker/services/neutron-dhcp.yaml b/docker/services/neutron-dhcp.yaml
index 51317c587d..438dd95482 100644
--- a/docker/services/neutron-dhcp.yaml
+++ b/docker/services/neutron-dhcp.yaml
@@ -23,6 +23,11 @@ parameters:
     description: Generate a wrapper script so neutron launches haproxy in a separate container.
     type: boolean
     default: true
+  NeutronDhcpAgentLoggingSource:
+    type: json
+    default:
+      tag: openstack.neutron.agent.dhcp
+      path: /var/log/neutron/dhcp-agent.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -105,7 +110,14 @@ outputs:
             tripleo::profile::base::neutron::dhcp_agent_wrappers::haproxy_image: {get_param: DockerNeutronDHCPImage}
       logging_source: {get_attr: [NeutronBase, role_data, logging_source]}
       logging_groups: {get_attr: [NeutronBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NeutronBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NeutronBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_neutron_dhcp:
+                - neutron
+              tripleo_fluentd_sources_neutron_dhcp:
+                - {get_param: NeutronDhcpAgentLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: neutron
diff --git a/docker/services/neutron-l3.yaml b/docker/services/neutron-l3.yaml
index 5a16937186..4309886653 100644
--- a/docker/services/neutron-l3.yaml
+++ b/docker/services/neutron-l3.yaml
@@ -14,6 +14,11 @@ parameters:
     default: ['nofile=1024']
     description: ulimit for Neutron L3 Agent Container
     type: comma_delimited_list
+  NeutronL3AgentLoggingSource:
+    type: json
+    default:
+      tag: openstack.neutron.agent.l3
+      path: /var/log/containers/neutron/l3-agent.log
   NeutronEnableKeepalivedWrapper:
     description: Generate a wrapper script so neutron launches keepalived processes in a
                  separate container.
@@ -114,7 +119,14 @@ outputs:
 
       logging_source: {get_attr: [NeutronL3Base, role_data, logging_source]}
       logging_groups: {get_attr: [NeutronL3Base, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NeutronL3Base, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NeutronL3Base, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_neutron_l3:
+                - neutron
+              tripleo_fluentd_sources_neutron_l3:
+                - {get_param: NeutronL3AgentLoggingSource}
       puppet_config:
         puppet_tags: neutron_config,neutron_l3_agent_config
         config_volume: neutron
diff --git a/docker/services/neutron-metadata.yaml b/docker/services/neutron-metadata.yaml
index accce0db9d..f3d3d15a2b 100644
--- a/docker/services/neutron-metadata.yaml
+++ b/docker/services/neutron-metadata.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNeutronConfigImage:
     description: The container image to use for the neutron config_volume
     type: string
+  NeutronMetadataAgentLoggingSource:
+    type: json
+    default:
+      tag: openstack.neutron.agent.metadata
+      path: /var/log/containers/neutron/metadata-agent.log
   ServiceData:
     default: {}
     description: Dictionary packing service data
@@ -68,7 +73,14 @@ outputs:
           - get_attr: [NeutronLogging, config_settings]
       logging_source: {get_attr: [NeutronMetadataBase, role_data, logging_source]}
       logging_groups: {get_attr: [NeutronMetadataBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NeutronMetadataBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NeutronMetadataBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_neutron_metadata:
+                - neutron
+              tripleo_fluentd_sources_neutron_metadata:
+                - {get_param: NeutronMetadataAgentLoggingSource}
       puppet_config:
         puppet_tags: neutron_config,neutron_metadata_agent_config
         config_volume: neutron
diff --git a/docker/services/neutron-ovs-agent.yaml b/docker/services/neutron-ovs-agent.yaml
index 7b500d9550..fc560c8666 100644
--- a/docker/services/neutron-ovs-agent.yaml
+++ b/docker/services/neutron-ovs-agent.yaml
@@ -14,6 +14,11 @@ parameters:
     default: ['nofile=1024']
     description: ulimit for Openvswitch Container
     type: comma_delimited_list
+  NeutronOpenVswitchAgentLoggingSource:
+    type: json
+    default:
+      tag: openstack.neutron.agent.openvswitch
+      path: /var/log/containers/neutron/openvswitch-agent.log
   ServiceData:
     default: {}
     description: Dictionary packing service data
@@ -76,7 +81,14 @@ outputs:
           - get_attr: [NeutronLogging, config_settings]
       logging_source: {get_attr: [NeutronOvsAgentBase, role_data, logging_source]}
       logging_groups: {get_attr: [NeutronOvsAgentBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NeutronOvsAgentBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NeutronOvsAgentBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_neutron_ovs_agent:
+                - neutron
+              tripleo_fluentd_sources_neutron_ovs_agent:
+                - {get_param: NeutronOpenVswitchAgentLoggingSource}
       puppet_config:
         config_volume: neutron
         puppet_tags: neutron_config,neutron_agent_ovs,neutron_plugin_ml2
diff --git a/docker/services/nova-api.yaml b/docker/services/nova-api.yaml
index f6b08ebcc3..7dedfd7974 100644
--- a/docker/services/nova-api.yaml
+++ b/docker/services/nova-api.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNovaConfigImage:
     description: The container image to use for the nova config_volume
     type: string
+  NovaApiLoggingSource:
+    type: json
+    default:
+      tag: openstack.nova.api
+      path: /var/log/containers/nova/nova-api.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -95,7 +100,14 @@ outputs:
           - apache::default_vhost: false
       logging_source: {get_attr: [NovaApiBase, role_data, logging_source]}
       logging_groups: {get_attr: [NovaApiBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NovaApiBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NovaApiBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_nova_api:
+                - nova
+              tripleo_fluentd_sources_nova_api:
+                - {get_param: NovaApiLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: nova
diff --git a/docker/services/nova-compute.yaml b/docker/services/nova-compute.yaml
index 26f8f7f8f2..03ce231440 100644
--- a/docker/services/nova-compute.yaml
+++ b/docker/services/nova-compute.yaml
@@ -14,6 +14,11 @@ parameters:
     default: ['nofile=1024']
     description: ulimit for Nova Compute Container
     type: comma_delimited_list
+  NovaComputeLoggingSource:
+    type: json
+    default:
+      tag: openstack.nova.compute
+      path: /var/log/containers/nova/nova-compute.log
   ServiceData:
     default: {}
     description: Dictionary packing service data
@@ -119,7 +124,14 @@ outputs:
           - get_attr: [NovaLogging, config_settings]
       logging_source: {get_attr: [NovaComputeBase, role_data, logging_source]}
       logging_groups: {get_attr: [NovaComputeBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NovaComputeBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NovaComputeBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_nova_compute:
+                - nova
+              tripleo_fluentd_sources_nova_compute:
+                - {get_param: NovaComputeLoggingSource}
       puppet_config:
         config_volume: nova_libvirt
         puppet_tags: nova_config,nova_paste_api_ini
diff --git a/docker/services/nova-conductor.yaml b/docker/services/nova-conductor.yaml
index badf7ac6cb..219cce2903 100644
--- a/docker/services/nova-conductor.yaml
+++ b/docker/services/nova-conductor.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNovaConfigImage:
     description: The container image to use for the nova config_volume
     type: string
+  NovaConductorLoggingSource:
+    type: json
+    default:
+      tag: openstack.nova.conductor
+      path: /var/log/containers/nova/nova-conductor.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -81,7 +86,14 @@ outputs:
           - {get_attr: [NovaLogging, config_settings]}
       logging_source: {get_attr: [NovaConductorBase, role_data, logging_source]}
       logging_groups: {get_attr: [NovaConductorBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NovaConductorBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NovaConductorBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_nova_conductor:
+                - nova
+              tripleo_fluentd_sources_nova_conductor:
+                - {get_param: NovaConductorLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: nova
diff --git a/docker/services/nova-consoleauth.yaml b/docker/services/nova-consoleauth.yaml
index aa1addc150..77d1d19943 100644
--- a/docker/services/nova-consoleauth.yaml
+++ b/docker/services/nova-consoleauth.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNovaConfigImage:
     description: The container image to use for the nova config_volume
     type: string
+  NovaConsoleauthLoggingSource:
+    type: json
+    default:
+      tag: openstack.nova.consoleauth
+      path: /var/log/containers/nova/nova-consoleauth.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -76,7 +81,14 @@ outputs:
           - {get_attr: [NovaLogging, config_settings]}
       logging_source: {get_attr: [NovaConsoleauthPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [NovaConsoleauthPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NovaConsoleauthPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NovaConsoleauthPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_nova_consoleauth:
+                - nova
+              tripleo_fluentd_sources_nova_consoleauth:
+                - {get_param: NovaConsoleauthLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: nova
diff --git a/docker/services/nova-metadata.yaml b/docker/services/nova-metadata.yaml
index 1178b6bada..26b181ab89 100644
--- a/docker/services/nova-metadata.yaml
+++ b/docker/services/nova-metadata.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNovaConfigImage:
     description: The container image to use for the nova config_volume
     type: string
+  NovaMetadataLoggingSource:
+    type: json
+    default:
+      tag: openstack.nova.api.metadata
+      path: /var/log/containers/nova/nova-api-metadata.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -69,7 +74,14 @@ outputs:
           - {get_attr: [NovaLogging, config_settings]}
       logging_source: {get_attr: [NovaMetadataBase, role_data, logging_source]}
       logging_groups: {get_attr: [NovaMetadataBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NovaMetadataBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NovaMetadataBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_nova_metadata:
+                - nova
+              tripleo_fluentd_sources_nova_metadata:
+                - {get_param: NovaMetadataLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: nova
diff --git a/docker/services/nova-placement.yaml b/docker/services/nova-placement.yaml
index 8bf3fc2b20..3b7c310417 100644
--- a/docker/services/nova-placement.yaml
+++ b/docker/services/nova-placement.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNovaPlacementConfigImage:
     description: The container image to use for the nova_placement config_volume
     type: string
+  NovaPlacementLoggingSource:
+    type: json
+    default:
+      tag: openstack.nova.placement
+      path: /var/log/containers/httpd/nova_placement_wsgi_error_ssl.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -81,7 +86,14 @@ outputs:
           - apache::default_vhost: false
       logging_source: {get_attr: [NovaPlacementBase, role_data, logging_source]}
       logging_groups: {get_attr: [NovaPlacementBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NovaPlacementBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NovaPlacementBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_nova_placement:
+                - nova
+              tripleo_fluentd_sources_nova_placement:
+                - {get_param: NovaPlacementLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: nova_placement
diff --git a/docker/services/nova-scheduler.yaml b/docker/services/nova-scheduler.yaml
index b47485fa43..c528f5cdb6 100644
--- a/docker/services/nova-scheduler.yaml
+++ b/docker/services/nova-scheduler.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNovaConfigImage:
     description: The container image to use for the nova config_volume
     type: string
+  NovaSchedulerLoggingSource:
+    type: json
+    default:
+      tag: openstack.nova.scheduler
+      path: /var/log/containers/nova/nova-scheduler.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -76,7 +81,14 @@ outputs:
           - {get_attr: [NovaLogging, config_settings]}
       logging_source: {get_attr: [NovaSchedulerBase, role_data, logging_source]}
       logging_groups: {get_attr: [NovaSchedulerBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NovaSchedulerBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NovaSchedulerBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_nova_scheduler:
+                - nova
+              tripleo_fluentd_sources_nova_scheduler:
+                - {get_param: NovaSchedulerLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: nova
diff --git a/docker/services/nova-vnc-proxy.yaml b/docker/services/nova-vnc-proxy.yaml
index 7d6fa6b693..520a792d73 100644
--- a/docker/services/nova-vnc-proxy.yaml
+++ b/docker/services/nova-vnc-proxy.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNovaConfigImage:
     description: The container image to use for the nova config_volume
     type: string
+  NovaVncproxyLoggingSource:
+    type: json
+    default:
+      tag: openstack.nova.vncproxy
+      path: /var/log/containers/nova/nova-vncproxy.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -116,7 +121,14 @@ outputs:
           - {get_attr: [NovaLogging, config_settings]}
       logging_source: {get_attr: [NovaVncProxyPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [NovaVncProxyPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [NovaVncProxyPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [NovaVncProxyPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_nova_vnc_proxy:
+                - nova
+              tripleo_fluentd_sources_nova_vnc_proxy:
+                - {get_param: NovaVncproxyLoggingSource}
       # BEGIN DOCKER SETTINGS
       puppet_config:
         config_volume: nova
diff --git a/docker/services/octavia-api.yaml b/docker/services/octavia-api.yaml
index 63eb2d6100..ebfe245706 100644
--- a/docker/services/octavia-api.yaml
+++ b/docker/services/octavia-api.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerOctaviaConfigImage:
     description: The container image to use for the octavia config_volume
     type: string
+  OctaviaApiLoggingSource:
+    type: json
+    default:
+      tag: openstack.octavia.api
+      path: /var/log/containers/octavia/api.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -71,7 +76,14 @@ outputs:
       config_settings: {get_attr: [OctaviaApiPuppetBase, role_data, config_settings]}
       logging_source: {get_attr: [OctaviaApiPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [OctaviaApiPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [OctaviaApiPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [OctaviaApiPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_octavia_api:
+                - octavia
+              tripleo_fluentd_sources_octavia_api:
+                - {get_param: OctaviaApiLoggingSource}
       # BEGIN DOCKER SETTINGS #
       puppet_config:
         config_volume: octavia
diff --git a/docker/services/octavia-health-manager.yaml b/docker/services/octavia-health-manager.yaml
index b74467643d..79a8738181 100644
--- a/docker/services/octavia-health-manager.yaml
+++ b/docker/services/octavia-health-manager.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerOctaviaConfigImage:
     description: The container image to use for the octavia config_volume
     type: string
+  OctaviaHealthManagerLoggingSource:
+    type: json
+    default:
+      tag: openstack.octavia.health-manager
+      path: /var/log/containers/octavia/health-manager.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -64,7 +69,14 @@ outputs:
       config_settings: {get_attr: [OctaviaHealthManagerPuppetBase, role_data, config_settings]}
       logging_source: {get_attr: [OctaviaHealthManagerPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [OctaviaHealthManagerPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [OctaviaHealthManagerPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [OctaviaHealthManagerPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_octavia_health_manager:
+                - octavia
+              tripleo_fluentd_sources_octavia_health_manager:
+                - {get_param: OctaviaHealthManagerLoggingSource}
       # BEGIN DOCKER SETTINGS #
       puppet_config:
         config_volume: octavia
diff --git a/docker/services/octavia-housekeeping.yaml b/docker/services/octavia-housekeeping.yaml
index 5b80359ff1..eff21e24a8 100644
--- a/docker/services/octavia-housekeeping.yaml
+++ b/docker/services/octavia-housekeeping.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerOctaviaConfigImage:
     description: The container image to use for the octavia config_volume
     type: string
+  OctaviaHousekeepingLoggingSource:
+    type: json
+    default:
+      tag: openstack.octavia.housekeeping
+      path: /var/log/containers/octavia/housekeeping.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -60,7 +65,14 @@ outputs:
       config_settings: {get_attr: [OctaviaHousekeepingPuppetBase, role_data, config_settings]}
       logging_source: {get_attr: [OctaviaHousekeepingPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [OctaviaHousekeepingPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [OctaviaHousekeepingPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [OctaviaHousekeepingPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_octavia_housekeeping:
+                - octavia
+              tripleo_fluentd_sources_octavia_housekeeping:
+                - {get_param: OctaviaHousekeepingLoggingSource}
       # BEGIN DOCKER SETTINGS #
       puppet_config:
         config_volume: octavia
diff --git a/docker/services/octavia-worker.yaml b/docker/services/octavia-worker.yaml
index e8e827dcfc..5f3f3855b4 100644
--- a/docker/services/octavia-worker.yaml
+++ b/docker/services/octavia-worker.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerOctaviaConfigImage:
     description: The container image to use for the octavia config_volume
     type: string
+  OctaviaWorkerLoggingSource:
+    type: json
+    default:
+      tag: openstack.octavia.worker
+      path: /var/log/containers/octavia/worker.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -64,7 +69,14 @@ outputs:
       config_settings: {get_attr: [OctaviaWorkerPuppetBase, role_data, config_settings]}
       logging_source: {get_attr: [OctaviaWorkerPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [OctaviaWorkerPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [OctaviaWorkerPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [OctaviaWorkerPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_octavia_worker:
+                - octavia
+              tripleo_fluentd_sources_octavia_worker:
+                - {get_param: OctaviaWorkerLoggingSource}
       # BEGIN DOCKER SETTINGS #
       puppet_config:
         config_volume: octavia
diff --git a/docker/services/ovn-metadata.yaml b/docker/services/ovn-metadata.yaml
index 727a024429..3166ee20cc 100644
--- a/docker/services/ovn-metadata.yaml
+++ b/docker/services/ovn-metadata.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerNeutronConfigImage:
     description: The container image to use for the neutron config_volume
     type: string
+  OvnMetadataAgentLoggingSource:
+    type: json
+    default:
+      tag: openstack.neutron.agent.ovn-metadata
+      path: /var/log/containers/neutron/networking-ovn-metadata-agent.log
   ServiceData:
     default: {}
     description: Dictionary packing service data
diff --git a/docker/services/sahara-api.yaml b/docker/services/sahara-api.yaml
index 3ed1da89b1..63037b9a1a 100644
--- a/docker/services/sahara-api.yaml
+++ b/docker/services/sahara-api.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerSaharaConfigImage:
     description: The container image to use for the sahara config_volume
     type: string
+  SaharaApiLoggingSource:
+    type: json
+    default:
+      tag: openstack.sahara.api
+      path: /var/log/containers/sahara/sahara-api.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -68,7 +73,14 @@ outputs:
           - sahara::sync_db: false
       logging_source: {get_attr: [SaharaApiPuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [SaharaApiPuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [SaharaApiPuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [SaharaApiPuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_sahara_api:
+                - sahara
+              tripleo_fluentd_sources_sahara_api:
+                - {get_param: SaharaApiLoggingSource}
       # BEGIN DOCKER SETTINGS #
       puppet_config:
         config_volume: sahara
diff --git a/docker/services/sahara-engine.yaml b/docker/services/sahara-engine.yaml
index 1336db1746..0ccc1bb7e1 100644
--- a/docker/services/sahara-engine.yaml
+++ b/docker/services/sahara-engine.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerSaharaConfigImage:
     description: The container image to use for the sahara config_volume
     type: string
+  SaharaEngineLoggingSource:
+    type: json
+    default:
+      tag: openstack.sahara.engine
+      path: /var/log/containers/sahara/sahara-engine.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -68,7 +73,14 @@ outputs:
           - sahara::sync_db: false
       logging_source: {get_attr: [SaharaEnginePuppetBase, role_data, logging_source]}
       logging_groups: {get_attr: [SaharaEnginePuppetBase, role_data, logging_groups]}
-      service_config_settings: {get_attr: [SaharaEnginePuppetBase, role_data, service_config_settings]}
+      service_config_settings:
+        map_merge:
+          - get_attr: [SaharaEnginePuppetBase, role_data, service_config_settings]
+          - fluentd:
+              tripleo_fluentd_groups_sahara_engine:
+                - sahara
+              tripleo_fluentd_sources_sahara_engine:
+                - {get_param: SaharaEngineLoggingSource}
       # BEGIN DOCKER SETTINGS #
       puppet_config:
         config_volume: sahara
diff --git a/docker/services/tripleo-ui.yaml b/docker/services/tripleo-ui.yaml
index 5667b22543..4645a3e8fb 100644
--- a/docker/services/tripleo-ui.yaml
+++ b/docker/services/tripleo-ui.yaml
@@ -10,6 +10,11 @@ parameters:
   DockerTripleoUIConfigImage:
     description: The container image to use for the tripleo-ui config_volume
     type: string
+  TripleoUILoggingSource:
+    type: json
+    default:
+      tag: openstack.tripleo.ui
+      path: /var/log/containers/httpd/tripleo-ui/ui.log
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
diff --git a/tools/yaml-validate.py b/tools/yaml-validate.py
index 00aa279f06..53c8dbb29d 100755
--- a/tools/yaml-validate.py
+++ b/tools/yaml-validate.py
@@ -104,6 +104,47 @@ PARAMETER_DEFINITION_EXCLUSIONS = {'CephPools': ['description',
                                    'InternalApiAllocationPools': ['default'],
                                    'UpdateIdentifier': ['description'],
                                    'key_name': ['default'],
+                                   'CeilometerAgentCentralLoggingSource': ['default'],
+                                   'CeilometerAgentIpmiLoggingSource': ['default'],
+                                   'CeilometerAgentNotificationLoggingSource': ['default'],
+                                   'CinderApiLoggingSource': ['default'],
+                                   'CinderSchedulerLoggingSource': ['default'],
+                                   'CinderVolumeLoggingSource': ['default'],
+                                   'DesignateApiLoggingSource': ['default'],
+                                   'DesignateCentralLoggingSource': ['default'],
+                                   'DesignateMiniDNSLoggingSource': ['default'],
+                                   'DesignateProducerLoggingSource': ['default'],
+                                   'DesignateSinkLoggingSource': ['default'],
+                                   'DesignateWorkerLoggingSource': ['default'],
+                                   'Ec2ApiLoggingSource': ['default'],
+                                   'GlanceApiLoggingSource': ['default'],
+                                   'GnocchiApiLoggingSource': ['default'],
+                                   'HeatApiCfnLoggingSource': ['default'],
+                                   'HeatApiLoggingSource': ['default'],
+                                   'HeatEngineLoggingSource': ['default'],
+                                   'KeystoneLoggingSource': ['default'],
+                                   'MongoDbLoggingSource': ['default'],
+                                   'NeutronApiLoggingSource': ['default'],
+                                   'NeutronDhcpAgentLoggingSource': ['default'],
+                                   'NeutronL3AgentLoggingSource': ['default'],
+                                   'NeutronMetadataAgentLoggingSource': ['default'],
+                                   'NeutronOpenVswitchAgentLoggingSource': ['default'],
+                                   'NovaApiLoggingSource': ['default'],
+                                   'NovaComputeLoggingSource': ['default'],
+                                   'NovaConductorLoggingSource': ['default'],
+                                   'NovaConsoleauthLoggingSource': ['default'],
+                                   'NovaMetadataLoggingSource': ['default'],
+                                   'NovaPlacementLoggingSource': ['default'],
+                                   'NovaSchedulerLoggingSource': ['default'],
+                                   'NovaVncproxyLoggingSource': ['default'],
+                                   'OctaviaApiLoggingSource': ['default'],
+                                   'OctaviaHealthManagerLoggingSource': ['default'],
+                                   'OctaviaHousekeepingLoggingSource': ['default'],
+                                   'OctaviaWorkerLoggingSource': ['default'],
+                                   'OvnMetadataAgentLoggingSource': ['default'],
+                                   'SaharaApiLoggingSource': ['default'],
+                                   'SaharaEngineLoggingSource': ['default'],
+                                   'TripleoUILoggingSource': ['default'],
                                    # There's one template that defines this
                                    # differently, and I'm not sure if we can
                                    # safely change it.