Как можно напрямую записывать журналы в AWS S3 из памяти без предварительной записи на стандартный вывод? (Python, boto3) - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь записать файлы журнала 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, был похож на байты. Я уточню вопрос с точной ошибкой, как только у меня будет время, чтобы воссоздать проблему.

1 Ответ

0 голосов
/ 27 июня 2018

Вы должны добавить пару вещей здесь. Сначала создайте объект StringIO. Затем запишите журналы в объект StringIO, используя журнал StreamHandler. Добавьте обработчик в ваш логгер. Наконец, вызовите метод getvalue() для объекта StringIO. Вы можете написать это на 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...