Skip to content

Commit 60438b2

Browse files
authored
docs: how the client uses logging (influxdata#434)
1 parent 215eb88 commit 60438b2

15 files changed

+86
-39
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
## 1.29.0 [unreleased]
22

33
### Breaking Changes
4-
1. [#433](https://github.com/influxdata/influxdb-client-python/pull/433): Rename `InvocableScripts` to `InvokableScripts`
4+
1. [#433](https://github.com/influxdata/influxdb-client-python/pull/433): Rename `InvocableScripts` to `InvokableScripts`
5+
6+
### Documentation
7+
1. [#434](https://github.com/influxdata/influxdb-client-python/pull/434): How the client uses [logging](https://docs.python.org/3/library/logging.html)
58

69
## 1.28.0 [2022-04-19]
710

README.rst

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ InfluxDB 2.0 client features
8484
- `Nanosecond precision`_
8585
- `Delete data`_
8686
- `Handling Errors`_
87+
- `Logging`_
8788

8889
Installation
8990
------------
@@ -1516,6 +1517,50 @@ Client automatically follows HTTP redirects. The default redirect policy is to f
15161517

15171518
.. marker-asyncio-end
15181519
1520+
Logging
1521+
^^^^^^^
1522+
.. marker-logging-start
1523+
1524+
The client uses uses Python's `logging <https://docs.python.org/3/library/logging.html>`__ facility for logging the library activity. The following logger categories are exposed:
1525+
1526+
- ``influxdb_client.client.influxdb_client``
1527+
- ``influxdb_client.client.influxdb_client_async``
1528+
- ``influxdb_client.client.write_api``
1529+
- ``influxdb_client.client.write_api_async``
1530+
- ``influxdb_client.client.write.retry``
1531+
- ``influxdb_client.client.write.dataframe_serializer``
1532+
- ``influxdb_client.client.util.multiprocessing_helper``
1533+
- ``influxdb_client.client.exceptions``
1534+
1535+
The default logging level is `warning` without configured logger output. You can use the standard logger interface to change the log level and handler:
1536+
1537+
.. code-block:: python
1538+
1539+
import logging
1540+
import sys
1541+
1542+
from influxdb_client import InfluxDBClient
1543+
1544+
with InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org") as client:
1545+
for _, logger in client.conf.loggers.items():
1546+
logger.setLevel(logging.DEBUG)
1547+
logger.addHandler(logging.StreamHandler(sys.stdout))
1548+
1549+
Debugging
1550+
"""""""""
1551+
1552+
For debug purpose you can enable verbose logging of HTTP requests and set the ``debug`` level to all client's logger categories by:
1553+
1554+
.. code-block:: python
1555+
1556+
client = InfluxDBClient(url="http://localhost:8086", token="my-token", debug=True)
1557+
1558+
.. note::
1559+
1560+
Both HTTP request headers and body will be logged to standard output.
1561+
1562+
.. marker-logging-end
1563+
15191564
Local tests
15201565
-----------
15211566

docs/usage.rst

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,12 @@ How to use Asyncio
5858
:start-after: marker-asyncio-start
5959
:end-before: marker-asyncio-end
6060

61-
Debugging
62-
^^^^^^^^^
61+
Logging
62+
^^^^^^^
6363

64-
For debug purpose you can enable verbose logging of http requests.
65-
Both request header and body will be logged to standard output.
66-
67-
.. code-block:: python
68-
69-
_client = InfluxDBClient(url="http://localhost:8086", token="my-token", debug=True, org="my-org")
64+
.. include:: ../README.rst
65+
:start-after: marker-logging-start
66+
:end-before: marker-logging-end
7067

7168
Examples
7269
^^^^^^^^

influxdb_client/_async/rest.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
import io
1212
import json
13-
import logging
1413
import re
1514
import ssl
1615

@@ -22,8 +21,6 @@
2221
from influxdb_client.rest import ApiException
2322
from influxdb_client.rest import _UTF_8_encoding
2423

25-
logger = logging.getLogger(__name__)
26-
2724

2825
async def _on_request_start(session, trace_config_ctx, params):
2926
print(f">>> Request: '{params.method} {params.url}'")
@@ -229,9 +226,6 @@ async def request(self, method, url, query_params=None, headers=None,
229226
data = await r.read()
230227
r = RESTResponseAsync(r, data)
231228

232-
# log response body
233-
logger.debug("response body: %s", r.data)
234-
235229
if not 200 <= r.status <= 299:
236230
raise ApiException(http_resp=r)
237231

influxdb_client/_sync/rest.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
import io
1616
import json
17-
import logging
1817
import re
1918
import ssl
2019

@@ -30,9 +29,6 @@
3029
raise ImportError('OpenAPI Python client requires urllib3.')
3130

3231

33-
logger = logging.getLogger(__name__)
34-
35-
3632
class RESTResponse(io.IOBase):
3733
"""NOTE: This class is auto generated by OpenAPI Generator.
3834
@@ -247,9 +243,6 @@ def request(self, method, url, query_params=None, headers=None,
247243
if six.PY3:
248244
r.data = r.data.decode('utf8')
249245

250-
# log response body
251-
logger.debug("response body: %s", r.data)
252-
253246
if not 200 <= r.status <= 299:
254247
raise ApiException(http_resp=r)
255248

influxdb_client/client/_base.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import codecs
66
import configparser
77
import csv
8+
import logging
89
import os
910
from datetime import datetime, timedelta
1011
from typing import Iterator, List, Generator, Any, Union, Iterable, AsyncGenerator
@@ -29,11 +30,22 @@
2930
except ModuleNotFoundError:
3031
_HAS_DATACLASS = False
3132

33+
LOGGERS_NAMES = [
34+
'influxdb_client.client.influxdb_client',
35+
'influxdb_client.client.influxdb_client_async',
36+
'influxdb_client.client.write_api',
37+
'influxdb_client.client.write_api_async',
38+
'influxdb_client.client.write.retry',
39+
'influxdb_client.client.write.dataframe_serializer',
40+
'influxdb_client.client.util.multiprocessing_helper',
41+
'influxdb_client.client.exceptions'
42+
]
43+
3244

3345
# noinspection PyMethodMayBeStatic
3446
class _BaseClient(object):
3547
def __init__(self, url, token, debug=None, timeout=10_000, enable_gzip=False, org: str = None,
36-
default_tags: dict = None, **kwargs) -> None:
48+
default_tags: dict = None, http_client_logger: str = None, **kwargs) -> None:
3749
self.url = url
3850
self.token = token
3951
self.org = org
@@ -46,13 +58,17 @@ def __init__(self, url, token, debug=None, timeout=10_000, enable_gzip=False, or
4658
else:
4759
self.conf.host = self.url
4860
self.conf.enable_gzip = enable_gzip
49-
self.conf.debug = debug
5061
self.conf.verify_ssl = kwargs.get('verify_ssl', True)
5162
self.conf.ssl_ca_cert = kwargs.get('ssl_ca_cert', None)
5263
self.conf.proxy = kwargs.get('proxy', None)
5364
self.conf.proxy_headers = kwargs.get('proxy_headers', None)
5465
self.conf.connection_pool_maxsize = kwargs.get('connection_pool_maxsize', self.conf.connection_pool_maxsize)
5566
self.conf.timeout = timeout
67+
# logging
68+
self.conf.loggers["http_client_logger"] = logging.getLogger(http_client_logger)
69+
for client_logger in LOGGERS_NAMES:
70+
self.conf.loggers[client_logger] = logging.getLogger(client_logger)
71+
self.conf.debug = debug
5672

5773
auth_token = self.token
5874
self.auth_header_name = "Authorization"

influxdb_client/client/exceptions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from urllib3 import HTTPResponse
66

7-
logger = logging.getLogger(__name__)
7+
logger = logging.getLogger('influxdb_client.client.exceptions')
88

99

1010
class InfluxDBError(Exception):

influxdb_client/client/influxdb_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def __init__(self, url, token, debug=None, timeout=10_000, enable_gzip=False, or
5353
:key list[str] profilers: list of enabled Flux profilers
5454
"""
5555
super().__init__(url=url, token=token, debug=debug, timeout=timeout, enable_gzip=enable_gzip, org=org,
56-
default_tags=default_tags, **kwargs)
56+
default_tags=default_tags, http_client_logger="urllib3", **kwargs)
5757

5858
from .._sync.api_client import ApiClient
5959
self.api_client = ApiClient(configuration=self.conf, header_name=self.auth_header_name,

influxdb_client/client/influxdb_client_async.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from influxdb_client.client.write_api import PointSettings
1111
from influxdb_client.client.write_api_async import WriteApiAsync
1212

13-
logger = logging.getLogger('influxdb_client.client.influxdb_client')
13+
logger = logging.getLogger('influxdb_client.client.influxdb_client_async')
1414

1515

1616
class InfluxDBClientAsync(_BaseClient):
@@ -46,7 +46,8 @@ def __init__(self, url, token, org: str = None, debug=None, timeout=10_000, enab
4646
``aiohttp-retry``. :class:`~aiohttp.ClientSession` by default.
4747
:key list[str] profilers: list of enabled Flux profilers
4848
"""
49-
super().__init__(url=url, token=token, org=org, debug=debug, timeout=timeout, enable_gzip=enable_gzip, **kwargs)
49+
super().__init__(url=url, token=token, org=org, debug=debug, timeout=timeout, enable_gzip=enable_gzip,
50+
http_client_logger="aiohttp.client", **kwargs)
5051

5152
# compatibility with Python 3.6
5253
if sys.version_info[:2] >= (3, 7):

influxdb_client/client/util/multiprocessing_helper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from influxdb_client import InfluxDBClient, WriteOptions
1111
from influxdb_client.client.exceptions import InfluxDBError
1212

13-
logger = logging.getLogger(__name__)
13+
logger = logging.getLogger('influxdb_client.client.util.multiprocessing_helper')
1414

1515

1616
def _success_callback(conf: (str, str, str), data: str):

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy