如何使用 Django Logging 将日志保存到 S3Boto3Storage

问题描述 投票:0回答:1

我需要将日志保存到专用存储上的文件中(使用 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
python django logging boto
1个回答
0
投票

要使用

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
    },
}

© www.soinside.com 2019 - 2024. All rights reserved.