diff --git a/playbooks/roles/haproxy/tasks/main.yaml b/playbooks/roles/haproxy/tasks/main.yaml
index 064032e0c8..723bd78312 100644
--- a/playbooks/roles/haproxy/tasks/main.yaml
+++ b/playbooks/roles/haproxy/tasks/main.yaml
@@ -22,6 +22,20 @@
     that:
       - haproxy_config_template is defined
 
+- name: Fix rsyslog apparmor profile on Noble and newer
+  when: ansible_distribution_version is version('24.04', '>=')
+  block:
+    - name: Edit rsyslogd apparmor profile
+      lineinfile:
+        path: /etc/apparmor.d/usr.sbin.rsyslogd
+        regexp: '^profile rsyslogd /usr/sbin/rsyslogd {'
+        line: 'profile rsyslogd /usr/sbin/rsyslogd flags=(attach_disconnected) {'
+      register: profile_update
+
+    - name: Reload rsyslogd apparmor profile
+      command: apparmor_parser -r /etc/apparmor.d/usr.sbin.rsyslogd
+      when: profile_update.changed
+
 - name: Write rsyslog file
   copy:
     src: rsyslog.d/49-haproxy.conf
diff --git a/testinfra/test_zuul_lb.py b/testinfra/test_zuul_lb.py
index 2543aee2d4..58b25d3044 100644
--- a/testinfra/test_zuul_lb.py
+++ b/testinfra/test_zuul_lb.py
@@ -32,3 +32,10 @@ def test_haproxy_statsd_running(host):
     out = json.loads(cmd.stdout)
     assert out[0]["State"]["Status"] == "running"
     assert out[0]["RestartCount"] == 0
+
+def test_haproxy_logging(host):
+    # rsyslog is configured to add a unix socket at this path
+    assert host.file('/var/lib/haproxy/dev/log').is_socket
+    # Haproxy logs to syslog via the above socket which produces
+    # this logfile
+    assert host.file('/var/log/haproxy.log').is_file