Troubleshooting
Before anything else
Important
Make sure you you have the last version of mkdocs-macros. Perhaps the issue is already fixed?
Also, check that your version of mkdocs is sufficiently up-to-date.
Error Information in case of module error
By default a rendering error in a macro will not stop the server, but display the error in the browser's page (as you would expect, e.g. with php). The terminal's running log also displays errors when they occur.
Is it possible to make the building process fail in case of page error?
Yes. In a context of CD/CI (Continuous Development/Continuous Integration) the generation of the mkdocs site can be part of a larger script.
In that case, the expected behavior is not to display the error message in the respective webpage (default behavior), but to terminate the build process with an error code. That is the best way to advertise that something went wrong.
It should then be possible to consult the log (console output) and track down the offending markdown file and line number.
There are two ways to achieve that:
- Instruct Mkdocs-Macros to fail in case of error
- Instruct Mkdocs to fail in case of any warning (strict mode)
Instructing Mkdocs-Macros to fail in case of error
A simple way to make the build fail in case of a problem with variable/macro rendering,
is to set the on_error_fail
parameter to true
in the config file:
plugins:
- search
- macros:
# toggle to true if you are in CD/CI environment
on_error_fail: true
In that case, an error in a macro will terminate the MkDocs build or serve process with an error 100.
Make the behavior depend on an environment variable
As of version 1.2, mkdocs incorporates a yaml extension that allows the value of a configuration option to be set to the value of an environment variable.
You could therefore write:
plugins:
- search
- macros:
on_error_fail: !ENV [MACRO_ERROR_FAIL, false]
Meaning that the parameter "on_error_fail
should be set to the value of
MACRO_ERROR_FAIL
; or if the environment variable is absent to false
.
Catching undefined variables
By default, an undefined variable, all by itself, does not cause an error, but leaves the jinja2 statement as-is (not rendered).
If you wish to raise an error also in that case, you may want to add:
on_undefined: strict
Instructing Mkdocs to fail in case of any warning
From version 1.1.2
This approach can be useful for large projects with automated deployement.
A WARNING message is generated when an error occurs in the rendering of variables or macros.
If you apply the --strict
or -s
switch (strict mode) the
make the serve or build process will fail when a warning is generated:
mkdocs serve --strict
In that case any warning from any plugin (not only Mkdocs-Macros) will make the build fail, which is a default approach to warnings in plugins.
Tip
If you do not want to use the strict mode because other plugins are
generating warnings that you wish to ignore, then the first approach
(on_error_fail:true
might be better).
What happens if a variable is undefined?
New on 0.6.4.
The default behavior in case of undefined variable is called keep (DebugUndefined):
- Unknown variables are rendered as is (
{{ foobar }}
will be printed as such iffoobar
is undefined). - Any other cases (notably unknown attribute or function call) will cause the page to fail (be rendered with an error message within the page plus the traceback).
Tip
There were two reasons for adopting this behavior:
- This "debug" mode reduces cognitive overhead in case of misspelled variable. Anyone will be able to detect this error (it is better having an odd jinja2 statement in the page than having a "blank" that is likely to go unnoticed)
- Other plugins than mkdocs-macros make use of jinja2 variables (as specified in the config file). In this way, mkdocs-macros will not "eat up" those variables; it will give other plugins a better chance to work.
You may alter this behavior with the on_undefined
parameter in mkdocs_macros
section of the config file (mkdocs.yaml
):
Value | Definition | Undefined Type |
---|---|---|
keep | (Default) Unknown variables are rendered as-is; all other cases will cause the page to fail. | DebugUndefined |
silent | Unknown variables are rendered as blank; all other cases will cause the page to fail. | Undefined |
strict | Anything incorrect will cause the page to fail (closest behavior to Python). | StrictUndefined |
lax | Like silent (blank); will be more tolerant, typically in case of unknown attribute. | LaxUndefined (specific to mkdocs-macros) |
For example:
plugins:
- search
- macros:
on_undefined: strict
Warning
A call to an unknown macro (callable) will always cause the page to fail.
The Undefined Type is the Jinja2 class used to implement that behavior (see definition in official documentation).
macros_info()
as the go-to tool
Adding following line in a page:
{{ macros_info() }}
and restarting the server in the terminal with mkdocs serve
will
usually give you a wealth of information within the browser:
- If the information page appears (as e.g. phpinfo() for php), then you know that the plugin must be working.
- If the page displays and an error message appears, then there may be a problem either with the page or with the plugin's installation.
- If the page does not display at all, then the mkdocs server might not be running or there can be a problem running it.
How can I get detailed debug information on an object?
For example, if you want to have more information on the config
object:
{{ context('config') | pretty }}
(the pretty
filter displays the result in a nice table form)
You can use this pattern for pretty much any object, even those you declared in a module.
When used on its own, context()
gives the general list of variables in
the plugin's environment:
{{ context() | pretty }}
Help! mkdocs-macros is breaking down or eating pieces of my documentation!
-
In principle, anything that looks like an unknown variable (e.g.
{{ foo }}
) will be preserved. But in some cases there could be an error page or an empty string where you expected one. See how you can change the rendering behavior. -
Another likely cause of problems is that mkdocs-macros is believing that statements of the form
\{\{ .... }}
or{% ... %}
in your pages, which you want to appear in the HTML output or be processed by another plugin, are intended for it. To solve that problem, see the page dedicated to that issue.
Traces on the console
From version 0.5.0
Using the console's traces for troubleshooting
To make troubleshooting while using mkdocs serve
you
do not need to rely only on what you see in the browser.
You should exploit the trace on the console,
which MkDocs-macros produces on the fly.
The statements specific to mkdocs-macros appear with a [macros] prefix e.g.:
INFO - [macros] - Macros arguments: {'module_name': 'main', 'modules': ['mkdocs_macros_test'], 'include_dir': 'include', 'include_yaml': [], 'j2_block_start_string': '', 'j2_block_end_string': '', 'j2_variable_start_string': '', 'j2_variable_end_string': '', 'verbose': False}
Tip
Reading the console's trace may help you follow up what is happening.
Hiding mkdocs-macros' trace
You can suppress the trace completely (together with the rest of the
INFO trace from mkdocs), with the standard --quiet
option :
mkdocs serve --quiet
or with the -q
option.
Debug mode for mkdocs-macros
You can increase the trace completely by showing the debug information
(together with the rest of the DEBUG from mkdocs), with the standard
--verbose
option:
mkdocs serve --verbose
or with the -v
option.
Verbose (debug) statements in macros
You could use print()
statements to log what is happening in your macros,
and it is going to be printed on the console. But this can be messy.
It is much better, within the def define_env():
declaration,
to use the chatter()
function. It will print statements only if the macros plugin's
debug mode is set to true.
plugins:
- ...
- macros:
verbose: true
Tip
With the chatter()
function, you can leave those debug traces
in the code of your macros,
and visualize them only when you want to see them.
You need to first declare the chatter()
function with
the env.start_chatting()
method.
This initialization is necessary, so that you can give a nickname for
your module, which will allow you to recognize the traces:
def define_env(env):
"""
This is the hook for the functions (new form)
"""
# activate trace
chatter = env.start_chatting("Simple module")
...
chatter("This is a dull statement.")
This will print:
INFO - [macros - Simple module] - This is a dull statement.
Important
The verbose mode for mkdocs-macros is distinct from the general debug mode of mkdocs (which is activated with the --verbose
option).
To activate the debug mode for mkdocs-macros, you need to set the verbose
option to true for mkdocs-macros, in the config file (mkdocs.yml
).
Toggling between true
and false
in the verbose
option will be immediately be reflected on the console.
Forcibly suppressing the console output of macros
If the verbose
argument is set to true for the plugin, the messages will appear as INFO on the console's log.
It means that if you suppress the trace output at the level of
mkdocs serve
(using the --quiet
option),
this will also suppress the trace for your macros.
This is intentional, so that the behavior of MkDocs's logging remains entirely predictable, even for people who never heard of mkdocs-macros (principle of least astonishment)