Managing Mercurial logs with the standard Python logging module
Mercurial logs through the
This extension redirects most user feedback meant for terminals to the
logging module of the standard library.
This is intended intended primarily for server-side use cases, and is unlikely to be useful for client-side operation.
Indeed on a server, many messages are useful for the systems administrator
only, and would be unwanted pollution if seen by the client.
A notable exception is
ui.status which is really used
to report back meaningful information over the wire.
Using logging is more robust and flexible than using flags such as
ui.debug and redirecting
stderr. It also provides integration with
Sentry (see below). Many other logs aggregation systems that have a
handler could be directly used.
At the time of this writing, it has the side effect to disable other extensions
meant for logs, such as
pip install hgext-loggingmod pip3 install "hgext-loggingmod>=0.2.0"
Then, in your HGRC, include this:
[extensions] loggingmod =
All parameters are to be set within the
[logging] hgrc section.
These are applied first, using mostly
Example (these are the default values):
[logging] level = info format = [%(asctime)s] [%(process)d] [%(levelname)s] [%(name)s] %(message)s hg_format = [%(asctime)s] [%(process)d] repo:%(repo)s [%(levelname)s] [%(name)s] %(message)s
Logging to a file
[logging] file = /var/log/mercurial.log
format string is a regular logging format string, see
LogRecord attributes for a full list of the keys that can be used there.
hg_format string is also a regular logging format string, but it
can additionally make use of the
repo parameter: the full path to the
current repository on the file system, if relevant to the given log record.
This format is used in the
hg logger and its descendants, such as
The times will include the timezone by default.
Advanced configuration through files
This is the most complete, as it leverages
[logging] config.json = /etc/hg-logging.json
The basic configuration above is done first nevertheless, but it is wiped out
unless one uses the
This is forwarded to
[logging] config.ini = /etc/hg-logging.ini
Using with Sentry
sentry_sdk package should be importable from the Mercurial process, see
Sentry install instructions
In our experience,
pip install sentry-sdk has not been enough, we had to also
install Brotli as well. Your mileage may
In doubt, test it first
To forward logs to Sentry, just specify the DSN in the hgrc:
[logging] sentry.dsn = https://<key>@sentry.example.net/<project>
Warning : don't use quotes above.
The Sentry default integration catches all logging calls, and is orthogonal
to the regular
logging configuration, except for the logger levels.
This extension has several knobs to tweak it. Here's an example
[logging] sentry.ignore_loggers = discovery extension # these are the default values: sentry.event_level = error sentry.breadcrumb_level = info
Instead of the flat configuration as above, you can disable the blanket
integration and resort to explicit configuration with the
directive and Sentry's handlers
[logging] config.json = /etc/hg-config-with-sentry.conf sentry.dsn = https://<key>@sentry.example.net/<project> sentry.default_integration = false
Of course, this also disables the
sentry.breadcrumbs_level config items.
At the time of this writing, these handlers are
See also: Handler classes in Sentry documentation
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.