我正在尝试将Python日志文件直接写入S3,而不先将它们保存到stdout。我希望在程序运行完毕后将日志文件自动写入S3。我想使用boto3 put_object
方法:
import atexit
import logging
import boto3
def write_logs(body, bucket, key):
s3 = boto3.client("s3")
s3.put_object(Body=body, Bucket=bucket, Key=key)
log = logging.getLogger("some_log_name")
log.info("Hello S3")
atexit.register(write_logs, body=log, bucket="bucket_name", key="key_name")
quit()
上传到S3时抛出错误。如果我没记错的话,它要求上传到S3的对象必须是字节状的。我有时间重新创建问题后,将使用确切的错误来更新问题。
答案 0 :(得分:2)
您需要在此处添加一些内容。首先,创建一个StringIO对象。然后,使用日志记录StreamHandler将日志写入StringIO对象。将处理程序添加到记录器中。最后,在StringIO对象上调用getvalue()
方法。您可以将其写入S3。
import atexit
import io
import logging
import boto3
def write_logs(body, bucket, key):
s3 = boto3.client("s3")
s3.put_object(Body=body, Bucket=bucket, Key=key)
log = logging.getLogger("some_log_name")
log_stringio = io.StringIO()
handler = logging.StreamHandler(log_stringio)
log.addHandler(self.handler)
atexit.register(write_logs, body=log_stringio.getvalue(), bucket="bucket_name", key="key_name")
log.info("Hello S3")
quit()