Нам необходимо выполнить запрос на наше приложение Python (v3.11.7) Django (v3.2.23) для регистрации конкретных событий, связанных с безопасностью, в файле CSV, который будет вращаться на почасовой основе и иметь имя файла, такое как Audit_logs20250130_0800-0900 .csv. < /p>
Наша задняя часть Django работает на контейнере Docker с такой точкой входной точки, такой /code> < /p>
Мы пытаемся реализовать это, унаследовав от logging.handlers.timedrotatingfileHandler для реализации CSVTimedRotatingFileHandler, который выглядит так: < /p>
import logging
import os
from datetime import datetime, timedelta
from logging.handlers import TimedRotatingFileHandler
import pytz
import redis
from django.conf import settings
REDIS_KEY = 'CSVTimedRotatingFileHandler_RolloverAt'
class CSVTimedRotatingFileHandler(TimedRotatingFileHandler):
def __init__(self, filename, when, interval, backup_count, encoding=None, delay=False, headers=None):
super().__init__(filename, when=when, interval=interval, backupCount=backup_count,
encoding=encoding, delay=delay, utc=False, atTime=None, errors=None)
self.headers = headers
def emit(self, record):
try:
last_rollover_at = self.get_redis_rollover_at_value()
# Check if a rollover happened and refresh the stream if needed (for multiple workers)
if self.rolloverAt != last_rollover_at:
self.rolloverAt = last_rollover_at
if self.stream and not self.stream.closed:
self.stream.close()
self.stream = self._open()
if self.shouldRollover(record):
self.doRollover()
# If the stream is still closed or None, open it again
if self.stream is None or self.stream.closed:
self.stream = self._open()
# Write headers if the file is empty
if self.stream.tell() == 0 and self.headers:
self.stream.write(','.join(self.headers) + self.terminator)
self.flush()
logging.FileHandler.emit(self, record)
except Exception:
self.handleError(record)
@staticmethod
def get_redis_rollover_at_value():
r = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=0)
redis_rollover_value = r.get(REDIS_KEY)
if redis_rollover_value:
formatted_redis_rollover_value = int(redis_rollover_value.decode('utf-8'))
else:
formatted_redis_rollover_value = 0
return formatted_redis_rollover_value
@staticmethod
def set_redis_rollover_at_value(value):
r = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=0)
r.set(REDIS_KEY, value)
def computeRollover(self, currentTime):
redis_rollover_value = self.get_redis_rollover_at_value()
if currentTime > redis_rollover_value:
utc_timezone = pytz.utc
date = datetime.fromtimestamp(currentTime, utc_timezone)
updated_date = date.replace(minute=0, second=0, microsecond=0) + timedelta(seconds=self.interval)
updated_timestamp = int(updated_date.timestamp())
self.set_redis_rollover_at_value(updated_timestamp)
return updated_timestamp
return redis_rollover_value
def rotation_filename(self, filename):
file = os.path.basename(self.baseFilename)
directory_path = os.path.dirname(self.baseFilename)
name = file.split('.')[0]
extension = file.split('.')[1]
dot = '.'
separator = '_'
rollover_date = datetime.fromtimestamp(self.rolloverAt, tz=pytz.timezone('UTC'))
date = rollover_date.strftime('%Y%m%d')
from_hour = (rollover_date - timedelta(hours=1)).hour
from_min = (rollover_date - timedelta(hours=1)).minute
to_hour = rollover_date.hour
to_minute = rollover_date.minute
hours_delta = f'{from_hour:02}{from_min:02}-{to_hour:02}{to_minute:02}'
return os.path.join(directory_path, f'{name}{date}{separator}{hours_delta}{dot}{extension}')
def getFilesToDelete(self):
result = []
directory_path = os.path.dirname(self.baseFilename)
files = [os.path.join(directory_path, f) for f in os.listdir(directory_path)
if os.path.isfile(os.path.join(directory_path, f)) and f != self.baseFilename]
if os.path.join(directory_path, self.baseFilename) in files:
files.remove(os.path.join(directory_path, self.baseFilename))
files.sort(key=os.path.getctime)
if len(files) > self.backupCount:
result = files[:len(files) - self.backupCount]
return result
def flush(self):
if self.stream and hasattr(self.stream, "flush"):
self.stream.flush()
< /code>
События регистрируются OK в файле CSV, но перевернуть файл не происходит. Если мы войдем в Python Manage Manage.py Shell внутри контейнера django, logging.handlers.timedrotatingfilehandler.shouldrollover reutrns Правильные результаты и если мы вручную выполняем logging.handlers.timedrotatingfilehandler.dorollover Это также происходит в порядке. br /> Есть идеи, почему? < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... ting-files
CSV Timeed RotatingFileHandler не вращается файлы ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Вращение Loguru Timeed продолжает создавать файлы журнала при каждом запуске приложения
Anonymous » » в форуме Python - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Разделите столбцы списков из CSV на отдельные файлы CSV с помощью панд.
Anonymous » » в форуме Python - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Разделите столбцы списков из CSV на отдельные файлы CSV с помощью панд.
Anonymous » » в форуме Python - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-