Skip to content
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
8 changes: 2 additions & 6 deletions docs/snippets/static14.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,11 @@
from fastcs.controllers import Controller
from fastcs.datatypes import Enum, Float, Int, String
from fastcs.launch import FastCS
from fastcs.logging import bind_logger, configure_logging
from fastcs.logging import configure_logging, logger
from fastcs.methods import command, scan
from fastcs.transports.epics import EpicsGUIOptions, EpicsIOCOptions
from fastcs.transports.epics.ca import EpicsCATransport

logger = bind_logger(__name__)

NumberT = TypeVar("NumberT", int, float)


Expand All @@ -33,8 +31,6 @@ class TemperatureControllerAttributeIO(
def __init__(self, connection: IPConnection, suffix: str = ""):
super().__init__()

self.logger = bind_logger(__class__.__name__)

self._connection = connection
self._suffix = suffix

Expand All @@ -49,7 +45,7 @@ async def send(
) -> None:
command = f"{attr.io_ref.name}{self._suffix}={attr.dtype(value)}"

self.logger.info("Sending attribute value", command=command, attribute=attr)
logger.info("Sending attribute value", command=command, attribute=attr)

await self._connection.send_command(f"{command}\r\n")

Expand Down
8 changes: 2 additions & 6 deletions docs/snippets/static15.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,11 @@
from fastcs.controllers import Controller
from fastcs.datatypes import Enum, Float, Int, String
from fastcs.launch import FastCS
from fastcs.logging import LogLevel, bind_logger, configure_logging
from fastcs.logging import LogLevel, configure_logging, logger
from fastcs.methods import command, scan
from fastcs.transports.epics import EpicsGUIOptions, EpicsIOCOptions
from fastcs.transports.epics.ca import EpicsCATransport

logger = bind_logger(__name__)

NumberT = TypeVar("NumberT", int, float)


Expand All @@ -33,8 +31,6 @@ class TemperatureControllerAttributeIO(
def __init__(self, connection: IPConnection, suffix: str = ""):
super().__init__()

self.logger = bind_logger(__class__.__name__)

self._connection = connection
self._suffix = suffix

Expand All @@ -52,7 +48,7 @@ async def send(
) -> None:
command = f"{attr.io_ref.name}{self._suffix}={attr.dtype(value)}"

self.logger.info("Sending attribute value", command=command, attribute=attr)
logger.info("Sending attribute value", command=command, attribute=attr)

await self._connection.send_command(f"{command}\r\n")

Expand Down
7 changes: 2 additions & 5 deletions docs/tutorials/static-drivers.md
Original file line number Diff line number Diff line change
Expand Up @@ -409,10 +409,7 @@ DEMO:R1:Enabled_RBV Off

FastCS has convenient logging support to provide status and metrics from the
application. To enable logging from the core framework call `configure_logging` with no
arguments (the default logging level is INFO). To log messages from a driver, either
import the singleton `logger` directly, or to provide more context to the message, call
`bind_logger` with a name (usually either the name of the module or the name of the
class).
arguments (the default logging level is INFO). To log messages from a driver, import the singleton `logger` directly.

Create a module-level logger to log status of the application start up. Create a class
logger for `TemperatureControllerAttributeIO` to log the commands it sends.
Expand All @@ -421,7 +418,7 @@ logger for `TemperatureControllerAttributeIO` to log the commands it sends.
:class: dropdown, hint

:::{literalinclude} /snippets/static14.py
:emphasize-lines: 15,20-21,53-55,116,123
:emphasize-lines: 13,51,113,120
:::

::::
Expand Down
5 changes: 1 addition & 4 deletions src/fastcs/attributes/attr_r.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@
from fastcs.attributes.attribute_io_ref import AttributeIORefT
from fastcs.attributes.util import AttrValuePredicate, PredicateEvent
from fastcs.datatypes import DataType, DType_T
from fastcs.logging import bind_logger

logger = bind_logger(logger_name=__name__)

from fastcs.logging import logger

AttrIOUpdateCallback = Callable[["AttrR[DType_T, Any]"], Awaitable[None]]
"""An AttributeIO callback that takes an AttrR and updates its value"""
Expand Down
3 changes: 0 additions & 3 deletions src/fastcs/attributes/attr_rw.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
from fastcs.attributes.attribute import AttributeAccessMode
from fastcs.attributes.attribute_io_ref import AttributeIORefT
from fastcs.datatypes import DataType, DType_T
from fastcs.logging import bind_logger

logger = bind_logger(logger_name=__name__)


class AttrRW(AttrR[DType_T, AttributeIORefT], AttrW[DType_T, AttributeIORefT]):
Expand Down
5 changes: 1 addition & 4 deletions src/fastcs/attributes/attr_w.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
from fastcs.attributes.attribute import Attribute, AttributeAccessMode
from fastcs.attributes.attribute_io_ref import AttributeIORefT
from fastcs.datatypes import DataType, DType_T
from fastcs.logging import bind_logger

logger = bind_logger(logger_name=__name__)

from fastcs.logging import logger

AttrOnPutCallback = Callable[["AttrW[DType_T, Any]", DType_T], Awaitable[None]]
"""Callbacks to be called when the setpoint of an attribute is changed"""
Expand Down
3 changes: 0 additions & 3 deletions src/fastcs/attributes/attribute.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@

from fastcs.attributes.attribute_io_ref import AttributeIORefT
from fastcs.datatypes import DataType, DType, DType_T
from fastcs.logging import bind_logger
from fastcs.tracer import Tracer

logger = bind_logger(logger_name=__name__)

AttributeAccessMode = Literal["r", "w", "rw"]


Expand Down
3 changes: 1 addition & 2 deletions src/fastcs/control_system.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@
from IPython.terminal.embed import InteractiveShellEmbed

from fastcs.controllers import BaseController, Controller
from fastcs.logging import bind_logger
from fastcs.logging import logger
from fastcs.methods import ScanCallback
from fastcs.tracer import Tracer
from fastcs.transports import ControllerAPI, Transport

tracer = Tracer(name=__name__)
logger = bind_logger(logger_name=__name__)


class FastCS:
Expand Down
4 changes: 1 addition & 3 deletions src/fastcs/controllers/base_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@
from typing import _GenericAlias, get_args, get_origin, get_type_hints # type: ignore

from fastcs.attributes import AnyAttributeIO, Attribute, AttrR, AttrW, HintedAttribute
from fastcs.logging import bind_logger
from fastcs.logging import logger
from fastcs.methods import Command, Scan, UnboundCommand, UnboundScan
from fastcs.tracer import Tracer

logger = bind_logger(logger_name=__name__)


class BaseController(Tracer):
"""Base class for controllers
Expand Down
14 changes: 1 addition & 13 deletions src/fastcs/logging/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from ._graylog import GraylogStaticFields as GraylogStaticFields
from ._graylog import parse_graylog_env_fields as parse_graylog_env_fields
from ._graylog import parse_graylog_static_fields as parse_graylog_static_fields
from ._logging import Logger, LogLevel, _configure_logger
from ._logging import LogLevel, _configure_logger

logger = _logger.bind(logger_name="fastcs")
"""FastCS logger
Expand Down Expand Up @@ -57,18 +57,6 @@
"""


def bind_logger(logger_name: str) -> Logger:
"""Create a wrapper of the singleton fastcs logger with the given name bound

The name will be displayed in all log messages from the returned wrapper.

See the docstring for ``fastcs.logging.logger`` for more information.

"""

return logger.bind(logger_name=logger_name)


def configure_logging(
level: LogLevel = LogLevel.INFO,
graylog_endpoint: GraylogEndpoint | None = None,
Expand Down
3 changes: 2 additions & 1 deletion src/fastcs/logging/_logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ def format_record(record) -> str:

return f"""\
<level>[{time} {record["level"].name[0]}]</level> \
{record["message"]:<80} \
{record["message"]} \
{f"[{record['file'].path}:{record['line']}]":<80} \
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The padding (:<80) should be on the message, not the file path / line.

<green>[{name}]</green> \
{extras}
{{exception}}\
Expand Down
3 changes: 1 addition & 2 deletions src/fastcs/methods/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@
from types import MethodType
from typing import TYPE_CHECKING

from fastcs.logging import bind_logger
from fastcs.logging import logger
from fastcs.methods.method import Controller_T, Method

if TYPE_CHECKING:
from fastcs.controllers import BaseController # noqa: F401

logger = bind_logger(logger_name=__name__)

UnboundCommandCallback = Callable[[Controller_T], Coroutine[None, None, None]]
"""A Command callback that is unbound and must be called with a `Controller` instance"""
Expand Down
3 changes: 1 addition & 2 deletions src/fastcs/methods/scan.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@
from types import MethodType
from typing import TYPE_CHECKING

from fastcs.logging import bind_logger
from fastcs.logging import logger
from fastcs.methods.method import Controller_T, Method

if TYPE_CHECKING:
from fastcs.controllers import BaseController # noqa: F401

logger = bind_logger(logger_name=__name__)

UnboundScanCallback = Callable[[Controller_T], Coroutine[None, None, None]]
"""A Scan callback that is unbound and must be called with a `Controller` instance"""
Expand Down
2 changes: 0 additions & 2 deletions src/fastcs/transports/controller_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@
from dataclasses import dataclass, field

from fastcs.attributes import Attribute, AttributeIORef, AttrR
from fastcs.logging import bind_logger
from fastcs.methods import Command, Scan, ScanCallback
from fastcs.tracer import Tracer
from fastcs.util import ONCE

tracer = Tracer(name=__name__)
logger = bind_logger(logger_name=__name__)


@dataclass
Expand Down
3 changes: 1 addition & 2 deletions src/fastcs/transports/epics/ca/ioc.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from fastcs.attributes import AttrR, AttrRW, AttrW
from fastcs.datatypes import DataType, DType_T
from fastcs.datatypes.waveform import Waveform
from fastcs.logging import bind_logger
from fastcs.logging import logger
from fastcs.methods import Command
from fastcs.tracer import Tracer
from fastcs.transports.controller_api import ControllerAPI
Expand All @@ -28,7 +28,6 @@


tracer = Tracer(name=__name__)
logger = bind_logger(logger_name=__name__)


class EpicsCAIOC:
Expand Down
4 changes: 1 addition & 3 deletions src/fastcs/transports/epics/ca/transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from softioc import softioc

from fastcs.logging import bind_logger
from fastcs.logging import logger
from fastcs.transports.controller_api import ControllerAPI
from fastcs.transports.epics import (
EpicsDocsOptions,
Expand All @@ -16,8 +16,6 @@
from fastcs.transports.epics.gui import EpicsGUI
from fastcs.transports.transport import Transport

logger = bind_logger(logger_name=__name__)


@dataclass
class EpicsCATransport(Transport):
Expand Down
4 changes: 1 addition & 3 deletions src/fastcs/transports/epics/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,12 @@
String,
Waveform,
)
from fastcs.logging import bind_logger
from fastcs.logging import logger
from fastcs.methods import Command
from fastcs.transports.controller_api import ControllerAPI
from fastcs.transports.epics.options import EpicsGUIFormat, EpicsGUIOptions
from fastcs.util import snake_to_pascal

logger = bind_logger(logger_name=__name__)


class EpicsGUI:
"""For creating gui in the EPICS transports."""
Expand Down
4 changes: 1 addition & 3 deletions src/fastcs/transports/epics/pva/transport.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import asyncio
from dataclasses import dataclass, field

from fastcs.logging import bind_logger
from fastcs.logging import logger
from fastcs.transports.controller_api import ControllerAPI
from fastcs.transports.epics import (
EpicsDocsOptions,
Expand All @@ -14,8 +14,6 @@

from .ioc import P4PIOC

logger = bind_logger(logger_name=__name__)


@dataclass
class EpicsPVATransport(Transport):
Expand Down