我需要将日志保存到专用存储上的文件中(使用 S3BotoStorage)。我还没有找到任何有效的解决方案。有谁知道如何让它发挥作用?我需要将类似于logging.handlers.RotatingFileHandler的东西与备份结合起来。
这是我的设置.py:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
},
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'standard',
'filters': [],
},
'file': {
'level': 'INFO',
'class': 'fundamental.cdn.backends.LogsRootS3BotoStorage',
'formatter': 'standard',
'filename': 'logs.log',
},
},
'loggers': {
logger_name: {
'level': 'INFO',
'propagate': True,
'handlers': [],#['file'],
} for logger_name in ('django', 'django.request', 'django.db.backends', 'django.template', 'articles')
},
'root': {
'level': 'DEBUG',
'handlers': ['console'],
}
}
这是 cdn.backed
from storages.backends.s3boto3 import S3Boto3Storage
...
class LogsRootS3BotoStorage(S3Boto3Storage):
location = "logs"
file_overwrite = False
要使用
S3BotoStorage
直接登录到 Django 中的 S3 存储桶,您需要创建一个继承自 logging.Handler
的自定义日志处理程序,并利用 LogsRootS3BotoStorag
e 类进行 S3 交互。该处理程序应格式化日志记录并将其上传到 S3,必要时通过管理文件名或使用 S3 的版本控制功能来处理日志轮换。通过在处理程序部分中指定该处理程序并将其分配给适当的记录器,将此处理程序合并到您的 Django LOGGING 配置中。所以像这样:
import logging
from storages.backends.s3boto3 import S3Boto3Storage
class S3LoggingHandler(logging.Handler):
def __init__(self, bucket_name, log_file_prefix):
logging.Handler.__init__(self)
self.s3_client = S3Boto3Storage(bucket_name=bucket_name)
self.log_file_prefix = log_file_prefix
def emit(self, record):
log_entry = self.format(record)
# Implement your logic for rotating file names or managing versions here
file_name = f"{self.log_file_prefix}.log"
self.upload_log_to_s3(file_name, log_entry)
def upload_log_to_s3(self, file_name, log_entry):
# Append to the file if it exists, else create a new file
try:
# Try to read the existing log file from S3
content = self.s3_client.open(file_name).read()
new_content = content + '\n' + log_entry
except:
new_content = log_entry
# Write back the updated content
self.s3_client.save(file_name, new_content)
# Example usage in settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
's3': {
'level': 'INFO',
'class': 'path.to.S3LoggingHandler',
'bucket_name': 'your-s3-bucket-name',
'log_file_prefix': 'logs/my_app_log',
},
},
'loggers': {
# Your logger configuration
},
}