Lancetnik / Propan

Propan is a powerful and easy-to-use Python framework for building event-driven applications that interact with any MQ Broker
https://lancetnik.github.io/Propan/
MIT License
486 stars 28 forks source link

Logging error when using `broker.publish` from within `after_startup` #28

Closed chrisgoddard closed 1 year ago

chrisgoddard commented 1 year ago

Exception generated by using broker.publish

@app.after_startup
async def setup(
    logger: Logger,
    broker: RabbitBroker,
):
    r = await broker.publish(
        FetchJob(url="https://example.com"),
        queue='fetch',
    )

Results in this error:


(edgepath-py3.11) chrisgoddard@Chriss-MacBook-Pro ~/C/E/project (main) [1]> propan run project.services.serve:app
08:28:29.168 | DEBUG   | 67154:MainThread | prefect.profiles - Using profile 'local'
2023-05-30 08:28:29,296 INFO     - Propan app starting...
--- Logging error ---
Traceback (most recent call last):
  File "/usr/local/Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/logging/__init__.py", line 449, in format
    return self._format(record)
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/logging/__init__.py", line 445, in _format
    return self._fmt % values
           ~~~~~~~~~~^~~~~~~~
KeyError: 'exchange'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/logging/__init__.py", line 1110, in emit
    msg = self.format(record)
          ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/logging/__init__.py", line 953, in format
    return fmt.format(record)
           ^^^^^^^^^^^^^^^^^^
  File "/usr/local/Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/logging/__init__.py", line 690, in format
    s = self.formatMessage(record)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "project/.venv/lib/python3.11/site-packages/propan/log/formatter.py", line 79, in formatMessage
    return super().formatMessage(record)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "project/.venv/lib/python3.11/site-packages/propan/log/formatter.py", line 67, in formatMessage
    return super().formatMessage(record)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/logging/__init__.py", line 659, in formatMessage
    return self._style.format(record)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/logging/__init__.py", line 451, in format
    raise ValueError('Formatting field not found in record: %s' % e)
ValueError: Formatting field not found in record: 'exchange'
Call stack:
  File "project/.venv/bin/propan", line 8, in <module>
    sys.exit(cli())
  File "project/.venv/lib/python3.11/site-packages/typer/main.py", line 311, in __call__
    return get_command(self)(*args, **kwargs)
  File "project/.venv/lib/python3.11/site-packages/click/core.py", line 1130, in __call__
    return self.main(*args, **kwargs)
  File "project/.venv/lib/python3.11/site-packages/typer/core.py", line 778, in main
    return _main(
  File "project/.venv/lib/python3.11/site-packages/typer/core.py", line 216, in _main
    rv = self.invoke(ctx)
  File "project/.venv/lib/python3.11/site-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "project/.venv/lib/python3.11/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "project/.venv/lib/python3.11/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "project/.venv/lib/python3.11/site-packages/typer/main.py", line 683, in wrapper
    return callback(**use_params)  # type: ignore
  File "project/.venv/lib/python3.11/site-packages/propan/cli/main.py", line 99, in run
    _run(module=module, app=app, extra_options=extra, log_level=casted_log_level)
  File "project/.venv/lib/python3.11/site-packages/propan/cli/main.py", line 133, in _run
    asyncio.run(propan_app.run(log_level=app_level))
  File "/usr/local/Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/runners.py", line 190, in run
    return runner.run(main)
  File "/usr/local/Cellar/python@3.11/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
  File "project/.venv/lib/python3.11/site-packages/propan/cli/app.py", line 81, in _start
    await self._startup()
  File "project/.venv/lib/python3.11/site-packages/propan/cli/app.py", line 103, in _startup
    await func()
  File "project/.venv/lib/python3.11/site-packages/fast_depends/usage.py", line 74, in async_typed_wrapper
    await run_async(dependant.call, **solved_result)
  File "project/.venv/lib/python3.11/site-packages/fast_depends/utils.py", line 36, in run_async
    r = await func(*args, **kwargs)
  File "project/.venv/lib/python3.11/site-packages/propan/utils/functions.py", line 20, in wrapper
    r = await call_or_await(func, *args, **kwargs)
  File "project/.venv/lib/python3.11/site-packages/fast_depends/utils.py", line 36, in run_async
    r = await func(*args, **kwargs)
  File "project/edgepath/services/serve.py", line 45, in setup
    logger.info(r)
Message: <Basic.Ack object at 0x114fb7a20>
Arguments: ()```