API to log information

Hi, I’m writing an addon (syntax-highlighting-ng) and I wonder if there’s an API to log messages to anki.log.
From looking at the code it seems there’s a logging system in rust (eg. Collection.initialize_backend_logging) but it is not clear to me how is linked to the python logging or how to use: any hint please?
Thanks

1 Like

I’d advice against writing to anki.log. Instead, I recommend simply logging to a file in your add-on’s folder (under the user_files subfolder).

Mmm, I was hoping there was a centralized logging mechanism/dispatch.

The logging framework allows that (and dispatching to an different streams, that can be module depend). Something like:

(somewhere in the main aqt._run)

if __name__ == "__main__":
   logging.basicConfig() # or replace with whatever anki config mechanism is in place

So each module can independently log info like
(in my addon modules)

log = logging.getLogger(f"addon.{__name__}")
...
log.info("a message from the addon")

I could write a PR for it, but I’m not familiar with the rust bridge part (I see it might be used for logging).
Does this make sense?

Anki’s backend logging mechanism is intended for Anki’s own use in the Rust side, but you have to ask @dae about exposing it or adding a centralized logging interface that add-ons can use.

I personally use a utility function to set up a logger using Python’s logging module and save logs to user_files.

1 Like

Hi, I’ve placed a PR (anki/pull/2969) to include python logging in the anki. It’s heavily inspired by ankiutils.log.

Ideally that code should be part of the “framework” not depending on (optional) external modules, eg.
something like this at the top of the addon:

logger = mw.addonManager.getLogger(__name__)

It doesn’t work for me.

Anki 23.12.1 (1a1d4d54)  (ao)
Python 3.9.15 Qt 6.5.3 PyQt 6.5.3
Platform: macOS-13.3.1-arm64-arm-64bit

Traceback (most recent call last):
  File "aqt.taskman", line 142, in _on_closures_pending
  File "aqt.taskman", line 86, in <lambda>
  File "/Users/jarrettye/Library/Application Support/Anki2/addons21/759844606/schedule/disperse_siblings.py", line 155, in on_done
    tooltip(f"{future.result()} in {time.time() - start_time:.2f} seconds")
  File "concurrent.futures._base", line 439, in result
  File "concurrent.futures._base", line 391, in __get_result
  File "concurrent.futures.thread", line 58, in run
  File "/Users/jarrettye/Library/Application Support/Anki2/addons21/759844606/schedule/disperse_siblings.py", line 160, in <lambda>
    lambda: disperse_siblings_backgroud(
  File "/Users/jarrettye/Library/Application Support/Anki2/addons21/759844606/schedule/disperse_siblings.py", line 188, in disperse_siblings_backgroud
    best_due_dates, _, _ = disperse(siblings)
  File "/Users/jarrettye/Library/Application Support/Anki2/addons21/759844606/schedule/disperse_siblings.py", line 137, in disperse
    with open("disperse_logs.txt", "a") as f:
OSError: [Errno 30] Read-only file system: 'disperse_logs.txt'

It works! Thank you!

Hi @cavallo71 , is there any convenient way to replace hard-coded FORMATTER for an addon except iterating logging.Logger#handlers?

Not I’m aware.
The way anki uses logging (eg. through AddonManager.get_logger) doesn’t add any magic on top of the standard logging.

For a sepcific addon, it is always possible to add another handler to the addon Logger instance to format/re-direct the messages instead changing the default FORMATTER: doing so it won’t interfere with the standard formatting (that people might rely on).

1 Like

Hi, I see that PR has been accepted. Is this change live in the current version of Anki? There seemed to be some discussion about changes in the PR, but the initial post mentions that logging can be activated like this

import logging
log = getattr(mw.addonManager, "getLogger", logging.getLogger)(__name__)
log.info("Hello from addon")

The message “Hello from addon” will be written to pm.addonFolder()/NNNNNN/user_files/logs/NNNNNN.log as well to stdout.

Is that still the case? It doesn’t seem to work for me. No log file is created.

1 Like

It’s been a while since I helped with that PR: at the time that was the behavior, not sure what happened later.