Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add python logger #15

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
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: 2 additions & 0 deletions pygmab/python/gmab/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from gmab import logging
from gmab.gmab import Gmab
from gmab.search import GmabSearchCV
from gmab.study import Study, create_study

__all__ = [
"Gmab",
"GmabSearchCV",
"logging",
"Study",
"create_study",
]
65 changes: 65 additions & 0 deletions pygmab/python/gmab/logging.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import logging
import sys
from logging import CRITICAL, DEBUG, ERROR, INFO, WARNING

__all__ = [
"CRITICAL",
"DEBUG",
"ERROR",
"INFO",
"WARNING",
]

_default_handler: logging.Handler | None = None
_default_fmt: str = "[%(asctime)s] %(levelname)-8s - %(name)s - %(message)s"


def _get_library_root_logger() -> logging.Logger:
return logging.getLogger(__name__.split(".")[0])


def _configure_library_root_logger() -> None:
global _default_handler

if _default_handler:
return # This library has already configured the library root logger.

_default_handler = logging.StreamHandler(sys.stderr)
_default_handler.setFormatter(logging.Formatter(_default_fmt))
library_root_logger: logging.Logger = _get_library_root_logger()
library_root_logger.addHandler(_default_handler)
library_root_logger.setLevel(logging.INFO)
# library_root_logger.propagate = False


def get_logger(name: str) -> logging.Logger:
"""Return a logger with the specified name."""
_configure_library_root_logger()
return logging.getLogger(name)


def set_level(level: int) -> None:
"""Set the level for gmab's root logger.

Args:
verbosity:
Logging level, e.g., ``gmab.logging.DEBUG`` or ``gmab.logging.INFO``.

"""
_configure_library_root_logger()
_get_library_root_logger().setLevel(level)


def disable() -> None:
"""Disable the default handler of gmab's root logger"""
global _default_handler
if _default_handler:
library_root_logger: logging.Logger = _get_library_root_logger()
library_root_logger.removeHandler(_default_handler)
_default_handler = None


def enable() -> None:
"""Enable the default handler of gmab's root logger"""
_configure_library_root_logger()
_get_library_root_logger()
4 changes: 4 additions & 0 deletions pygmab/python/gmab/study/study.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
from collections.abc import Callable

from gmab import logging
from gmab.gmab import Gmab

_logger = logging.get_logger(__name__)


class Study:
"""A Study corresponds to an optimization task, i.e. a set of trials.
Expand Down Expand Up @@ -54,6 +57,7 @@ def optimize(
"""
gmab = Gmab(func, bounds)
self._best_trial = gmab.optimize(n_simulations)
_logger.info("completed")


def create_study() -> Study:
Expand Down
10 changes: 6 additions & 4 deletions pygmab/tests/study_tests/test_study.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import pytest

import gmab
import pytest
from pytest import LogCaptureFixture


def rosenbrock_function(number: list):
Expand All @@ -12,7 +12,7 @@ def rosenbrock_function(number: list):
)


def test_best_trial():
def test_best_trial(caplog: LogCaptureFixture):
study = gmab.create_study()

# best_trial requires running study.optimize()
Expand All @@ -22,5 +22,7 @@ def test_best_trial():
bounds = [(-5, 10), (-5, 10)]
n_simulations = 10_000
study.optimize(rosenbrock_function, bounds, n_simulations)
assert "completed" in caplog.text # integrates logging

result = study.best_trial
assert result == [1, 1]
assert result == [1, 1] # returns expected result
36 changes: 36 additions & 0 deletions pygmab/tests/test_logging.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from gmab import logging
from pytest import CaptureFixture, LogCaptureFixture


def test_get_logger(caplog: LogCaptureFixture) -> None:
logger = logging.get_logger("gmab.foo")

logger.info("hello")
assert "hello" in caplog.text # Checks logging with a simple example

logger.debug("bye")
assert "bye" not in caplog.text # DEBUG is not displayed per default


def test_set_level(caplog: LogCaptureFixture) -> None:
logger = logging.get_logger("gmab.foo")

logging.set_level(logging.DEBUG)
logger.debug("debug_msg")
assert "debug_msg" in caplog.text # level is set to DEBUG

logging.set_level(logging.CRITICAL)
logger.error("error_msg")
assert "error_msg" not in caplog.text # level is set to CRITICAL


def test_disable(capsys: CaptureFixture) -> None:
logger = logging.get_logger("gmab.foo")

logging.disable()
logger.info("hello")
assert "hello" not in capsys.readouterr().err # Logging is disabled

logging.enable()
logger.info("bye")
assert "bye" in capsys.readouterr().err # Logging is enabled
Loading