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).
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).
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).
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).
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).
Fix retention and rotation issues when file sink initialized with delay=True (#113).
Fix "sec" no longer recognized as a valid duration unit for file rotation and retention arguments.
Ensure stack from the caller is displayed while formatting exception of a function decorated with @logger.catch when backtrace=False.
Modify datetime used to automatically rename conflicting file when rotating (it happens if file already exists because "{time}" not presents in filename) so it’s based on the file creation time rather than the current time.
Remove all dependencies previously needed by loguru (on Windows platform, it solely remains colorama and win32-setctime).
Add a new logger.patch() method which can be used to modify the record dict on-the-fly before it’s being sent to the handlers.
Modify behavior of sink option backtrace so it only extends the stacktrace upward, the display of variables values is now controlled with the new diagnose argument (#49).
Change behavior of rotation option in file sinks: it is now based on the file creation time rather than the current time, note that proper support may differ depending on your platform (#58).
Raise errors on unknowns color tags rather than silently ignoring them (#57).
Add the possibility to auto-close color tags by using </> (e.g. <yellow>message</>).
Add coloration of exception traceback even if diagnose and backtrace options are False.
Add a way to limit the depth of formatted exceptions traceback by setting the conventional sys.tracebacklimit variable (#77).
Add __repr__ value to the logger for convenient debugging (#84).
Remove colors tags mixing directives (e.g. <red,blue>) for simplification.
Make the record["exception"] attribute unpackable as a (type,value,traceback) tuple.
Fix error happening in some rare circumstances because frame.f_globals dict did not contain "__name__" key and hence prevented Loguru to retrieve the module’s name. From now, record["name"] will be equal to None in such case (#62).
Fix logging methods not being serializable with pickle and hence raising exception while being passed to some multiprocessing functions (#102).
Fix exception stack trace not colorizing source code lines on Windows.
Fix possible AttributeError while formatting exceptions within a celery task (#52).
Fix logger.catch decorator not working with generator and coroutine functions (#75).
Fix record["path"] case being normalized for no necessary reason (#85).
Fix some Windows terminal emulators (mintty) not correctly detected as supporting colors, causing ansi codes to be automatically stripped (#104).
Fix handler added with enqueue=True stopping working if exception was raised in sink although catch=True.
Fix thread-safety of enable() and disable() being called during logging.