Python 韩元';有些文件不起作用

Python 韩元';有些文件不起作用,python,python-2.7,logging,Python,Python 2.7,Logging,我有一个pydev项目,我做这个项目是为了学习如何正确使用记录器 project ..|.src ..|..|.core ..|..|...|__init__.py ..|..|...|classHanger.py ..|..|...|scripts ..|..|.entrypoint.py ..|..|.util.py ..| ..|.cli ..|..|.cliloggertest.py ..| ..|.config .....|.logger.conf classHangar.py #!

我有一个pydev项目,我做这个项目是为了学习如何正确使用记录器

project
..|.src
..|..|.core
..|..|...|__init__.py
..|..|...|classHanger.py
..|..|...|scripts
..|..|.entrypoint.py
..|..|.util.py
..|
..|.cli
..|..|.cliloggertest.py
..|
..|.config
.....|.logger.conf
classHangar.py

#!/usr/bin/env python
# --*-- encoding: iso-8859-1 --*--

import logging

class SpeakingClass(object):

    def __init__(self):
        self.logger = logging.getLogger("%s.%s" % (__name__, "SpeakingClass"))

    def speakingMethod(self):
        self.logger.info("I'm a method from a SpeakingClass instance")
scripts.py

#!env python
# --*-- encoding: iso-8859-1 --*--

import logging

logger = logging.getLogger("%s.%s" % (__name__, "scripts"))

def anotherRandomMethod():
    logger.info("Now I'm talking from core.scripts.anotherRandomMethod")
entrypoint.py

#!/usr/bin/env python
# --*-- encoding: iso-8859-1 --*--

import logging

from core.classHangar import SpeakingClass
from core.scripts import anotherRandomMethod

logger = logging.getLogger("%s.%s" % (__name__, "entrypoint"))

def randomMethod():
    logger.info("Now I'm in the entrypoint.randomMethod")

def methodCalledByCli():
    logger.info("Now I'm in the entrypoint.methodCalledByCli")
    randomMethod()
    anotherRandomMethod()
    speaking_object = SpeakingClass()
    speaking_object.speakingMethod()
cliloggertest.py

#!env python
# --*-- encoding: iso-8859-1 --*--

import sys
sys.path.insert(0, '../src/')
import os
import logging.config
import util

from entrypoint import methodCalledByCli

def main():

    logging.config.fileConfig(os.path.join(util.getProjectPath(), "config/logger.conf"))
    logger = logging.getLogger("%s.%s" % (__name__, "cli"))

    logger.info("I'm talking from the CLI script")

    return methodCalledByCli()

if __name__ == "__main__":
    sys.exit(main())
和logger.conf

[loggers]
keys=root

[handlers]
keys=syserr

[formatters]
keys=basicformatter

[logger_root]
level=DEBUG
handlers=syserr

[handler_syserr]
class=StreamHandler
formatter=basicformatter
args=(sys.stderr,)

[formatter_basicformatter]
format=%(asctime)s  %(levelname)-9s%(name)-35s: %(message)s
datefmt=
我通常会得到:

"I'm talking from the CLI script"
"Now I'm in the entrypoint.methodCalledByCli"
"Now I'm in the entrypoint.randomMethod"
"Now I'm talking from core.scripts.anotherRandomMethod"
"I'm a method from a SpeakingClass instance"
但我得到的只是:

"I'm talking from the CLI script"
"I'm a method from a SpeakingClass instance"
我不明白为什么,我要求记录器以与cliloggertest.py和其他脚本完全相同的方式记录日志

ps:我正在启动cliloggertest.py

#!env python
# --*-- encoding: iso-8859-1 --*--

import sys
sys.path.insert(0, '../src/')
import os
import logging.config
import util

from entrypoint import methodCalledByCli

def main():

    logging.config.fileConfig(os.path.join(util.getProjectPath(), "config/logger.conf"))
    logger = logging.getLogger("%s.%s" % (__name__, "cli"))

    logger.info("I'm talking from the CLI script")

    return methodCalledByCli()

if __name__ == "__main__":
    sys.exit(main())
编辑 正如Mikko Ohtamaa所述,由于导入顺序,cli导入entrypoint,entrypoint导入脚本,因此在cli中设置配置之前会创建脚本的记录器和entrypoint的记录器

以这种方式更改cliloggertest可以解决问题(在任何非内部python导入之前设置配置:

#!env python
# --*-- encoding: iso-8859-1 --*--

import sys
sys.path.insert(0, '../src/')
import os
import util
import logging.config
logging.config.fileConfig(os.path.join(util.getProjectPath(), "config/logger.conf"))

from entrypoint import methodCalledByCli

def main():

    logger = logging.getLogger("cliloggertest")

    logger.info("I'm talking from the CLI script")

    return methodCalledByCli()

if __name__ == "__main__":
    sys.exit(main())

可能的猜测是,这是一个导入顺序问题,以及应用程序如何自我设置


一些记录器是在调用
logging.config.fileConfig()
之前创建的,其他记录器是在调用之后创建的。

这确实是问题所在:D cli导入entrypoint,entrypoint导入脚本,因此首先创建脚本的记录器。请在运行第一次导入之前配置记录器