Changelog
Unreleased
0.7.0 (2023-04-10)
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
andcatch=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 aRuntimeError
(#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 whenenqueue=True
andcatch=False
if internal thread killed due toException
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 (2022-01-29)
Remove internal use of
pickle.loads()
to fix the (finally rejected) 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 usingasyncio.get_running_loop()
in place ofasyncio.get_event_loop()
).Remove the possibility to add a coroutine sink with
enqueue=True
ifloop=None
and no event loop is running.Change default encoding of file sink to be
utf8
instead oflocale.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 (2020-09-20)
0.5.2 (2020-09-06)
Fix
AttributeError
within handlers usingserialize=True
when callinglogger.exception()
outside of the context of an exception (#296).Fix error while logging an exception containing a non-picklable
value
to a handler withenqueue=True
(#298).Add support for async callable classes (with
__call__
method) used as sinks (#294, thanks @jessekrubin).
0.5.1 (2020-06-12)
Modify the way the
extra
dict is used byLogRecord
in order to prevent possibleKeyError
with standardlogging
handlers (#271).Add a new
default
optional argument tologger.catch()
, it should be the returned value by the decorated function in case an error occurred (#272).Fix
ValueError
when usingserialize=True
in combination withlogger.catch()
orlogger.opt(record=True)
due to circular reference of therecord
dict (#286).
0.5.0 (2020-05-17)
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 theextra
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 tologger.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 tologger.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 ifenqueue=True
to make sure all messages have been processed (#231).Fix possible deadlocks on Linux when
multiprocessing.Process()
collides withenqueue=True
orthreading
(#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
orcompression
process (#238).Fix situation where changes made to
record["message"]
were unexpectedly ignored whenopt(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 returningTrue
but not being compatible withcolorama
is used on Windows (#249).Fix exceptions occurring in coroutine sinks never retrieved and hence causing warnings (#227).
0.4.1 (2020-01-19)
Deprecate the
ansi
parameter of.opt()
in favor ofcolors
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 (2019-12-02)
Add support for coroutine functions used as sinks and add the new
logger.complete()
asynchronous method toawait
them (#171).Add a way to filter logs using one level per module in the form of a
dict
passed to thefilter
argument (#148).Add type hints to annotate the public methods using a
.pyi
stub file (#162).Add support for
copy.deepcopy()
of thelogger
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 argumentpatch
topatcher
so it better matches the signature oflogger.patch()
.Fix incompatibility with
multiprocessing
on Windows by entirely refactoring the internal structure of thelogger
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 theos.getxattr
andos.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 withrecord["name"]
equals toNone
.Fix incorrect record displayed while handling errors (if
catch=True
) occurring because of non-picklable objects (ifenqueue=True
).Prevent hypothetical
ImportError
if a Python installation is missing the built-indistutils
module (#118).Raise
TypeError
instead ofValueError
when alogger
method is called with argument of invalid type.Raise
ValueError
if the built-informat()
andfilter()
functions are respectively used asformat
andfilter
arguments of theadd()
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).
0.3.2 (2019-07-21)
Fix exception during import when executing Python with
-s
and-S
flags causingsite.USER_SITE
to be missing (#114).
0.3.1 (2019-07-13)
Fix
retention
androtation
issues when file sink initialized withdelay=True
(#113).Fix
"sec"
no longer recognized as a valid duration unit for filerotation
andretention
arguments.Ensure stack from the caller is displayed while formatting exception of a function decorated with
@logger.catch
whenbacktrace=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.
0.3.0 (2019-06-29)
Remove all dependencies previously needed by
loguru
(on Windows platform, it solely remainscolorama
andwin32-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 newdiagnose
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
andbacktrace
options areFalse
.Add a way to limit the depth of formatted exceptions traceback by setting the conventional
sys.tracebacklimit
variable (#77).Add
__repr__
value to thelogger
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 toNone
in such case (#62).Fix logging methods not being serializable with
pickle
and hence raising exception while being passed to somemultiprocessing
functions (#102).Fix exception stack trace not colorizing source code lines on Windows.
Fix possible
AttributeError
while formatting exceptions within acelery
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 althoughcatch=True
.Fix thread-safety of
enable()
anddisable()
being called during logging.Use Tox to run tests (#41).
0.2.5 (2019-01-20)
Modify behavior of sink option
backtrace=False
so it doesn’t extend traceback upward automatically (#30).Fix import error on some platforms using Python 3.5 with limited
localtime()
support (#33).Fix incorrect time formatting of locale month using
MMM
andMMMM
tokens (#34, thanks @nasyxx).Fix race condition permitting writing on a stopped handler.
0.2.4 (2018-12-26)
Fix adding handler while logging which was not thread-safe (#22).
0.2.3 (2018-12-16)
Add support for PyPy.
Add support for Python 3.5.
Fix incompatibility with
awscli
by downgrading requiredcolorama
dependency version (#12).
0.2.2 (2018-12-12)
0.2.1 (2018-12-08)
Fix typo preventing README to be correctly displayed on PyPI.
0.2.0 (2018-12-08)
Remove the
parser
and refactor it into thelogger.parse()
method.Remove the
notifier
and its dependencies (pip install notifiers
should be used instead).
0.1.0 (2018-12-07)
Add logger.
Add notifier.
Add parser.
0.0.1 (2017-09-04)
Initial release.