Skip to content

Commit 9b3595d

Browse files
committed
Remove stack traces from INFO and WARNING logs.
Fix #1501.
1 parent 0a5a79c commit 9b3595d

File tree

7 files changed

+38
-16
lines changed

7 files changed

+38
-16
lines changed

src/websockets/asyncio/client.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import asyncio
44
import logging
55
import os
6+
import traceback
67
import urllib.parse
78
from collections.abc import AsyncIterator, Generator, Sequence
89
from types import TracebackType
@@ -521,9 +522,10 @@ async def __aiter__(self) -> AsyncIterator[ClientConnection]:
521522
delays = backoff()
522523
delay = next(delays)
523524
self.logger.info(
524-
"connect failed; reconnecting in %.1f seconds",
525+
"connect failed; reconnecting in %.1f seconds: %s",
525526
delay,
526-
exc_info=True,
527+
# Remove first argument when dropping Python 3.9.
528+
traceback.format_exception_only(type(exc), exc)[0].strip(),
527529
)
528530
await asyncio.sleep(delay)
529531
continue

src/websockets/asyncio/connection.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import random
88
import struct
99
import sys
10+
import traceback
1011
import uuid
1112
from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Iterable, Mapping
1213
from types import TracebackType
@@ -1180,8 +1181,12 @@ def broadcast(
11801181
exceptions.append(exception)
11811182
else:
11821183
connection.logger.warning(
1183-
"skipped broadcast: failed to write message",
1184-
exc_info=True,
1184+
"skipped broadcast: failed to write message: %s",
1185+
traceback.format_exception_only(
1186+
# Remove first argument when dropping Python 3.9.
1187+
type(write_exception),
1188+
write_exception,
1189+
)[0].strip(),
11851190
)
11861191

11871192
if raise_exceptions and exceptions:

src/websockets/legacy/client.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import logging
66
import os
77
import random
8+
import traceback
89
import urllib.parse
910
import warnings
1011
from collections.abc import AsyncIterator, Generator, Sequence
@@ -597,22 +598,24 @@ async def __aiter__(self) -> AsyncIterator[WebSocketClientProtocol]:
597598
try:
598599
async with self as protocol:
599600
yield protocol
600-
except Exception:
601+
except Exception as exc:
601602
# Add a random initial delay between 0 and 5 seconds.
602603
# See 7.2.3. Recovering from Abnormal Closure in RFC 6455.
603604
if backoff_delay == self.BACKOFF_MIN:
604605
initial_delay = random.random() * self.BACKOFF_INITIAL
605606
self.logger.info(
606-
"connect failed; reconnecting in %.1f seconds",
607+
"connect failed; reconnecting in %.1f seconds: %s",
607608
initial_delay,
608-
exc_info=True,
609+
# Remove first argument when dropping Python 3.9.
610+
traceback.format_exception_only(type(exc), exc)[0].strip(),
609611
)
610612
await asyncio.sleep(initial_delay)
611613
else:
612614
self.logger.info(
613-
"connect failed again; retrying in %d seconds",
615+
"connect failed again; retrying in %d seconds: %s",
614616
int(backoff_delay),
615-
exc_info=True,
617+
# Remove first argument when dropping Python 3.9.
618+
traceback.format_exception_only(type(exc), exc)[0].strip(),
616619
)
617620
await asyncio.sleep(int(backoff_delay))
618621
# Increase delay with truncated exponential backoff.

src/websockets/legacy/protocol.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import struct
1010
import sys
1111
import time
12+
import traceback
1213
import uuid
1314
import warnings
1415
from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Iterable, Mapping
@@ -1624,8 +1625,12 @@ def broadcast(
16241625
exceptions.append(exception)
16251626
else:
16261627
websocket.logger.warning(
1627-
"skipped broadcast: failed to write message",
1628-
exc_info=True,
1628+
"skipped broadcast: failed to write message: %s",
1629+
traceback.format_exception_only(
1630+
# Remove first argument when dropping Python 3.9.
1631+
type(write_exception),
1632+
write_exception,
1633+
)[0].strip(),
16291634
)
16301635

16311636
if raise_exceptions and exceptions:

tests/asyncio/test_connection.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1337,7 +1337,10 @@ async def test_broadcast_skips_connection_failing_to_send(self):
13371337

13381338
self.assertEqual(
13391339
[record.getMessage() for record in logs.records],
1340-
["skipped broadcast: failed to write message"],
1340+
[
1341+
"skipped broadcast: failed to write message: "
1342+
"RuntimeError: Cannot call write() after write_eof()"
1343+
],
13411344
)
13421345

13431346
@unittest.skipIf(

tests/legacy/test_client_server.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -1607,6 +1607,10 @@ async def run_client():
16071607
],
16081608
)
16091609
# Iteration 3
1610+
exc = (
1611+
"websockets.legacy.exceptions.InvalidStatusCode: "
1612+
"server rejected WebSocket connection: HTTP 503"
1613+
)
16101614
self.assertEqual(
16111615
[
16121616
re.sub(r"[0-9\.]+ seconds", "X seconds", record.getMessage())
@@ -1615,12 +1619,12 @@ async def run_client():
16151619
[
16161620
"connection rejected (503 Service Unavailable)",
16171621
"connection closed",
1618-
"connect failed; reconnecting in X seconds",
1622+
f"connect failed; reconnecting in X seconds: {exc}",
16191623
]
16201624
+ [
16211625
"connection rejected (503 Service Unavailable)",
16221626
"connection closed",
1623-
"connect failed again; retrying in X seconds",
1627+
f"connect failed again; retrying in X seconds: {exc}",
16241628
]
16251629
* ((len(logs.records) - 8) // 3)
16261630
+ [

tests/legacy/test_protocol.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1547,14 +1547,14 @@ def test_broadcast_reports_connection_sending_fragmented_text(self):
15471547

15481548
def test_broadcast_skips_connection_failing_to_send(self):
15491549
# Configure mock to raise an exception when writing to the network.
1550-
self.protocol.transport.write.side_effect = RuntimeError
1550+
self.protocol.transport.write.side_effect = RuntimeError("BOOM")
15511551

15521552
with self.assertLogs("websockets", logging.WARNING) as logs:
15531553
broadcast([self.protocol], "café")
15541554

15551555
self.assertEqual(
15561556
[record.getMessage() for record in logs.records],
1557-
["skipped broadcast: failed to write message"],
1557+
["skipped broadcast: failed to write message: RuntimeError: BOOM"],
15581558
)
15591559

15601560
@unittest.skipIf(

0 commit comments

Comments
 (0)