Skip to content

Releases: Delgan/loguru

0.7.2

11 Sep 15:25
Compare
Choose a tag to compare
  • Add support for formatting of ExceptionGroup errors (#805).
  • Fix possible RuntimeError when using multiprocessing.set_start_method() after importing the logger (#974).
  • Fix formatting of possible __notes__ attached to an Exception (#980).

0.7.1

04 Sep 13:15
Compare
Choose a tag to compare
  • Add a new context optional argument to logger.add() specifying multiprocessing context (like "spawn" or "fork") to be used internally instead of the default one (#851).
  • Add support for true colors on Windows using ANSI/VT console when available (#934, thanks @tunaflsh).
  • Fix possible deadlock when calling logger.complete() with concurrent logging of an asynchronous sink (#906).
  • Fix file possibly rotating too early or too late when re-starting an application around midnight (#894).
  • Fix inverted "<hide>" and "<strike>" color tags (#943, thanks @tunaflsh).
  • Fix possible untraceable errors raised when logging non-unpicklable Exception instances while using enqueue=True (#329).
  • Fix possible errors raised when logging non-picklable Exception instances while using enqueue=True (#342, thanks @ncoudene).
  • Fix missing seconds and microseconds when formatting timezone offset that requires such accuracy (#961).
  • Raise ValueError if an attempt to use nanosecond precision for time formatting is detected (#855).

0.7.0

10 Apr 09:14
Compare
Choose a tag to compare
  • Update InterceptHandler recipe to make it compatible with Python 3.11 (#654).
  • Add a new watch optional argument to file sinks in order to automatically re-create possibly deleted or changed file (#471).
  • Make patch() calls cumulative instead of overriding the possibly existing patching function (#462).
  • Make sinks added with enqueue=True and catch=False still process logged messages in case of internal exception (#833).
  • Avoid possible deadlocks caused by re-using the logger inside a sink, a signal handler or a __del__ method. Since the logger is not re-entrant, such misuse will be detected and will now generate a RuntimeError (#712, thanks @jacksmith15).
  • Fix file sink rotation using an aware datetime.time for which the timezone was ignored (#697).
  • Fix logs colorization not automatically enabled for Jupyter Notebook and Google Colab (#494).
  • Fix logs colorization not automatically enabled for Github Actions and others CI platforms (#604).
  • Fix logger.complete() possibly hanging forever when enqueue=True and catch=False if internal thread killed due to Exception raised by sink (#647).
  • Fix incompatibility with freezegun library used to simulate time (#600).
  • Raise exception if logger.catch() is used to wrap a class instead of a function to avoid unexpected behavior (#623).

0.6.0

29 Jan 13:50
Compare
Choose a tag to compare
  • Remove internal use of pickle.loads() considered as a security vulnerability referenced as CVE-2022-0329 (#563).
  • Modify coroutine sink to make it discard log messages when loop=None and no event loop is running (due to internally using asyncio.get_running_loop() in place of asyncio.get_event_loop()).
  • Remove the possibility to add a coroutine sink with enqueue=True if loop=None and no event loop is running.
  • Change default encoding of file sink to be utf8 instead of locale.getpreferredencoding() (#339).
  • Prevent non-ascii characters to be escaped while logging JSON message with serialize=True (#575, thanks @ponponon).
  • Fix flake8 errors and improve code readability (#353, thanks @AndrewYakimets).

0.5.3

20 Sep 07:56
Compare
Choose a tag to compare
  • Fix child process possibly hanging at exit while combining enqueue=True with third party library like uwsgi (#309, thanks @dstlmrk).
  • Fix possible exception during formatting of non-string messages (#331).

0.5.2

06 Sep 19:18
Compare
Choose a tag to compare
  • Fix AttributeError within handlers using serialize=True when calling logger.exception() outside of the context of an exception (#296).
  • Fix error while logging an exception containing a non-picklable value to a handler with enqueue=True (#298).
  • Add support for async callable classes (with __call__ method) used as sinks (#294, thanks @jessekrubin).

0.5.1

12 Jun 14:17
Compare
Choose a tag to compare
  • Modify the way the extra dict is used by LogRecord in order to prevent possible KeyError with standard logging handlers (#271).
  • Add a new default optional argument to logger.catch(), it should be the returned value by the decorated function in case an error occurred (#272).
  • Fix ValueError when using serialize=True in combination with logger.catch() or logger.opt(record=True) due to circular reference of the record dict (#286).

0.5.0

17 May 21:02
Compare
Choose a tag to compare
  • Remove the possibility to modify the severity no of levels once they have been added in order to prevent surprising behavior (#209).
  • Add better support for "structured logging" by automatically adding **kwargs to the extra dict besides using these arguments to format the message. This behavior can be disabled by setting the new .opt(capture=False) parameter (#2).
  • Add a new onerror optional argument to logger.catch(), it should be a function which will be called when an exception occurs in order to customize error handling (#224).
  • Add a new exclude optional argument to logger.catch(), is should be a type of exception to be purposefully ignored and propagated to the caller without being logged (#248).
  • Modify complete() to make it callable from non-asynchronous functions, it can thus be used if enqueue=True to make sure all messages have been processed (#231).
  • Fix possible deadlocks on Linux when multiprocessing.Process() collides with enqueue=True or threading (#231).
  • Fix compression function not executable concurrently due to file renaming (to resolve conflicts) being performed after and not before it (#243).
  • Fix the filter function listing files for retention being too restrictive, it now matches files based on the pattern "basename(.*).ext(.*)" (#229).
  • Fix the impossibility to remove() a handler if an exception is raised while the sink' stop() function is called (#237).
  • Fix file sink left in an unstable state if an exception occurred during retention or compression process (#238).
  • Fix situation where changes made to record["message"] were unexpectedly ignored when opt(colors=True), causing "out-of-date" message to be logged due to implementation details (#221).
  • Fix possible exception if a stream having an isatty() method returning True but not being compatible with colorama is used on Windows (#249).
  • Fix exceptions occurring in coroutine sinks never retrieved and hence causing warnings (#227).

0.4.1

19 Jan 11:38
Compare
Choose a tag to compare
  • Deprecate the ansi parameter of .opt() in favor of colors which is a name more appropriate.
  • Prevent unrelated files and directories to be incorrectly collected thus causing errors during the retention process (#195, thanks @gazpachoking).
  • Strip color markups contained in record["message"] when logging with .opt(ansi=True) instead of leaving them as is (#198).
  • Ignore color markups contained in *args and **kwargs when logging with .opt(ansi=True), leave them as is instead of trying to use them to colorize the message which could cause undesirable errors (#197).

0.4.0

01 Dec 23:18
Compare
Choose a tag to compare
  • Add support for coroutine functions used as sinks and add the new logger.complete() asynchronous method to await them (#171).
  • Add a way to filter logs using one level per module in the form of a dict passed to the filter argument (#148).
  • Add type hints to annotate the public methods using a .pyi stub file (#162).
  • Add support for copy.deepcopy() of the logger allowing multiple independent loggers with separate set of handlers (#72).
  • Add the possibility to convert datetime to UTC before formatting (in logs and filenames) by adding "!UTC" at the end of the time format specifier (#128).
  • Add the level name as the first argument of namedtuple returned by the .level() method.
  • Remove class objects from the list of supported sinks and restrict usage of **kwargs in .add() to file sink only. User is in charge of instantiating sink and wrapping additional keyword arguments if needed, before passing it to the .add() method.
  • Rename the logger.configure() keyword argument patch to patcher so it better matches the signature of logger.patch().
  • Fix incompatibility with multiprocessing on Windows by entirely refactoring the internal structure of the logger so it can be inherited by child processes along with added handlers (#108).
  • Fix AttributeError while using a file sink on some distributions (like Alpine Linux) missing the os.getxattr and os.setxattr functions (#158, thanks @joshgordon).
  • Fix values wrongly displayed for keyword arguments during exception formatting with diagnose=True (#144).
  • Fix logging messages wrongly chopped off at the end while using standard logging.Handler sinks with .opt(raw=True) (#136).
  • Fix potential errors during rotation if destination file exists due to large resolution clock on Windows (#179).
  • Fix an error using a filter function "by name" while receiving a log with record["name"] equals to None.
  • Fix incorrect record displayed while handling errors (if catch=True) occurring because of non-picklable objects (if enqueue=True).
  • Prevent hypothetical ImportError if a Python installation is missing the built-in distutils module (#118).
  • Raise TypeError instead of ValueError when a logger method is called with argument of invalid type.
  • Raise ValueError if the built-in format() and filter() functions are respectively used as format and filter arguments of the add() method. This helps the user to understand the problem, as such a mistake can quite easily occur (#177).
  • Remove inheritance of some record dict attributes to str (for "level", "file", "thread" and "process").
  • Give a name to the worker thread used when enqueue=True (#174, thanks @t-mart).