************** Logging system ************** .. note:: The Astropy logging system is meant for internal ``astropy`` usage. For use in other packages, we recommend implementing your own logger instead. Overview ======== The Astropy logging system is designed to give users flexibility in deciding which log messages to show, to capture them, and to send them to a file. All messages printed by Astropy routines should use the built-in logging facility (normal ``print()`` calls should only be done by routines that are explicitly requested to print output). Messages can have one of several levels: * DEBUG: Detailed information, typically of interest only when diagnosing problems. * INFO: An message conveying information about the current task, and confirming that things are working as expected * WARNING: An indication that something unexpected happened, and that user action may be required. * ERROR: indicates a more serious issue, including exceptions By default, INFO, WARNING and ERROR messages are displayed, and are sent to a log file located at ``~/.astropy/astropy.log`` (if the file is writeable). Configuring the logging system ============================== First, import the logger:: from astropy import log The threshold level (defined above) for messages can be set with e.g.:: log.setLevel('DEBUG') Color (enabled by default) can be disabled with:: log.disable_color() and enabled with:: log.enable_color() Warnings from ``warnings.warn`` can be logged with:: log.enable_warnings_logging() which can be disabled with:: log.disable_warnings_logging() and exceptions can be included in the log with:: log.enable_exception_logging() which can be disabled with:: log.disable_exception_logging() It is also possible to set these settings from the Astropy configuration file, which also allows an overall log file to be specified. See `Using the configuration file`_ for more information. Context managers ================ In some cases, you may want to capture the log messages, for example to check whether a specific message was output, or to log the messages from a specific section of code to a file. Both of these are possible using context managers. To add the log messages to a list, first import the logger if you have not already done so:: from astropy import log then enclose the code in which you want to log the messages to a list in a ``with`` statement:: with log.log_to_list() as log_list: # your code here In the above example, once the block of code has executed, ``log_list`` will be a Python list containing all the Astropy logging messages that were raised. Note that messages continue to be output as normal. Similarly, you can output the log messages of a specific section of code to a file using:: with log.log_to_file('myfile.log'): # your code here which will add all the messages to ``myfile.log`` (this is in addition to the overall log file mentioned in `Using the configuration file`_). While these context managers will include all the messages emitted by the logger (using the global level set by ``log.setLevel``), it is possible to filter a subset of these using ``filter_level=``, and specifying one of ``'DEBUG'``, ``'INFO'``, ``'WARN'``, ``'ERROR'``. Note that if ``filter_level`` is a lower level than that set via ``setLevel``, only messages with the level set by ``setLevel`` or higher will be included (i.e. ``filter_level`` is only filtering a subset of the messages normally emitted by the logger). Similarly, it is possible to filter a subset of the messages by origin by specifying ``filter_origin=`` followed by a string. If the origin of a message starts with that string, the message will be included in the context manager. For example, ``filter_origin='astropy.wcs'`` will include only messages emitted in the ``astropy.wcs`` sub-package. Using the configuration file ============================ Options for the logger can be set in the ``[logger]`` section of the Astropy configuration file:: [logger] # Threshold for the logging messages. Logging messages that are less severe # than this level will be ignored. The levels are 'DEBUG', 'INFO', 'WARNING', # 'ERROR' log_level = 'INFO' # Whether to use color for the level names use_color = True # Whether to log warnings.warn calls log_warnings = False # Whether to log exceptions before raising them log_exceptions = False # Whether to always log messages to a log file log_to_file = True # The file to log messages to. If empty string is given, it defaults to a # file `astropy.log` in the astropy config directory. log_file_path = '~/.astropy/astropy.log' # Threshold for logging messages to log_file_path log_file_level = 'INFO' # Format for log file entries log_file_format = '%(asctime)s, %(origin)s, %(levelname)s, %(message)s' # The encoding (e.g., UTF-8) to use for the log file. If empty string is # given, it defaults to the platform-preferred encoding. log_file_encoding = "" Reference/API ============= .. automodapi:: astropy.logger :no-inheritance-diagram: