Warning:
Fauna is decommissioning FQL v4 on June 30, 2025.

This driver is not compatible with FQL v10, the latest version. Fauna accounts created after August 21, 2024 must use FQL v10.
Ensure you migrate existing projects to the official v10 driver by the v4 EOL date: https://github.com/fauna/fauna-python.

For more information, see the v4 end of life (EOL) announcement and related FAQ.

Module faunadb.client_logger

Expand source code
from faunadb._json import to_json


def logger(logger_func):
  """
  Function that can be the ``observer`` for a :any:`FaunaClient`.
  Will call ``logger_func`` on a string representation of each :any:`RequestResult`.

  Use it like::

    def log(logged):
      print logged
    client = FaunaClient(observer=logger(log), ...)
    client.ping() # Calls `log`

  :param logger_func: Callback taking a string to be logged.
  """
  return lambda request_result: logger_func(show_request_result(request_result))


def show_request_result(request_result):
  """Translates a :any:`RequestResult` to a string suitable for logging."""
  rr = request_result
  parts = []
  log = parts.append

  def _indent(s):
    """Adds extra spaces to the beginning of every newline."""
    indent_str = "  "
    return ("\n" + indent_str).join(s.split("\n"))

  if rr.query:
    query_string = "?" + "&".join(("%s=%s" % (k, v) for k, v in sorted(rr.query.items())))
  else:
    query_string = ""

  log("Fauna %s /%s%s\n" % (rr.method, rr.path, query_string))
  if rr.request_content is not None:
    log("  Request JSON: %s\n" % _indent(to_json(rr.request_content, pretty=True)))
  log("  Response headers: %s\n" % _indent(to_json(dict(rr.response_headers), pretty=True)))
  log("  Response JSON: %s\n" % _indent(to_json(rr.response_content, pretty=True)))
  log("  Response (%i): Network latency %ims\n" % (rr.status_code, int(rr.time_taken * 1000)))

  return u"".join(parts)

Functions

def logger(logger_func)

Function that can be the observer for a :any:FaunaClient. Will call logger_func on a string representation of each :any:RequestResult.

Use it like::

def log(logged): print logged client = FaunaClient(observer=logger(log), …) client.ping() # Calls log

:param logger_func: Callback taking a string to be logged.

Expand source code
def logger(logger_func):
  """
  Function that can be the ``observer`` for a :any:`FaunaClient`.
  Will call ``logger_func`` on a string representation of each :any:`RequestResult`.

  Use it like::

    def log(logged):
      print logged
    client = FaunaClient(observer=logger(log), ...)
    client.ping() # Calls `log`

  :param logger_func: Callback taking a string to be logged.
  """
  return lambda request_result: logger_func(show_request_result(request_result))
def show_request_result(request_result)

Translates a :any:RequestResult to a string suitable for logging.

Expand source code
def show_request_result(request_result):
  """Translates a :any:`RequestResult` to a string suitable for logging."""
  rr = request_result
  parts = []
  log = parts.append

  def _indent(s):
    """Adds extra spaces to the beginning of every newline."""
    indent_str = "  "
    return ("\n" + indent_str).join(s.split("\n"))

  if rr.query:
    query_string = "?" + "&".join(("%s=%s" % (k, v) for k, v in sorted(rr.query.items())))
  else:
    query_string = ""

  log("Fauna %s /%s%s\n" % (rr.method, rr.path, query_string))
  if rr.request_content is not None:
    log("  Request JSON: %s\n" % _indent(to_json(rr.request_content, pretty=True)))
  log("  Response headers: %s\n" % _indent(to_json(dict(rr.response_headers), pretty=True)))
  log("  Response JSON: %s\n" % _indent(to_json(rr.response_content, pretty=True)))
  log("  Response (%i): Network latency %ims\n" % (rr.status_code, int(rr.time_taken * 1000)))

  return u"".join(parts)