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
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.
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).
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.
It’s been a while since I helped with that PR: at the time that was the behavior, not sure what happened later.