48

我正在尝试编写一个将异常记录到控制台和文件的服务器。我从食谱中提取了一些代码。这里是:

logger = logging.getLogger('server_logger')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('server.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)

此代码完美地记录到控制台,但没有记录到文件中。该文件已创建,但没有写入任何内容。我试过关闭处理程序,但这没有任何作用。冲洗它也不行。我搜索了互联网,但显然我是唯一一个有这个问题的人。有谁知道问题是什么?感谢您的回答。

4

6 回答 6

44

试着打电话

logger.error('This should go to both console and file')

代替

logging.error('this will go to the default logger which you have not changed the config of')
于 2013-04-09T04:34:45.933 回答
19

尝试将 import 和 basicConfig 放在脚本的开头。像这样的东西:

import logging
logging.basicConfig(filename='log.log', level=logging.INFO)
.
.
import ...
import ...
于 2017-08-10T12:50:43.867 回答
9

把这个

for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)

在......面前

logging.basicConfig(...)

另请参阅 日志模块未写入文件

于 2019-05-29T18:52:21.523 回答
5

我知道这个问题可能有点太老了,但我发现上述方法有点矫枉过正。我遇到了类似的问题,我能够通过以下方式解决它:

import logging

logging.basicConfig(format = '%(asctime)s %(message)s',
                    datefmt = '%m/%d/%Y %I:%M:%S %p',
                    filename = 'example.log',
                    level=logging.DEBUG)

这将写入example.log所有调试级别或更高级别的日志。

logging.debug("This is a debug message")This is a debug message写入example.log. 水平对于这个工作很重要。

于 2016-10-16T14:33:45.180 回答
2

为了同时写入终端和文件,您可以执行以下操作:

import logging.config

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("log_file.log"),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

代码中的用法:

logger.info('message')
logger.error('message')
于 2021-03-18T20:26:40.683 回答
0

如果root.handlers不为空,则不会创建日志文件。我们应该在调用 basicConfig() 方法之前清空 root.handlers。来源

片段:

for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)

完整代码如下:

import logging
##loging
for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename= 'log.txt',
                    filemode='w')

console = logging.StreamHandler()
console.setLevel(logging.INFO)
# add the handler to the root logger
logging.getLogger().addHandler(console)
logging.info("\nParameters:")

for i in range(10):
    logging.info(i)

logging.info("end!")
于 2022-01-24T11:02:43.217 回答