【问题标题】:How Can I Write Logs Directly to AWS S3 from Memory Without First Writing to stdout? (Python, boto3)如何在不先写入标准输出的情况下将日志从内存直接写入 AWS S3? (Python,boto3)
【发布时间】:2018-12-06 19:52:32
【问题描述】:

我正在尝试将 Python 日志文件直接写入 S3,而无需先将它们保存到标准输出。我希望在程序运行完成后将日志文件自动写入 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 的对象必须是字节状的。一旦我有时间重新创建问题,我将使用确切的错误更新问题。

【问题讨论】:

    标签: python-3.x amazon-s3 boto3


    【解决方案1】:

    您需要在此处添加一些内容。首先,创建一个 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(handler)
    
    atexit.register(write_logs, body=log_stringio.getvalue(), bucket="bucket_name", key="key_name")
    
    log.info("Hello S3")
    
    quit()
    

    【讨论】:

    • atexit ... TIL
    • 顺便说一句,它是log.addHandler(handler)(没有self.
    • @shadi 不错。为了 Stack Overflow 的简单起见,我将它从其类中提取出来。谢谢:)
    • 如果您没有看到上述代码的任何输出,如doco 所示,默认情况下日志记录级别设置为警告。所以 log.info("Hello S3") 不会输出任何东西,除非通过logging.basicConfig(level=logging.INFO)将日志级别更改为 info
    • 当我将log_stringio.getvalue() 注册到atexit 时,它对我不起作用。所以我刚刚注册了log_stringio 并在write_log 函数中调用了get_value() -> s3.put_object(Body=body.getvalue(), Bucket=bucket, Key=key)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多