CSV Timeed RotatingFileHandler не вращается файлыPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 CSV Timeed RotatingFileHandler не вращается файлы

Сообщение Anonymous »

Нам необходимо выполнить запрос на наше приложение 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Вращение Loguru Timeed продолжает создавать файлы журнала при каждом запуске приложения
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • RotatingFileHandler сохраняет файл журнала открытым
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Radeon 6700 XT "Flip_done Timeed Out"
    Anonymous » » в форуме Linux
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Разделите столбцы списков из CSV на отдельные файлы CSV с помощью панд.
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Разделите столбцы списков из CSV на отдельные файлы CSV с помощью панд.
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»