Python日志模块不支持';无法写入日志文件
我的脚本有问题,我正在尝试为此函数的每次调用创建一个日志文件:Python日志模块不支持';无法写入日志文件,python,logging,Python,Logging,我的脚本有问题,我正在尝试为此函数的每次调用创建一个日志文件: @begin.subcommand def sample_mode(sample, folder = None, reference = None, dbsnp = None): """ creates a config file for 1 sample - setup logging system: {folder}/logs/{sample}_init.log - takes in a sample
@begin.subcommand
def sample_mode(sample, folder = None, reference = None, dbsnp = None):
""" creates a config file for 1 sample
- setup logging system: {folder}/logs/{sample}_init.log
- takes in a sample name
- creates a file: {folder}/{sample}_config.yaml
"""
# get the current folder if none is given
if folder == None:
folder = os.getcwd()
# create logs folder if necessary
if not os.path.isdir("{}/logs".format(folder)):
os.mkdir("{}/logs".format(folder))
log_file = setup_log(sample, folder)
for i in range(1,3):
try:
os.path.getsize("{}/{}.{}.fq.gz".format(folder, sample, i))
except FileNotFoundError:
log_file.error("{}/{}.{}.fq.gz doesn't exist".format(folder, sample, i))
return -1
if os.path.getsize("{}/{}.{}.fq.gz".format(folder, sample, i)) == 0:
log_file.error("\"{}/{}.{}.fq.gz\" is empty\n".format(folder, sample, i))
return -1
# set up logging system
# logging.basicConfig(filename = "{}/logs/{}_init.log".format(folder, sample), level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
# create the config file
with open("{}/{}_config.yaml".format(folder, sample), "w") as config:
config.write("sample: \"{}\"\n\n".format(sample))
log_file.info("Sample name: {}".format(sample))
def setup_log(sample, folder):
logger = logging.getLogger(__name__)
log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
filename = "{}/logs/{}_init.log".format(folder, sample)
log_handler = logging.FileHandler(filename)
log_handler.setLevel(logging.DEBUG)
log_handler.setFormatter(log_format)
logger.addHandler(log_handler)
return logger
作为参考,设置日志功能:
@begin.subcommand
def sample_mode(sample, folder = None, reference = None, dbsnp = None):
""" creates a config file for 1 sample
- setup logging system: {folder}/logs/{sample}_init.log
- takes in a sample name
- creates a file: {folder}/{sample}_config.yaml
"""
# get the current folder if none is given
if folder == None:
folder = os.getcwd()
# create logs folder if necessary
if not os.path.isdir("{}/logs".format(folder)):
os.mkdir("{}/logs".format(folder))
log_file = setup_log(sample, folder)
for i in range(1,3):
try:
os.path.getsize("{}/{}.{}.fq.gz".format(folder, sample, i))
except FileNotFoundError:
log_file.error("{}/{}.{}.fq.gz doesn't exist".format(folder, sample, i))
return -1
if os.path.getsize("{}/{}.{}.fq.gz".format(folder, sample, i)) == 0:
log_file.error("\"{}/{}.{}.fq.gz\" is empty\n".format(folder, sample, i))
return -1
# set up logging system
# logging.basicConfig(filename = "{}/logs/{}_init.log".format(folder, sample), level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
# create the config file
with open("{}/{}_config.yaml".format(folder, sample), "w") as config:
config.write("sample: \"{}\"\n\n".format(sample))
log_file.info("Sample name: {}".format(sample))
def setup_log(sample, folder):
logger = logging.getLogger(__name__)
log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
filename = "{}/logs/{}_init.log".format(folder, sample)
log_handler = logging.FileHandler(filename)
log_handler.setLevel(logging.DEBUG)
log_handler.setFormatter(log_format)
logger.addHandler(log_handler)
return logger
日志文件已创建,但为空。但是,如果输入了错误的示例名称,则会创建日志文件并写入错误消息
我做错了什么?您的代码中有一些错误,应该可以:
import logging
def setup_log(name):
logger = logging.getLogger(name) # > set up a new name for a new logger
logger.setLevel(logging.DEBUG) # here is the missing line
log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
filename = f"./test_{name}.log"
log_handler = logging.FileHandler(filename)
log_handler.setLevel(logging.DEBUG)
log_handler.setFormatter(log_format)
logger.addHandler(log_handler)
return logger
def test_log(name):
logger = setup_log(name)
logger.info("Just logged from %s", name) # > old formatting syntax is advised by the logging cookbook
test_log("log1")
test_log("log2")
test_log("log3")
未写入日志文件,因为在设置处理程序的级别之前,必须先设置记录器的级别
另外,您必须知道logging.getLogger(name)
返回一个单例。如果您使用以前使用的名称调用getLogger
m函数,这将返回现有的记录器,这可能会导致出现非常奇怪的情况。。。为了说明这一点:
def test_log(name):
logger = setup_log(name)
相当于
def test_log(name):
setup_log(name)
logger = logging.getLogger(name)
详情如下:
谢谢,现在可以用了。我在网上找到的示例在处理程序对象上使用了setLevel方法,我想这是错的?这没有错,您可以在根(
日志记录
)级别、日志记录程序级别和处理程序级别设置级别。如果记录器的级别为ERROR,则处理程序将永远不会收到消息,无论其级别如何