Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ client.get_boolean_flag("my-flag", False, flag_evaluation_options=options)

### Logging

Logging customization is not yet available in the Python SDK.
The OpenFeature SDK logs to the `openfeature` logger using the `logging` package from the Python Standard Library.

### Named clients

Expand Down
14 changes: 13 additions & 1 deletion openfeature/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
from openfeature.provider.no_op_provider import NoOpProvider
from openfeature.provider.provider import AbstractProvider

logger = logging.getLogger("openfeature")

GetDetailCallable = typing.Union[
typing.Callable[
[str, bool, typing.Optional[EvaluationContext]], FlagResolutionDetails[bool]
Expand Down Expand Up @@ -313,6 +315,12 @@ def evaluate_flag_details(
return flag_evaluation

except OpenFeatureError as err:
logger.exception(
"Error %s while evaluating flag with key: '%s'",
err.error_code,
flag_key,
)

error_hooks(flag_type, hook_context, err, reversed_merged_hooks, hook_hints)

return FlagEvaluationDetails(
Expand All @@ -325,6 +333,10 @@ def evaluate_flag_details(
# Catch any type of exception here since the user can provide any exception
# in the error hooks
except Exception as err: # pragma: no cover
logger.exception(
"Unable to correctly evaluate flag with key: '%s'", flag_key
)

error_hooks(flag_type, hook_context, err, reversed_merged_hooks, hook_hints)

error_message = getattr(err, "error_message", str(err))
Expand Down Expand Up @@ -363,7 +375,7 @@ def _create_provider_evaluation(
)

if not self.provider:
logging.info("No provider configured, using no-op provider.")
logger.info("No provider configured, using no-op provider.")
self.provider = NoOpProvider()

get_details_callables: typing.Mapping[FlagType, GetDetailCallable] = {
Expand Down
4 changes: 3 additions & 1 deletion openfeature/hook/hook_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
from openfeature.flag_evaluation import FlagEvaluationDetails, FlagType
from openfeature.hook import Hook, HookContext, HookType

logger = logging.getLogger("openfeature")


def error_hooks(
flag_type: FlagType,
Expand Down Expand Up @@ -128,5 +130,5 @@ def _execute_hook_checked(
getattr(hook, hook_method.value)(**kwargs),
)
except Exception: # pragma: no cover
logging.error(f"Exception when running {hook_method.value} hooks")
logger.exception(f"Exception when running {hook_method.value} hooks")
return None