Skip to content
This repository has been archived by the owner on Nov 28, 2022. It is now read-only.

Commit

Permalink
Allow lower loglevel for logfiles (fixes #57)
Browse files Browse the repository at this point in the history
  • Loading branch information
metachris committed Oct 16, 2020
1 parent 4ad4efd commit f098429
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 20 deletions.
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ from logzero import logger

logger.debug("hello")
logger.info("info")
logger.warn("warn")
logger.warning("warn")
logger.error("error")

# This is how you'd log an exception
Expand Down Expand Up @@ -160,6 +160,20 @@ $ make lint
$ make docs
```

* Download stats: https://pepy.tech/project/logzero

---

Notes
-----

* What should go into a new release?

Want to do:

* CI to publish package to PyPI


---

Changelog
Expand Down
36 changes: 22 additions & 14 deletions logzero/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
logger.debug("hello")
logger.info("info")
logger.warn("warn")
logger.warning("warn")
logger.error("error")
In order to also log to a file, just use `logzero.logfile(..)`:
Expand Down Expand Up @@ -337,7 +337,7 @@ def reset_default_logger():

def loglevel(level=logging.DEBUG, update_custom_handlers=False):
"""
Set the minimum loglevel for the default logger (`logzero.logger`).
Set the minimum loglevel for the default logger (`logzero.logger`) and all handlers.
This reconfigures only the internal handlers of the default logger (eg. stream and logfile).
You can also update the loglevel for custom handlers by using `update_custom_handlers=True`.
Expand Down Expand Up @@ -408,22 +408,30 @@ def logfile(filename, formatter=None, mode='a', maxBytes=0, backupCount=0, encod
:arg int loglevel: Set a custom loglevel for the file logger, else uses the current global loglevel.
:arg bool disableStderrLogger: Should the default stderr logger be disabled. Defaults to False.
"""
# Step 1: If an internal RotatingFileHandler already exists, remove it
# First, remove any existing file logger
__remove_internal_loggers(logger, disableStderrLogger)

# Step 2: If wanted, add the RotatingFileHandler now
if filename:
rotating_filehandler = RotatingFileHandler(filename, mode=mode, maxBytes=maxBytes, backupCount=backupCount, encoding=encoding)
# If no filename supplied, all is done
if not filename:
return

# Set internal attributes on this handler
setattr(rotating_filehandler, LOGZERO_INTERNAL_LOGGER_ATTR, True)
if loglevel:
setattr(rotating_filehandler, LOGZERO_INTERNAL_HANDLER_IS_CUSTOM_LOGLEVEL, True)
# Now add
rotating_filehandler = RotatingFileHandler(filename, mode=mode, maxBytes=maxBytes, backupCount=backupCount, encoding=encoding)

# Set internal attributes on this handler
setattr(rotating_filehandler, LOGZERO_INTERNAL_LOGGER_ATTR, True)
if loglevel:
setattr(rotating_filehandler, LOGZERO_INTERNAL_HANDLER_IS_CUSTOM_LOGLEVEL, True)

# Configure the handler and add it to the logger
rotating_filehandler.setLevel(loglevel or _loglevel)
rotating_filehandler.setFormatter(formatter or _formatter or LogFormatter(color=False))
logger.addHandler(rotating_filehandler)

# Configure the handler and add it to the logger
rotating_filehandler.setLevel(loglevel or _loglevel)
rotating_filehandler.setFormatter(formatter or _formatter or LogFormatter(color=False))
logger.addHandler(rotating_filehandler)
# If wanting to use a lower loglevel for the file handler, we need to reconfigure the logger level
# (note: this won't change the StreamHandler loglevel)
if loglevel and loglevel < logger.level:
logger.setLevel(loglevel)


def __remove_internal_loggers(logger_to_update, disableStderrLogger=True):
Expand Down
24 changes: 23 additions & 1 deletion tests/test_logzero.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ def test_setup_logger_logfile_custom_loglevel(capsys):
try:
logger = logzero.setup_logger(logfile=temp.name, fileLoglevel=logging.WARN)
logger.info("info1")
logger.warn("warn1")
logger.warning("warn1")

with open(temp.name) as f:
content = f.read()
Expand Down Expand Up @@ -299,3 +299,25 @@ def test_default_logger_syslog_only(capsys):
logzero.logger.error('debug')
out, err = capsys.readouterr()
assert out == '' and err == ''


def test_logfile_lower_loglevel(capsys):
"""
logzero.logfile(..) should work with a lower loglevel than the StreamHandler
"""
logzero.reset_default_logger()
temp = tempfile.NamedTemporaryFile()
try:
logzero.loglevel(level=logging.INFO)
logzero.logfile(temp.name, loglevel=logging.DEBUG)

logzero.logger.debug("debug")
logzero.logger.info("info")

with open(temp.name) as f:
content = f.read()
assert "] debug" in content
assert "] info" in content

finally:
temp.close()
8 changes: 4 additions & 4 deletions tests/test_new_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def test_api_loglevel(capsys):
logzero.logger.info("info1")
logzero.loglevel(logging.WARN)
logzero.logger.info("info2")
logzero.logger.warn("warn1")
logzero.logger.warning("warn1")

with open(temp.name) as f:
content = f.read()
Expand All @@ -81,7 +81,7 @@ def test_api_loglevel_custom_handlers(capsys):
# logzero.logger.info("info1")
# logzero.loglevel(logging.WARN)
# logzero.logger.info("info2")
# logzero.logger.warn("warn1")
# logzero.logger.warning("warn1")

# with open(temp.name) as f:
# content = f.read()
Expand Down Expand Up @@ -133,13 +133,13 @@ def test_api_logfile_custom_loglevel():
# Set logfile with custom loglevel
logzero.logfile(temp.name, loglevel=logging.WARN)
logzero.logger.info("info1")
logzero.logger.warn("warn1")
logzero.logger.warning("warn1")

# If setting a loglevel with logzero.loglevel(..) it will not overwrite
# the custom loglevel of the file handler
logzero.loglevel(logging.INFO)
logzero.logger.info("info2")
logzero.logger.warn("warn2")
logzero.logger.warning("warn2")

with open(temp.name) as f:
content = f.read()
Expand Down

0 comments on commit f098429

Please sign in to comment.