Python 日志记录 - 多个模块
Python logging - multiple modules
我正在开发一个具有以下结构的 python 小项目 -
project
-- logs
-- project
__init.py__
classA.py
classB.py
utils.py
-- main.py
我在项目下的__init.py__
中设置日志配置如下:
import logging
from logging import StreamHandler
from logging.handlers import RotatingFileHandler
# Create the Logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Create the Handler for logging data to a file
logger_handler = RotatingFileHandler('logs\mylog.log', maxBytes=1024, backupCount=5)
logger_handler.setLevel(logging.INFO)
#Create the Handler for logging data to console.
console_handler = StreamHandler()
console_handler.setLevel(logging.INFO)
# Create a Formatter for formatting the log messages
logger_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
# Add the Formatter to the Handler
logger_handler.setFormatter(logger_formatter)
console_handler.setFormatter(logger_formatter)
# Add the Handler to the Logger
logger.addHandler(logger_handler)
logger.addHandler(console_handler)
这样设置似乎是在包级别设置根记录器,而不是在整个项目级别。因此,main.py
中的日志语句不会出现在日志文件中,而 类 classA
和 classB
以及 [=18] 中的所有日志语句=] 按预期路由到控制台和日志文件。
如何设置日志记录以便我能够配置一次并在整个项目中使用它?我尝试将日志记录配置语句移动到 main.py,但它似乎没有用。
def setupLogging():
# Create the Logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
..etc..
def main():
setupLogging()
if __name__ == "__main__":
main()
正如您第一次尝试的那样,为整个项目只配置一次日志记录是正确的,而不是每个包单独配置。
你做错的是你只为当前模块配置了记录器:
logger = logging.getLogger(__name__)
相反,您想配置根记录器:
root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
# ...
root_logger.addHandler(logger_handler)
root_logger.addHandler(console_handler)
为根记录器完成的配置适用于所有未明确覆盖它的记录器。
那你在实际记录的时候应该使用特定的记录器:
logger = logging.getLogger(__name__)
logger.warning("I am warning you about %s", something)
我正在开发一个具有以下结构的 python 小项目 -
project
-- logs
-- project
__init.py__
classA.py
classB.py
utils.py
-- main.py
我在项目下的__init.py__
中设置日志配置如下:
import logging
from logging import StreamHandler
from logging.handlers import RotatingFileHandler
# Create the Logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Create the Handler for logging data to a file
logger_handler = RotatingFileHandler('logs\mylog.log', maxBytes=1024, backupCount=5)
logger_handler.setLevel(logging.INFO)
#Create the Handler for logging data to console.
console_handler = StreamHandler()
console_handler.setLevel(logging.INFO)
# Create a Formatter for formatting the log messages
logger_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
# Add the Formatter to the Handler
logger_handler.setFormatter(logger_formatter)
console_handler.setFormatter(logger_formatter)
# Add the Handler to the Logger
logger.addHandler(logger_handler)
logger.addHandler(console_handler)
这样设置似乎是在包级别设置根记录器,而不是在整个项目级别。因此,main.py
中的日志语句不会出现在日志文件中,而 类 classA
和 classB
以及 [=18] 中的所有日志语句=] 按预期路由到控制台和日志文件。
如何设置日志记录以便我能够配置一次并在整个项目中使用它?我尝试将日志记录配置语句移动到 main.py,但它似乎没有用。
def setupLogging():
# Create the Logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
..etc..
def main():
setupLogging()
if __name__ == "__main__":
main()
正如您第一次尝试的那样,为整个项目只配置一次日志记录是正确的,而不是每个包单独配置。
你做错的是你只为当前模块配置了记录器:
logger = logging.getLogger(__name__)
相反,您想配置根记录器:
root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
# ...
root_logger.addHandler(logger_handler)
root_logger.addHandler(console_handler)
为根记录器完成的配置适用于所有未明确覆盖它的记录器。
那你在实际记录的时候应该使用特定的记录器:
logger = logging.getLogger(__name__)
logger.warning("I am warning you about %s", something)