API Reference¶
This reference documents the public API exported by azure_functions_logging.
Use this page together with:
- Configuration for setup behavior by environment.
- Usage Guide for complete implementation patterns.
- Examples for runnable snippets.
setup_logging¶
Configure logging for the current environment. Behavior depends on the detected environment:
- Azure / Core Tools: Installs
ContextFilteron the root logger's handlers only. Does NOT add handlers or modify the root logger level (respectshost.jsonconfiguration). Iffunctions_formatteris provided, it is applied to every root handler before the filter is added. - Standalone local development: Adds a
StreamHandlerwithColorFormatterorJsonFormatterto the specified logger (or root logger iflogger_nameis None). Sets the level.
This function is idempotent — calling it multiple times has no additional effect.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
level
|
int
|
Logging level for local development. Ignored in Azure/Core Tools. |
INFO
|
format
|
str
|
Log output format for local development. Supported values are
|
'color'
|
logger_name
|
str | None
|
Optional logger name to configure. When None, configures the root logger (local dev) or installs filter on root handlers (Azure). |
None
|
functions_formatter
|
Formatter | None
|
Optional custom formatter applied to all root handlers when running inside Azure/Core Tools. Useful for injecting a custom JSON formatter or third-party formatter without losing ContextFilter integration. |
None
|
Source code in src/azure_functions_logging/_setup.py
Usage Notes¶
- Call once during startup.
- Default format is
"color". - In Azure/Core Tools runtime, filter-only behavior avoids duplicate handlers.
Example¶
import logging
from azure_functions_logging import setup_logging
setup_logging(level=logging.INFO, format="json")
Example: Named Target Logger¶
Example: Invalid Format Handling¶
from azure_functions_logging import setup_logging
try:
setup_logging(format="pretty")
except ValueError:
pass
get_logger¶
Create a FunctionLogger wrapping a standard logging.Logger.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str | None
|
Logger name. Typically |
None
|
Returns:
| Type | Description |
|---|---|
FunctionLogger
|
A |
Source code in src/azure_functions_logging/__init__.py
Usage Notes¶
- Returns a
FunctionLoggerwrapper over a standard logger. - Pass
__name__for module-level identity. - Use the wrapper methods like standard logging methods.
Example¶
from azure_functions_logging import get_logger, setup_logging
setup_logging()
logger = get_logger(__name__)
logger.info("module logger ready")
Example: Root Logger Wrapper¶
from azure_functions_logging import get_logger, setup_logging
setup_logging()
root_logger = get_logger()
root_logger.warning("root logger event")
FunctionLogger¶
Wrapper around a standard logging.Logger with context binding.
FunctionLogger delegates all standard logging methods to the underlying
logger. The bind() method returns a new wrapper with additional context
fields that are merged into extra on each log call.
Context from bind() is supplementary to the ContextFilter-based
context (invocation_id, function_name, etc.) which is set globally via
inject_context().
Source code in src/azure_functions_logging/_logger.py
name
property
¶
Return the name of the underlying logger.
bind(**kwargs)
¶
Return a new FunctionLogger with additional bound context.
The returned logger shares the same underlying logging.Logger
but carries merged context fields. This is an immutable operation.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
**kwargs
|
Any
|
Context key-value pairs to bind. |
{}
|
Returns:
| Type | Description |
|---|---|
FunctionLogger
|
A new |
Source code in src/azure_functions_logging/_logger.py
clear_context()
¶
critical(msg, *args, **kwargs)
¶
debug(msg, *args, **kwargs)
¶
error(msg, *args, **kwargs)
¶
exception(msg, *args, **kwargs)
¶
Log an ERROR message with exception info.
getEffectiveLevel()
¶
info(msg, *args, **kwargs)
¶
isEnabledFor(level)
¶
setLevel(level)
¶
Usage Notes¶
bind()returns a new immutable logger wrapper with merged context.clear_context()clears bound context on that wrapper instance.- Logging methods mirror standard logger API.
Example: Binding Context¶
from azure_functions_logging import get_logger, setup_logging
setup_logging(format="json")
logger = get_logger("checkout")
request_logger = logger.bind(request_id="r-100", user_id="u-55")
request_logger.info("checkout started")
Example: Chained Binding¶
base = get_logger("service")
l1 = base.bind(tenant_id="tenant-a")
l2 = l1.bind(operation="import")
l2.info("import queued")
Example: Clearing Bound Context¶
log = get_logger("demo").bind(session="s-1")
log.info("before clear")
log.clear_context()
log.info("after clear")
Example: Exception Logging¶
log = get_logger("errors")
try:
raise RuntimeError("boom")
except RuntimeError:
log.exception("operation failed", phase="load")
JsonFormatter¶
Bases: Formatter
Structured JSON log formatter.
Output is newline-delimited JSON (NDJSON), with one JSON object per log line. Context fields (invocation_id, function_name, etc.) are included when present on the LogRecord (set by ContextFilter).
Source code in src/azure_functions_logging/_json_formatter.py
format(record)
¶
Format a log record as one NDJSON object.
Source code in src/azure_functions_logging/_json_formatter.py
Usage Notes¶
- Use indirectly via
setup_logging(format="json")for most cases. - Produces one JSON object per line (NDJSON style).
- Includes context fields when available on log records.
Example: Automatic Selection¶
from azure_functions_logging import get_logger, setup_logging
setup_logging(format="json")
logger = get_logger("api")
logger.info("json formatter active", version="v1")
Example: Manual Formatter Wiring¶
import logging
from azure_functions_logging import JsonFormatter, get_logger
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
target = logging.getLogger("manual")
target.handlers = [handler]
target.setLevel(logging.INFO)
logger = get_logger("manual")
logger.info("manual formatter configured")
inject_context¶
Set invocation context from an Azure Functions context object.
Extracts invocation_id, function_name, trace_id, and cold_start from the provided context and stores them in contextvars.
This function is safe to call with any object. Missing or inaccessible attributes are silently ignored (Principle 3: context injection failures never cause application failures).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
context
|
Any
|
An Azure Functions context object (func.Context). |
required |
Source code in src/azure_functions_logging/_context.py
Usage Notes¶
- Call at the start of every function invocation.
- Sets invocation metadata in context variables.
- Enables automatic cold start field in output.
Example: Azure Function Entrypoint¶
import azure.functions as func
from azure_functions_logging import get_logger, inject_context, setup_logging
setup_logging(format="json")
logger = get_logger(__name__)
app = func.FunctionApp()
@app.route(route="status")
def status(req: func.HttpRequest, context: func.Context) -> func.HttpResponse:
inject_context(context)
logger.info("status request")
return func.HttpResponse("ok")
Example: Safe with Partial Context Object¶
from azure_functions_logging import get_logger, inject_context, setup_logging
class PartialContext:
invocation_id = "local-123"
setup_logging(format="json")
logger = get_logger("partial")
inject_context(PartialContext())
logger.info("partial context accepted")
End-to-End API Example¶
import logging
import azure.functions as func
from azure_functions_logging import get_logger, inject_context, setup_logging
setup_logging(level=logging.INFO, format="json")
logger = get_logger(__name__)
app = func.FunctionApp()
@app.route(route="orders")
def orders(req: func.HttpRequest, context: func.Context) -> func.HttpResponse:
inject_context(context)
req_logger = logger.bind(route="/orders", method=req.method)
req_logger.info("orders request started")
req_logger.info("orders request completed")
return func.HttpResponse("ok")