Adjust `tractor.log` API compat

Update logging helpers to use new `tractor.log` API with `pkg_name=`
kwarg and add optional `tractor` "root logger" enabling.

Deats,
- change `piker.log.get_logger()` to use `pkg_name=` vs `_root_name=`.
- add `**tractor_log_kwargs` passthrough to both wrapper fns.
- add `with_tractor_log: bool` toggle to `.get_console_log()`.
- strip `'piker.'` prefix from logger names when present to avoid
  newly added `tractor.get_logger()` warnings.

Surroundingly,
- add `subsys` import to `.clearing._ems` for log name
- update all `get_console_log()` calls to use `level=` kwarg
- add assertion checks for logger names in `_setup_persistent_emsd()`

Additionally,,
- fix all type annotations: `str|None` vs `str | None`.
- add multiline style to conditional in `.cli.services()`.
- drop unused `Optional` import from `._actor_runtime`.
- drop a few "blank lines" in various function sigs.

Warning: this patch will require an equivalent dev-commit at the time of
writing in `tractor` itself, for now the `piker_pin` branch should be
sufficient to avoid breakage 🙏!

(this commit msg was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code

k
fix_tractor_logging
Gud Boi 2026-02-06 00:33:05 -05:00
parent ce1f038b53
commit 68a87ca45f
6 changed files with 84 additions and 31 deletions

View File

@ -47,6 +47,7 @@ from tractor import trionics
from ._util import ( from ._util import (
log, # sub-sys logger log, # sub-sys logger
get_console_log, get_console_log,
subsys,
) )
from ..accounting._mktinfo import ( from ..accounting._mktinfo import (
unpack_fqme, unpack_fqme,
@ -136,7 +137,7 @@ class DarkBook(Struct):
tuple[ tuple[
Callable[[float], bool], # predicate Callable[[float], bool], # predicate
tuple[str, ...], # tickfilter tuple[str, ...], # tickfilter
dict | Order, # cmd / msg type dict|Order, # cmd / msg type
# live submission constraint parameters # live submission constraint parameters
float, # percent_away max price diff float, # percent_away max price diff
@ -278,7 +279,7 @@ async def clear_dark_triggers(
# remove exec-condition from set # remove exec-condition from set
log.info(f'Removing trigger for {oid}') log.info(f'Removing trigger for {oid}')
trigger: tuple | None = execs.pop(oid, None) trigger: tuple|None = execs.pop(oid, None)
if not trigger: if not trigger:
log.warning( log.warning(
f'trigger for {oid} was already removed!?' f'trigger for {oid} was already removed!?'
@ -336,8 +337,8 @@ async def open_brokerd_dialog(
brokermod: ModuleType, brokermod: ModuleType,
portal: tractor.Portal, portal: tractor.Portal,
exec_mode: str, exec_mode: str,
fqme: str | None = None, fqme: str|None = None,
loglevel: str | None = None, loglevel: str|None = None,
) -> tuple[ ) -> tuple[
tractor.MsgStream, tractor.MsgStream,
@ -761,12 +762,16 @@ _router: Router = None
@tractor.context @tractor.context
async def _setup_persistent_emsd( async def _setup_persistent_emsd(
ctx: tractor.Context, ctx: tractor.Context,
loglevel: str | None = None, loglevel: str|None = None,
) -> None: ) -> None:
if loglevel: if loglevel:
get_console_log(loglevel) _log = get_console_log(
level=loglevel,
name=subsys,
)
assert _log.name == 'piker.clearing'
global _router global _router
@ -822,7 +827,7 @@ async def translate_and_relay_brokerd_events(
f'Rx brokerd trade msg:\n' f'Rx brokerd trade msg:\n'
f'{fmsg}' f'{fmsg}'
) )
status_msg: Status | None = None status_msg: Status|None = None
match brokerd_msg: match brokerd_msg:
# BrokerdPosition # BrokerdPosition
@ -1283,7 +1288,7 @@ async def process_client_order_cmds(
and status.resp == 'dark_open' and status.resp == 'dark_open'
): ):
# remove from dark book clearing # remove from dark book clearing
entry: tuple | None = dark_book.triggers[fqme].pop(oid, None) entry: tuple|None = dark_book.triggers[fqme].pop(oid, None)
if entry: if entry:
( (
pred, pred,

View File

@ -28,12 +28,14 @@ from ..log import (
from piker.types import Struct from piker.types import Struct
subsys: str = 'piker.clearing' subsys: str = 'piker.clearing'
log = get_logger(subsys) log = get_logger(
name='piker.clearing',
)
# TODO, oof doesn't this ignore the `loglevel` then??? # TODO, oof doesn't this ignore the `loglevel` then???
get_console_log = partial( get_console_log = partial(
get_console_log, get_console_log,
name=subsys, name='clearing',
) )

View File

@ -136,7 +136,10 @@ def pikerd(
''' '''
# from tractor.devx import maybe_open_crash_handler # from tractor.devx import maybe_open_crash_handler
# with maybe_open_crash_handler(pdb=False): # with maybe_open_crash_handler(pdb=False):
log = get_console_log(loglevel, name='cli') log = get_console_log(
level=loglevel,
with_tractor_log=tl,
)
if pdb: if pdb:
log.warning(( log.warning((
@ -295,7 +298,11 @@ def cli(
@click.option('--tl', is_flag=True, help='Enable tractor logging') @click.option('--tl', is_flag=True, help='Enable tractor logging')
@click.argument('ports', nargs=-1, required=False) @click.argument('ports', nargs=-1, required=False)
@click.pass_obj @click.pass_obj
def services(config, tl, ports): def services(
config,
tl: bool,
ports,
):
from ..service import ( from ..service import (
open_piker_runtime, open_piker_runtime,
@ -316,7 +323,11 @@ def services(config, tl, ports):
async with ( async with (
open_piker_runtime( open_piker_runtime(
name='service_query', name='service_query',
loglevel=config['loglevel'] if tl else None, loglevel=(
config['loglevel']
if tl
else None,
),
), ),
tractor.get_registry( tractor.get_registry(
addr=addr, addr=addr,

View File

@ -26,7 +26,9 @@ from ..log import (
) )
subsys: str = 'piker.data' subsys: str = 'piker.data'
log = get_logger(subsys) log = get_logger(
name=subsys,
)
get_console_log = partial( get_console_log = partial(
get_console_log, get_console_log,

View File

@ -37,35 +37,69 @@ _proj_name: str = 'piker'
def get_logger( def get_logger(
name: str = None, name: str|None = None,
**tractor_log_kwargs,
) -> logging.Logger: ) -> logging.Logger:
''' '''
Return the package log or a sub-log for `name` if provided. Return the package log or a sub-logger if a `name=` is provided,
which defaults to the calling module's pkg-namespace path.
See `tractor.log.get_logger()` for details.
''' '''
pkg_name: str = _proj_name
if (
name
and
pkg_name in name
):
name: str = name.lstrip(f'{_proj_name}.')
return tractor.log.get_logger( return tractor.log.get_logger(
name=name, name=name,
_root_name=_proj_name, pkg_name=pkg_name,
**tractor_log_kwargs,
) )
def get_console_log( def get_console_log(
level: str | None = None, level: str|None = None,
name: str | None = None, name: str|None = None,
pkg_name: str|None = None,
with_tractor_log: bool = False,
**tractor_log_kwargs,
) -> logging.Logger: ) -> logging.Logger:
''' '''
Get the package logger and enable a handler which writes to stderr. Get the package logger and enable a handler which writes to
stderr.
Yeah yeah, i know we can use ``DictConfig``. You do it... Yeah yeah, i know we can use `DictConfig`.
You do it.. Bp
''' '''
pkg_name: str = _proj_name
if (
name
and
pkg_name in name
):
name: str = name.lstrip(f'{_proj_name}.')
if with_tractor_log:
t_log = tractor.log.get_console_log(
level=level,
name='tractor', # <- XXX, force root tractor log!
**tractor_log_kwargs,
)
# TODO/ allow only enabling certain tractor sub-logs?
assert t_log.name == 'tractor'
return tractor.log.get_console_log( return tractor.log.get_console_log(
level, level=level,
name=name, name=name,
_root_name=_proj_name, pkg_name=pkg_name,
) # our root logger **tractor_log_kwargs,
)
def colorize_json( def colorize_json(

View File

@ -21,7 +21,6 @@
from __future__ import annotations from __future__ import annotations
import os import os
from typing import ( from typing import (
Optional,
Any, Any,
ClassVar, ClassVar,
) )
@ -59,7 +58,7 @@ async def open_piker_runtime(
registry_addrs: list[tuple[str, int]] = [], registry_addrs: list[tuple[str, int]] = [],
enable_modules: list[str] = [], enable_modules: list[str] = [],
loglevel: Optional[str] = None, loglevel: str|None = None,
# XXX NOTE XXX: you should pretty much never want debug mode # XXX NOTE XXX: you should pretty much never want debug mode
# for data daemons when running in production. # for data daemons when running in production.
@ -163,8 +162,7 @@ _root_modules: list[str] = [
@acm @acm
async def open_pikerd( async def open_pikerd(
registry_addrs: list[tuple[str, int]], registry_addrs: list[tuple[str, int]],
loglevel: str|None = None,
loglevel: str | None = None,
# XXX: you should pretty much never want debug mode # XXX: you should pretty much never want debug mode
# for data daemons when running in production. # for data daemons when running in production.
@ -192,7 +190,6 @@ async def open_pikerd(
async with ( async with (
open_piker_runtime( open_piker_runtime(
name=_root_dname, name=_root_dname,
loglevel=loglevel, loglevel=loglevel,
debug_mode=debug_mode, debug_mode=debug_mode,
@ -273,7 +270,9 @@ async def maybe_open_pikerd(
''' '''
if loglevel: if loglevel:
get_console_log(loglevel) get_console_log(
level=loglevel
)
# subtle, we must have the runtime up here or portal lookup will fail # subtle, we must have the runtime up here or portal lookup will fail
query_name = kwargs.pop( query_name = kwargs.pop(