Skip to content

Commit 8d934fe

Browse files
committed
Fix #921 Enable to use custom logger in WebClient, WebhookClient (async/sync)
1 parent 6c281d6 commit 8d934fe

10 files changed

Lines changed: 171 additions & 5 deletions

slack_sdk/web/async_base_client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def __init__(
3636
user_agent_suffix: Optional[str] = None,
3737
# for Org-Wide App installation
3838
team_id: Optional[str] = None,
39+
logger: Optional[logging.Logger] = None,
3940
):
4041
self.token = None if token is None else token.strip()
4142
self.base_url = base_url
@@ -52,7 +53,7 @@ def __init__(
5253
self.default_params = {}
5354
if team_id is not None:
5455
self.default_params["team_id"] = team_id
55-
self._logger = logging.getLogger(__name__)
56+
self._logger = logger if logger is not None else logging.getLogger(__name__)
5657

5758
async def api_call( # skipcq: PYL-R1710
5859
self,

slack_sdk/web/base_client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def __init__(
4646
user_agent_suffix: Optional[str] = None,
4747
# for Org-Wide App installation
4848
team_id: Optional[str] = None,
49+
logger: Optional[logging.Logger] = None,
4950
):
5051
self.token = None if token is None else token.strip()
5152
self.base_url = base_url
@@ -59,7 +60,7 @@ def __init__(
5960
self.default_params = {}
6061
if team_id is not None:
6162
self.default_params["team_id"] = team_id
62-
self._logger = logging.getLogger(__name__)
63+
self._logger = logger if logger is not None else logging.getLogger(__name__)
6364

6465
def api_call( # skipcq: PYL-R1710
6566
self,

slack_sdk/web/legacy_base_client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def __init__(
5454
user_agent_suffix: Optional[str] = None,
5555
# for Org-Wide App installation
5656
team_id: Optional[str] = None,
57+
logger: Optional[logging.Logger] = None,
5758
):
5859
self.token = None if token is None else token.strip()
5960
self.base_url = base_url
@@ -70,7 +71,7 @@ def __init__(
7071
self.default_params = {}
7172
if team_id is not None:
7273
self.default_params["team_id"] = team_id
73-
self._logger = logging.getLogger(__name__)
74+
self._logger = logger if logger is not None else logging.getLogger(__name__)
7475
self._event_loop = loop
7576

7677
def api_call( # skipcq: PYL-R1710

slack_sdk/webhook/async_client.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,15 @@
1919

2020

2121
class AsyncWebhookClient:
22-
logger = logging.getLogger(__name__)
22+
url: str
23+
timeout: int
24+
ssl: Optional[SSLContext]
25+
proxy: Optional[str]
26+
session: Optional[ClientSession]
27+
trust_env_in_session: bool
28+
auth: Optional[BasicAuth]
29+
default_headers: Dict[str, str]
30+
logger: logging.Logger
2331

2432
def __init__(
2533
self,
@@ -33,6 +41,7 @@ def __init__(
3341
default_headers: Optional[Dict[str, str]] = None,
3442
user_agent_prefix: Optional[str] = None,
3543
user_agent_suffix: Optional[str] = None,
44+
logger: Optional[logging.Logger] = None,
3645
):
3746
"""API client for Incoming Webhooks and response_url
3847
:param url: a complete URL to send data (e.g., https://hooks.slack.com/XXX)
@@ -45,6 +54,7 @@ def __init__(
4554
:param default_headers: request headers to add to all requests
4655
:param user_agent_prefix: prefix for User-Agent header value
4756
:param user_agent_suffix: suffix for User-Agent header value
57+
:param logger: custom logger
4858
"""
4959
self.url = url
5060
self.timeout = timeout
@@ -57,6 +67,7 @@ def __init__(
5767
self.default_headers["User-Agent"] = get_user_agent(
5868
user_agent_prefix, user_agent_suffix
5969
)
70+
self.logger = logger if logger is not None else logging.getLogger(__name__)
6071

6172
async def send(
6273
self,

slack_sdk/webhook/client.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@
2020

2121

2222
class WebhookClient:
23-
logger = logging.getLogger(__name__)
23+
url: str
24+
timeout: int
25+
ssl: Optional[SSLContext]
26+
proxy: Optional[str]
27+
default_headers: Dict[str, str]
28+
logger: logging.Logger
2429

2530
def __init__(
2631
self,
@@ -31,6 +36,7 @@ def __init__(
3136
default_headers: Optional[Dict[str, str]] = None,
3237
user_agent_prefix: Optional[str] = None,
3338
user_agent_suffix: Optional[str] = None,
39+
logger: Optional[logging.Logger] = None,
3440
):
3541
"""API client for Incoming Webhooks and response_url
3642
:param url: a complete URL to send data (e.g., https://hooks.slack.com/XXX)
@@ -40,6 +46,7 @@ def __init__(
4046
:param default_headers: request headers to add to all requests
4147
:param user_agent_prefix: prefix for User-Agent header value
4248
:param user_agent_suffix: suffix for User-Agent header value
49+
:param logger: custom logger
4350
"""
4451
self.url = url
4552
self.timeout = timeout
@@ -49,6 +56,7 @@ def __init__(
4956
self.default_headers["User-Agent"] = get_user_agent(
5057
user_agent_prefix, user_agent_suffix
5158
)
59+
self.logger = logger if logger is not None else logging.getLogger(__name__)
5260

5361
def send(
5462
self,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import unittest
2+
from logging import Logger
3+
4+
from slack_sdk.web import WebClient
5+
from tests.slack_sdk.web.mock_web_api_server import (
6+
setup_mock_web_api_server,
7+
cleanup_mock_web_api_server,
8+
)
9+
10+
11+
class TestWebClient_Issue_921_CustomLogger(unittest.TestCase):
12+
def setUp(self):
13+
setup_mock_web_api_server(self)
14+
15+
def tearDown(self):
16+
cleanup_mock_web_api_server(self)
17+
18+
def test_if_it_uses_custom_logger(self):
19+
logger = CustomLogger("test-logger")
20+
client = WebClient(
21+
base_url="http://localhost:8888", token="xoxb-api_test", logger=logger,
22+
)
23+
client.chat_postMessage(channel="C111", text="hello")
24+
self.assertTrue(logger.called)
25+
26+
27+
class CustomLogger(Logger):
28+
called: bool
29+
30+
def __init__(self, name, level="DEBUG"):
31+
Logger.__init__(self, name, level)
32+
self.called = False
33+
34+
def debug(self, msg, *args, **kwargs):
35+
self.called = True

tests/slack_sdk/webhook/test_webhook.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import socket
22
import unittest
33
import urllib
4+
from logging import Logger
45

56
from slack_sdk.models.attachments import Attachment, AttachmentField
67
from slack_sdk.models.blocks import SectionBlock, ImageBlock
@@ -201,3 +202,20 @@ def test_issue_919_response_url_flag_options(self):
201202
],
202203
)
203204
self.assertEqual("ok", resp.body)
205+
206+
def test_if_it_uses_custom_logger_issue_921(self):
207+
logger = CustomLogger("test-logger")
208+
client = WebhookClient(url="http://localhost:8888", logger=logger)
209+
client.send_dict({"text": "hi!"})
210+
self.assertTrue(logger.called)
211+
212+
213+
class CustomLogger(Logger):
214+
called: bool
215+
216+
def __init__(self, name, level="DEBUG"):
217+
Logger.__init__(self, name, level)
218+
self.called = False
219+
220+
def debug(self, msg, *args, **kwargs):
221+
self.called = True
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import unittest
2+
from logging import Logger
3+
4+
from slack_sdk.web.async_client import AsyncWebClient
5+
from tests.helpers import async_test
6+
from tests.slack_sdk.web.mock_web_api_server import (
7+
setup_mock_web_api_server,
8+
cleanup_mock_web_api_server,
9+
)
10+
11+
12+
class TestWebClient_Issue_921_CustomLogger(unittest.TestCase):
13+
def setUp(self):
14+
setup_mock_web_api_server(self)
15+
16+
def tearDown(self):
17+
cleanup_mock_web_api_server(self)
18+
19+
@async_test
20+
async def test_if_it_uses_custom_logger(self):
21+
logger = CustomLogger("test-logger")
22+
client = AsyncWebClient(
23+
base_url="http://localhost:8888", token="xoxb-api_test", logger=logger,
24+
)
25+
await client.chat_postMessage(channel="C111", text="hello")
26+
self.assertTrue(logger.called)
27+
28+
29+
class CustomLogger(Logger):
30+
called: bool
31+
32+
def __init__(self, name, level="DEBUG"):
33+
Logger.__init__(self, name, level)
34+
self.called = False
35+
36+
def debug(self, msg, *args, **kwargs):
37+
self.called = True

tests/slack_sdk_async/webhook/test_async_webhook.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import unittest
2+
from logging import Logger
3+
24
from slack_sdk.models.attachments import Attachment, AttachmentField
35
from slack_sdk.models.blocks import SectionBlock, ImageBlock
46
from slack_sdk.webhook.async_client import AsyncWebhookClient, WebhookResponse
@@ -201,3 +203,20 @@ async def test_issue_919_response_url_flag_options(self):
201203
],
202204
)
203205
self.assertEqual("ok", resp.body)
206+
207+
async def test_if_it_uses_custom_logger_issue_921(self):
208+
logger = CustomLogger("test-logger")
209+
client = AsyncWebhookClient(url="http://localhost:8888", logger=logger)
210+
await client.send_dict({"text": "hi!"})
211+
self.assertTrue(logger.called)
212+
213+
214+
class CustomLogger(Logger):
215+
called: bool
216+
217+
def __init__(self, name, level="DEBUG"):
218+
Logger.__init__(self, name, level)
219+
self.called = False
220+
221+
def debug(self, msg, *args, **kwargs):
222+
self.called = True
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import unittest
2+
from logging import Logger
3+
4+
from slack.web import WebClient
5+
from tests.slack_sdk.web.mock_web_api_server import (
6+
setup_mock_web_api_server,
7+
cleanup_mock_web_api_server,
8+
)
9+
10+
11+
class TestWebClient_Issue_921_CustomLogger(unittest.TestCase):
12+
def setUp(self):
13+
setup_mock_web_api_server(self)
14+
15+
def tearDown(self):
16+
cleanup_mock_web_api_server(self)
17+
18+
def test_if_it_uses_custom_logger(self):
19+
logger = CustomLogger("test-logger")
20+
client = WebClient(
21+
base_url="http://localhost:8888", token="xoxb-api_test", logger=logger,
22+
)
23+
client.chat_postMessage(channel="C111", text="hello")
24+
self.assertTrue(logger.called)
25+
26+
27+
class CustomLogger(Logger):
28+
called: bool
29+
30+
def __init__(self, name, level="DEBUG"):
31+
Logger.__init__(self, name, level)
32+
self.called = False
33+
34+
def debug(self, msg, *args, **kwargs):
35+
self.called = True

0 commit comments

Comments
 (0)