6

我有各种模块,我在其中大量使用 Python 日志记录。当我将它们导入到 Python 文档中的主模块并尝试运行它时,我没有从日志记录中获得任何输出。有没有人知道发生了什么?

Logging是在public下面导入的模块导入的模块中调用的(这段代码太大,这里就不放了)。下面的一段代码是整个程序运行和日志记录初始化的地方:

import logging
from bottle import run, debug
import public

logging.basicConfig(level=logging.DEBUG)

if __name__ == '__main__':
   logging.info('Started')
   debug(mode=True)
   run(host='localhost', port = 8080, reloader=True)
   logging.info('Finished')
4

3 回答 3

9

您的问题可能是由import public调用logging.debug(...)或类似的语句引起的。然后发生的事情是这样的:

  1. import public。作为副作用,这会调用 eglogging.debug或类似的方法,它会自动调用basicConfig,将 a 添加StreamHandler到根记录器,但不会更改级别。
  2. 然后您调用basicConfig,但由于根记录器已经有一个处理程序,它什么都不做(如文档所述)。
  3. 由于默认的日志记录级别是WARNING,您的infodebug调用不会产生任何输出。

你真的应该避免对导入的副作用:例如,你的调用basicConfig应该在if __name__ == '__main__'子句中。有了这个public.py

import logging

def main():
    logging.debug('Hello from public')

main.py

import logging
from bottle import run, debug
import public

def main():
    logging.basicConfig(level=logging.DEBUG)
    logging.info('Started')
    debug(mode=True)
    public.main()
    run(host='localhost', port = 8080, reloader=True)
    logging.info('Finished')

if __name__ == '__main__':
    main()

您会得到以下输出:

$ python main.py
INFO:root:Started
DEBUG:root:Hello from public
INFO:root:Started
DEBUG:root:Hello from public
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

^CINFO:root:Finished
$ Shutdown...
INFO:root:Finished

从这里你会看到,Bottle 实际上在一个单独的进程中重新运行了脚本,这导致了消息的加倍。您可以使用显示进程 ID 的格式字符串来说明这一点:如果您使用

logging.basicConfig(level=logging.DEBUG,
                    format='%(process)s %(levelname)s %(message)s')

然后你得到像

$ python main.py
13839 INFO Started
13839 DEBUG Hello from public
13840 INFO Started
13840 DEBUG Hello from public
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

^C13839 INFO Finished
$ Shutdown...
13840 INFO Finished

请注意,如果您添加一个产生副作用的语句,public.py如下所示:

logging.debug('Side-effect from public')

在模块级别,那么您根本没有日志输出:

$ python main.py
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

^C$ Shutdown...

这似乎证实了上述分析。

于 2011-12-24T18:30:46.603 回答
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import logging.handlers
from logging.config import dictConfig

logger = logging.getLogger(__name__)

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
}
def configure_logging(logfile_path):
    """
    Initialize logging defaults for Project.

    :param logfile_path: logfile used to the logfile
    :type logfile_path: string

    This function does:

    - Assign INFO and DEBUG level to logger file handler and console handler

    """
    dictConfig(DEFAULT_LOGGING)

    default_formatter = logging.Formatter(
        "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s",
        "%d/%m/%Y %H:%M:%S")

    file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8')
    file_handler.setLevel(logging.INFO)

    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)

    file_handler.setFormatter(default_formatter)
    console_handler.setFormatter(default_formatter)

    logging.root.setLevel(logging.DEBUG)
    logging.root.addHandler(file_handler)
    logging.root.addHandler(console_handler)



[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module

我在我的项目中尝试过这段代码。在 main 中运行 configure_logint(logpath)。

你可以使用

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging

logger = logging.getLogger(__name__)

def hello():
    logger.debug("this is logger infomation from hello module")
于 2015-10-31T14:12:34.150 回答
-1

编辑1:

以下内容是基于对 OP 代码的误解(来自评论)和我的错误假设。因此,它是无效的。

您提供的代码至少有一个错误。 debug(mode=True)错误有两个原因:

  1. 它被自己调用,作为你定义的方法,你还没有
  2. mode=True是一项任务,而不是对平等的测试

以下,剥离任何辅助模块和代码,为我运行和记录:

import logging

mode = False

logging.basicConfig(level=logging.DEBUG)
logging.info('Started')
logging.debug(mode is True)
# ... other code ...
logging.info('Finished')

从命令行运行:

$ python my_logger.py
INFO:root:Started
DEBUG:root:False
INFO:root:Finished
于 2011-12-24T05:35:27.647 回答