Python提供了日志记录模块。我们可以使用记录器代替打印并使用其多个日志级别。这里的问题是,当我们使用记录器时,我们将日志字符串传递到记录器对象中。这意味着记录器对象必须可以从整个 Python 程序中的每个函数/方法和类访问。
logger = logging.getLogger('mylogger')
logger.info('This is a message from mylogger.')
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,对于可能分为多个源文件并由多个函数/方法和类组成的大型 Python 程序,我们如何确保在任何地方都使用相同的记录器对象来记录消息?或者我对如何使用日志记录模块有错误的想法?
基于此答案,启用详细日志记录的更简单方法
让我们以这个 Python 脚本为例。
import argparse
import logging
def main():
import argparse
import logging
parser = argparse.ArgumentParser(
description='A test script for http://stackoverflow.com/q/14097061/78845'
)
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
logging.basicConfig(level=logging.DEBUG)
logging.info('Shown in debug and info mode')
logging.debug('Only shown in debug mode')
if __name__ == "__main__":
logging.info('Starting script!')
main()
Run Code Online (Sandbox Code Playgroud)
从终端运行此脚本 aspython -m verbose -v不会打印任何内容。
如果您logging.info('Starting script!')将文件中的行注释为
if __name__ == "__main__":
#logging.info('Starting script!')
main()
Run Code Online (Sandbox Code Playgroud)
然后日志记录按预期工作。
看起来logging.info()在basicConfig定义之前调用 a 的尝试将完全禁用任何日志记录。 …
我正在使用日志记录并有一个问题。
我知道有简单和高级的日志概念。
在简单日志中,我们有logging.info()等,而在高级日志中,我们有logging.getlogger(some_name).
在简单日志记录中,我们可以使用配置日志路径和消息格式,logging.
basicConfig而在高级日志记录的情况下,我们有格式化程序的概念,处理程序分配给通过使用获得的记录器logging.getlogger(some_name).addhandlers..
我们甚至可以使用以下方法向根记录器添加多个处理程序 logging.getlogger().addhandlers....
因此,高级日志记录的唯一好处是我们可以将记录器名称添加到硬编码值或__name__相应的模块值中。
那么既然格式化程序和处理程序都可以用于简单和高级日志记录方法,那么简单意味着根记录器和高级意味着模块名称记录器吗?
basicConfig 只能用于根记录器,而处理程序/格式化器只能用于命名记录器吗?
我刚刚开始使用 Docker。
我正在开发另一个开发人员编码的项目。在项目 Docker 容器中,我有三个微服务(aggregatore、classificatore、testmicro),每个服务都使用 python 模块logging进行调试。
我的问题是我不知道在哪里可以查看输出logging。
docker-compose.yml
version: '2.1'
services:
files:
image: busybox
volumes:
[..]
grafana:
[..]
prometheus:
[..]
aggregatore:
[..]
classificatore:
build: classificatore/.
volumes:
- [..]
volumes_from:
- files
ports:
- [..]
command: ["python", "/src/main.py"]
depends_on:
rabbit:
condition: service_healthy
testmicro:
[..]
rabbit:
[..]
Run Code Online (Sandbox Code Playgroud)
我是终端,我运行
$docker-compose up -d
Run Code Online (Sandbox Code Playgroud)
这将启动所有微服务。
让我们关注分类器服务。
分类器/Dockerfile
FROM python:3
RUN mkdir /src
ADD requirements.txt /src/.
WORKDIR /src
RUN pip install -r requirements.txt
ADD . /src/.
RUN mkdir -p /tmp/reqdoc
CMD …Run Code Online (Sandbox Code Playgroud)