gpt4 book ai didi

python - 将 header 写入 python 日志文件,但前提是记录被写入

转载 作者:太空狗 更新时间:2023-10-30 01:53:56 24 4
gpt4 key购买 nike

fh = logging.FileHandler('example.log',delay = True)
fh.setLevel(logging.INFO)

由于 delay 为 True,除非记录某些内容,否则永远不会写入文件。此时,文件中的第一行是第一条记录,它将包含 asctime、levelname 等元素

使用 python 2.7.10,是否有一种明智的方法可以在第一次写入不包含这些元素的记录时添加一行(或两行)?

我可以在使用它进行日志记录之前写入文件,但如果我这样做,我最终得到的日志是空的,但标题是空的。

所需的输出可能如下所示:

Using test.fil with option 7
2015-11-01 13:57:58,045 :log_example: INFO fn:main result:process 4 complete --7 knights said ni
2015-11-01 13:57:58,045 :log_example: INFO fn:main result:process 3 complete --3 bunnies attacked

谢谢,

最佳答案

子类 FileHandler 以创建您自己的自定义 FileHandleWithHeader,如下所示:

import os
import logging

# Create a class that extends the FileHandler class from logging.FileHandler
class FileHandlerWithHeader(logging.FileHandler):

# Pass the file name and header string to the constructor.
def __init__(self, filename, header, mode='a', encoding=None, delay=0):
# Store the header information.
self.header = header

# Determine if the file pre-exists
self.file_pre_exists = os.path.exists(filename)

# Call the parent __init__
logging.FileHandler.__init__(self, filename, mode, encoding, delay)

# Write the header if delay is False and a file stream was created.
if not delay and self.stream is not None:
self.stream.write('%s\n' % header)

def emit(self, record):
# Create the file stream if not already created.
if self.stream is None:
self.stream = self._open()

# If the file pre_exists, it should already have a header.
# Else write the header to the file so that it is the first line.
if not self.file_pre_exists:
self.stream.write('%s\n' % self.header)

# Call the parent class emit function.
logging.FileHandler.emit(self, record)

# Create a logger and set the logging level.
logger = logging.getLogger("example")
logger.setLevel(logging.INFO)

# Create a file handler from our new FileHandlerWith Header class and set the
# logging level.
fh = FileHandlerWithHeader('example.log', 'This is my header', delay=True)
fh.setLevel(logging.INFO)

# Add formatter to the file handler.
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
fh.setFormatter(formatter)

# Add the handler to the logger.
logger.addHandler(fh)

# Since the constructor of the FileHandlerWithHeader was passed delay=True
# the file should not exist until the first log as long as the log file did
# not pre-exist.
print "Ready to write to the the example.log file."
raw_input("Press Enter to continue...")

# Send 3 logs to the logger.
logger.info("First line in the file")
logger.info("Second line in the file")
logger.info("Third line in the file")

# The log file should now be created and only have a header at the begining of
# the file.
print "The example.log file should exist and have a header."

这个脚本应该像在 Python 2.7 中一样运行。如果“example.log”文件已经存在,则不会重新创建 header 。

此解决方案需要了解已找到的日志记录源代码 here和发现的 python 日志包的一般使用 here .

关于python - 将 header 写入 python 日志文件,但前提是记录被写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33468174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com