Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lizettepreiss/a7f7d431c12e6d74282addcc324eca33 to your computer and use it in GitHub Desktop.
Save lizettepreiss/a7f7d431c12e6d74282addcc324eca33 to your computer and use it in GitHub Desktop.
Python logger configuration that either logs to File; or alternatively logs both to File and Console
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.7 (LoggingTemplate)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (LoggingTemplate)" project-jdk-type="Python SDK" />
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/LoggingTemplate.iml" filepath="$PROJECT_DIR$/.idea/LoggingTemplate.iml" />
</modules>
</component>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
import logging
logger = logging.getLogger('root')
class AProjectClassWithLogging:
def do_something(self):
logger.info("Doing Something")
import logging
import logging.handlers
class FileAndConsoleLogger:
def setup_custom_logger(self, name, log_level, log_file):
"""
Setup logging to file only or file and console
:return:
"""
if log_level == "DEV_DEBUG":
log_level = "DEBUG"
return self.setup_console_and_file(name, log_file, log_level)
if log_level == "DEV_INFO":
log_level = "INFO"
return self.setup_console_and_file(name, log_file, log_level)
return self.setup_file_logger(name, log_file, log_level)
def setup_file_logger(self, name, log_file, log_level):
"""
Just log to file
:param log_file:
:param log_level:
:return:
"""
log_file_max_size = 1024 * 1024 # 1 MB
log_num_backups = 3
log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s"
log_filemode = "w" # w: overwrite; a: append
if log_level is None or log_level == "INFO":
logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.INFO)
else:
logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode ,level=logging.DEBUG)
rotate_file = logging.handlers.RotatingFileHandler(
log_file, maxBytes=log_file_max_size, backupCount=log_num_backups
)
logger = logging.getLogger(name)
logger.addHandler(rotate_file)
return logger
def setup_console_and_file(self, name, log_file, log_level):
"""
Log to file and console
:param log_file:
:param log_level:
:return:
"""
log_file_max_size = 1024 * 1024 * 20 # megabytes
log_num_backups = 3
log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s"
log_filemode = "w" # w: overwrite; a: append
if log_level is None or log_level == "INFO":
logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.INFO)
else:
logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode ,level=logging.DEBUG)
rotate_file = logging.handlers.RotatingFileHandler(
log_file, maxBytes=log_file_max_size, backupCount=log_num_backups
)
logger = logging.getLogger(name)
logger.addHandler(rotate_file)
# print log messages to console
consoleHandler = logging.StreamHandler()
logFormatter = logging.Formatter(log_format)
consoleHandler.setFormatter(logFormatter)
logger.addHandler(consoleHandler)
return logger
from AProjectClassWithLogging import AProjectClassWithLogging
from FileAndConsoleLogger import FileAndConsoleLogger
log = FileAndConsoleLogger()
logger = log.setup_custom_logger('root', "DEV_DEBUG", "f:\\96_TEMP\logfile.log")
class ProjectEntryPoint:
def primaryMethod(self):
"""
This is the main method that does everything
:return:
"""
try:
logger.info("Primary Method...")
pc = AProjectClassWithLogging()
pc.do_something()
except Exception as e:
logger.exception("Exception")
def main(self):
"""
Main Entry Point
:return:
"""
self.primaryMethod()
if __name__ == '__main__':
proj = ProjectEntryPoint()
proj.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment