main
 1import os
 2import logging
 3from typing_extensions import override
 4
 5from ._utils import is_dict
 6
 7logger: logging.Logger = logging.getLogger("openai")
 8httpx_logger: logging.Logger = logging.getLogger("httpx")
 9
10
11SENSITIVE_HEADERS = {"api-key", "authorization"}
12
13
14def _basic_config() -> None:
15    # e.g. [2023-10-05 14:12:26 - openai._base_client:818 - DEBUG] HTTP Request: POST http://127.0.0.1:4010/foo/bar "200 OK"
16    logging.basicConfig(
17        format="[%(asctime)s - %(name)s:%(lineno)d - %(levelname)s] %(message)s",
18        datefmt="%Y-%m-%d %H:%M:%S",
19    )
20
21
22def setup_logging() -> None:
23    env = os.environ.get("OPENAI_LOG")
24    if env == "debug":
25        _basic_config()
26        logger.setLevel(logging.DEBUG)
27        httpx_logger.setLevel(logging.DEBUG)
28    elif env == "info":
29        _basic_config()
30        logger.setLevel(logging.INFO)
31        httpx_logger.setLevel(logging.INFO)
32
33
34class SensitiveHeadersFilter(logging.Filter):
35    @override
36    def filter(self, record: logging.LogRecord) -> bool:
37        if is_dict(record.args) and "headers" in record.args and is_dict(record.args["headers"]):
38            headers = record.args["headers"] = {**record.args["headers"]}
39            for header in headers:
40                if str(header).lower() in SENSITIVE_HEADERS:
41                    headers[header] = "<redacted>"
42        return True