windows 日志记录模块未写入文件

8qgya5xd  于 2023-08-07  发布在  Windows
关注(0)|答案(5)|浏览(134)

我使用的是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
我试着把它放在main语句中,像这样:

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.')


还是没找到。

c0vxltue

c0vxltue1#

我在logging.basicConfig()之前添加了以下行,它对我很有效。

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

字符串

sxpgvts3

sxpgvts32#

您可以尝试在主文件中运行此代码段。

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

字符串

djp7away

djp7away3#

除了Forge关于使用logging.basicConfig()的回答之外,从Python 3.8开始,还添加了一个basicConfig()参数。引用文档:

"""
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的删除所有处理程序的方法和 Alexandria 的将logger.handlers重置为[]的方法一样有效的原因。
调试logger.handlers(正如Forge的回答所暗示的那样)让我看到了一个单独的StreamHandler(所以basicConfig()对我来说什么都没有,直到我使用force=True作为参数)。
希望这有助于除了所有其他答案在这里太!

gev0vcfq

gev0vcfq4#

如果您使用的是默认名称为“"的”root“日志记录器,那么您可以使用以下技巧:

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

字符串
此外,您可能希望像上面的代码中那样指定日志记录级别,此级别将对所有后代记录器保持不变。
相反,如果指定了特定的logger,则

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')


上面的代码将创建新的logger 'my_service'。如果已经创建了记录器,则会清除所有句柄。它添加了用于在指定文件和控制台中写入的句柄。See official documentation as well的数据。
您也可以使用分层记录器。它直接完成。

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

dddzy1tm

dddzy1tm5#

import logging

logging.basicConfig(filename="logs.log", filemode="w", format="%(asctime)s %(message)s", level=0, force=True)

for i in range(2):
    print(f"hello {i}")
    logging.info(f"hello {i}")

字符串
设置level=0,filemode=“a”或“w”。如果您设置filemode w,那么它将覆盖以前日志,但是如果您想要附加日志,您必须使用filemode=“a”。

相关问题