Skip to content

Commit d643392

Browse files
committed
* Fixed logger not working when provided as an argument to AdminClient
* Updated examples/adminapi.py to include usage of the custom logger with AdminClient
1 parent dd5e0b6 commit d643392

File tree

4 files changed

+61
-2
lines changed

4 files changed

+61
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ v2.4.1 is a maintenance release with the following fixes and enhancements:
77
- Removed usage of `strcpy` to enhance security of the client (#1745)
88
- Fixed invalid write in `OAUTHBEARER/OIDC` extensions copy (#1745)
99
- Fixed an issue related to import error of `TopicCollection` and `TopicPartitionInfo` classes when importing through other module like mypy.
10+
- Fixed `logger` not working when provided as an argument to `AdminClient`
11+
- Updated `examples/adminapi.py` to include usage of the custom logger with `AdminClient`
1012

1113
confluent-kafka-python is based on librdkafka v2.4.1, see the
1214
[librdkafka release notes](https://github.com/confluentinc/librdkafka/releases/tag/v2.4.1)

examples/adminapi.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -890,8 +890,16 @@ def example_list_offsets(a, args):
890890
operation = sys.argv[2]
891891
args = sys.argv[3:]
892892

893+
# Custom logger
894+
logger = logging.getLogger('AdminClient')
895+
logger.setLevel(logging.INFO)
896+
handler = logging.StreamHandler()
897+
handler.setFormatter(logging.Formatter('%(asctime)-15s %(levelname)-8s %(message)s'))
898+
logger.addHandler(handler)
899+
893900
# Create Admin client
894-
a = AdminClient({'bootstrap.servers': broker})
901+
a = AdminClient({'bootstrap.servers': broker},
902+
logger=logger)
895903

896904
opsmap = {'create_topics': example_create_topics,
897905
'delete_topics': example_delete_topics,
@@ -920,3 +928,6 @@ def example_list_offsets(a, args):
920928
sys.exit(1)
921929

922930
opsmap[operation](a, args)
931+
932+
# Log messages through custom logger if provided
933+
a.poll(0)

src/confluent_kafka/admin/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,16 +109,21 @@ class AdminClient (_AdminClientImpl):
109109
Requires broker version v0.11.0.0 or later.
110110
"""
111111

112-
def __init__(self, conf):
112+
def __init__(self, conf, logger=None):
113113
"""
114114
Create a new AdminClient using the provided configuration dictionary.
115115
116116
The AdminClient is a standard Kafka protocol client, supporting
117117
the standard librdkafka configuration properties as specified at
118118
https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md
119119
120+
:param dict config: Configuration properties. At a minimum ``bootstrap.servers`` **should** be set\n"
121+
:param Logger logger: Optional Logger instance to use as a custom log messages handler.
122+
120123
At least 'bootstrap.servers' should be configured.
121124
"""
125+
if logger is not None:
126+
conf['logger'] = logger
122127
super(AdminClient, self).__init__(conf)
123128

124129
@staticmethod

tests/test_log.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from io import StringIO
44
import confluent_kafka
55
import confluent_kafka.avro
6+
import confluent_kafka.admin
67
import logging
78

89

@@ -158,3 +159,43 @@ def test_consumer_logger_logging_in_given_format():
158159
c.close()
159160

160161
assert "Consumer Logger | INIT" in logMessage
162+
163+
164+
def test_admin_logger_logging_in_given_format_when_provided_in_conf():
165+
"""Test that asserts that logging is working by matching part of the log message"""
166+
167+
stringBuffer = StringIO()
168+
logger = logging.getLogger('Admin')
169+
logger.setLevel(logging.DEBUG)
170+
handler = logging.StreamHandler(stringBuffer)
171+
handler.setFormatter(logging.Formatter('%(name)s Logger | %(message)s'))
172+
logger.addHandler(handler)
173+
174+
admin_client = confluent_kafka.admin.AdminClient(
175+
{"bootstrap.servers": "test", "logger": logger, "debug": "admin"})
176+
admin_client.poll(0)
177+
178+
logMessage = stringBuffer.getvalue().strip()
179+
stringBuffer.close()
180+
181+
assert "Admin Logger | INIT" in logMessage
182+
183+
184+
def test_admin_logger_logging_in_given_format_when_provided_as_admin_client_argument():
185+
"""Test that asserts that logging is working by matching part of the log message"""
186+
187+
stringBuffer = StringIO()
188+
logger = logging.getLogger('Admin')
189+
logger.setLevel(logging.DEBUG)
190+
handler = logging.StreamHandler(stringBuffer)
191+
handler.setFormatter(logging.Formatter('%(name)s Logger | %(message)s'))
192+
logger.addHandler(handler)
193+
194+
admin_client = confluent_kafka.admin.AdminClient(
195+
{"bootstrap.servers": "test", "debug": "admin"}, logger=logger)
196+
admin_client.poll(0)
197+
198+
logMessage = stringBuffer.getvalue().strip()
199+
stringBuffer.close()
200+
201+
assert "Admin Logger | INIT" in logMessage

0 commit comments

Comments
 (0)