Skip to content

Commit 9f553bd

Browse files
committed
filter provider generated logs from platform logger
1 parent 0033852 commit 9f553bd

File tree

3 files changed

+55
-15
lines changed

3 files changed

+55
-15
lines changed

python/rpdk/python/templates/handlers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
from typing import Any, MutableMapping
23

34
from {{support_lib_pkg}} import (
@@ -13,6 +14,9 @@
1314

1415
from .models import ResourceModel, TResourceModel
1516

17+
# Use this logger to forward log messages to CloudWatch Logs.
18+
LOG = logging.getLogger(__name__)
19+
1620
resource = Resource(ResourceModel)
1721
test_entrypoint = resource.test_entrypoint
1822

src/aws_cloudformation_rpdk_python_lib/log_delivery.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66
import boto3 # type: ignore
77

88

9+
class ProviderFilter(logging.Filter):
10+
PROVIDER = ""
11+
12+
def filter(self, record: logging.LogRecord) -> bool:
13+
return not record.name.startswith(self.PROVIDER)
14+
15+
916
class ProviderLogHandler(logging.Handler):
1017
def __init__(self, group: str, stream: str, creds: Mapping[str, str]):
1118
logging.Handler.__init__(self)
@@ -24,6 +31,12 @@ def setup(cls, event_data: Mapping[str, Any]) -> None:
2431
stream_suffix = event_data.get("requestData", {}).get(
2532
"logicalResourceId", event_data.get("action")
2633
)
34+
35+
# filter provider messages from platform
36+
ProviderFilter.PROVIDER = event_data["resourceType"].replace("::", "_").lower()
37+
logging.getLogger().handlers[0].addFilter(ProviderFilter())
38+
39+
# add log handler to root, so that provider gets plugin logs too
2740
if log_creds and log_group:
2841
log_handler = cls(
2942
group=log_group,

tests/lib/log_delivery_test.py

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
from unittest.mock import DEFAULT, Mock, create_autospec, patch
44

55
import pytest
6-
from aws_cloudformation_rpdk_python_lib.log_delivery import ProviderLogHandler
6+
from aws_cloudformation_rpdk_python_lib.log_delivery import (
7+
ProviderFilter,
8+
ProviderLogHandler,
9+
)
710

811

912
@pytest.fixture
@@ -28,16 +31,36 @@ def mock_provider_handler():
2831
return plh
2932

3033

34+
@pytest.mark.parametrize(
35+
"logger", [("aa_bb_cc", False), ("aws_cloudformation_rpdk_python_lib", True)]
36+
)
37+
def test_provider_filter(logger):
38+
log_name, expected = logger
39+
ProviderFilter.PROVIDER = "aa_bb_cc"
40+
log_filter = ProviderFilter()
41+
record = logging.LogRecord(
42+
name=log_name,
43+
level=123,
44+
pathname="abc",
45+
lineno=123,
46+
msg="test",
47+
args=[],
48+
exc_info=False,
49+
)
50+
assert log_filter.filter(record) == expected
51+
52+
3153
def test_setup_with_provider_creds(mock_logger):
3254
payload = {
55+
"resourceType": "Foo::Bar::Baz",
3356
"requestData": {
3457
"providerCredentials": {
3558
"accessKeyId": "AKI",
3659
"secretAccessKey": "SAK",
3760
"sessionToken": "ST",
3861
},
3962
"providerLogGroupName": "test_group",
40-
}
63+
},
4164
}
4265
with patch(
4366
"aws_cloudformation_rpdk_python_lib.log_delivery.logging.getLogger",
@@ -67,20 +90,20 @@ def test_setup_without_provider_creds(mock_logger):
6790
".__init__",
6891
autospec=True,
6992
) as mock___init__:
70-
ProviderLogHandler.setup({})
71-
ProviderLogHandler.setup({"requestData": {}})
72-
ProviderLogHandler.setup({"requestData": {"providerLogGroupName": "test"}})
73-
ProviderLogHandler.setup(
74-
{
75-
"requestData": {
76-
"providerCredentials": {
77-
"accessKeyId": "AKI",
78-
"secretAccessKey": "SAK",
79-
"sessionToken": "ST",
80-
}
81-
}
93+
payload = {"resourceType": "Foo::Bar::Baz"}
94+
ProviderLogHandler.setup(payload)
95+
payload["requestData"] = {}
96+
ProviderLogHandler.setup(payload)
97+
payload["requestData"] = {"providerLogGroupName": "test"}
98+
ProviderLogHandler.setup(payload)
99+
payload["requestData"] = {
100+
"providerCredentials": {
101+
"accessKeyId": "AKI",
102+
"secretAccessKey": "SAK",
103+
"sessionToken": "ST",
82104
}
83-
)
105+
}
106+
ProviderLogHandler.setup(payload)
84107
mock___init__.assert_not_called()
85108
patched_logger.return_value.addHandler.assert_not_called()
86109

0 commit comments

Comments
 (0)