我正在处理一项要求,必须将ETL脚本的日志保存到S3位置。
为此,我能够将日志存储在本地系统中,现在需要将它们上传到S3中。
为此,我编写了以下代码-
import logging
import datetime
import boto3
from boto3.s3.transfer import S3Transfer
from etl import CONFIG
FORMAT = '%(asctime)s [%(levelname)s] %(filename)s:%(lineno)s %
(funcName)s() : %(message)s'
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
logger = logging.getLogger()
logger.setLevel(logging.INFO)
S3_DOMAIN = 'https://s3-ap-southeast-1.amazonaws.com'
S3_BUCKET = CONFIG['S3_BUCKET']
filepath = ''
folder_name = 'etl_log'
filename = ''
def log_file_conf(merchant_name, table_name):
log_filename = datetime.datetime.now().strftime('%Y-%m-%dT%H-%M-%S') +
'_' + table_name + '.log'
fh = logging.FileHandler("E:/test/etl_log/" + merchant_name + "/"
+ log_filename)
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter(FORMAT, DATETIME_FORMAT))
logger.addHandler(fh)
client = boto3.client('s3',
aws_access_key_id=CONFIG['S3_KEY'],
aws_secret_access_key=CONFIG['S3_SECRET'])
transfer = S3Transfer(client)
transfer.upload_file(filepath, S3_BUCKET, folder_name+"/"+filename)
我在这里面临的问题是,日志是为不同的商人生成的,因此它们的名称是基于商人的,这是我在保存本地时所关心的。
但是对于在S3中上传,我不知道如何选择日志文件名。
有人可以帮助我实现我的目标吗?
答案 0 :(得分:1)
s3是一个对象存储,它没有“真实路径”,即所谓的路径。 “ /”分隔符实际上是修饰符。因此,没有什么可以阻止您使用与本地文件命名约定类似的东西。例如
transfer.upload_file(filepath, S3_BUCKET, folder_name+"/" + merchant_name + "/" + filename)
要列出任意路径下的所有文件(称为“前缀”),只需执行此操作
# simple list object, not handling pagination. max 1000 objects listed
client.list_objects(
Bucket = S3_BUCKET,
Prefix = folder_name + "/" + merchant_name
)