记录模块不写入文件

时间:2016-03-09 17:12:05

标签: python windows powershell logging

我正在使用logging模块,并且我已经传入了与当前正在运行的其他作业相同的参数:

import logging
from inst_config import config3

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] - %(message)s',
    filename=config3.GET_LOGFILE(config3.REQUESTS_USAGE_LOGFILE))
logging.warning('This should go in the file.')

if __name__ == '__main__':
    logging.info('Starting unload.')

使用此方法创建文件名:

REQUESTS_USAGE_LOGFILE = r'C:\RunLogs\Requests_Usage\requests_usage_runlog_{}.txt'.format(
        CUR_MONTH)
def GET_LOGFILE(logfile):
    """Truncates file and returns."""
    with open(logfile, 'w'):
        pass
    return logfile

然而,当我运行它时,它正在创建文件,然后仍然将日志记录信息输出到控制台。我正在Powershell中运行。

试着将它放在主语句中,如下所示:

if __name__ == '__main__':
    logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] - %(message)s',
    filename=config3.GET_LOGFILE(config3.REQUESTS_USAGE_LOGFILE))

    logging.warning('This should go in the file.')

仍然没有运气。

4 个答案:

答案 0 :(得分:5)

我在logging.basicConfig()之前添加了以下几行,对我有用。

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

答案 1 :(得分:1)

您可以尝试在主文件中运行它:

import logging 
logging.basicConfig(
    level=logging.INFO, 
    format='%(asctime)s [%(levelname)s] - %(message)s',
    filename='filename.txt')  # pass explicit filename here 
logger = logging.get_logger()  # get the root logger
logger.warning('This should go in the file.')
print logger.handlers   # you should have one FileHandler object

答案 2 :(得分:1)

除了 Forge 对使用 logging.basicConfig() 的回答之外,从 Python 3.8 开始,basicConfig() 的参数也被添加了。至quote the docs

"""
This function does nothing if the root logger already has handlers 
configured, unless the keyword argument *force* is set to ``True``.
...
force     If this keyword  is specified as true, any existing handlers
          attached to the root logger are removed and closed, before
          carrying out the configuration as specified by the other
          arguments.
"""

这就是为什么 yue dong 删除所有处理程序的答案以及亚历山大将 logger.handlers 重置为 [] 的答案对某些人有效的原因。

调试 logger.handlers(如 Forge 的回答所示)让我在那里看到一个 StreamHandler(所以 basicConfig() 在我使用 force=True 作为参数之前对我没有任何作用)。

除了这里的所有其他答案之外,希望也能有所帮助!

答案 3 :(得分:0)

如果您使用的是默认情况下名称为“”的“ root”记录器,则可以执行以下操作:

logging.getLogger().setLevel(logging.INFO)    
logger = logging.getLogger('')
logger.handlers = []

此外,您可能希望像上面的代码中那样指定日志记录级别,该级别将对所有后代记录器保持不变。

如果相反,您指定了特定的记录器,则

logger = logging.getLogger('my_service')
logger.handlers = []
fh = logging.FileHandler(log_path)
fh.setLevel(logging.INFO)
# create console handler
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
logger.addHandler(fh)
logger.addHandler(ch)
logger.info('service started')

以上代码将创建新的记录器“ my_service”。如果已经创建了记录器,它将清除所有句柄。它添加了用于写入指定文件和控制台的句柄。 See official documentation as well

您还可以使用分层记录器。直接完成。

logger = logging.getLogger('my_service.update')
logger.info('updated successfully')