2014-10-31 9 views
7

Mam problem z RotatingFileHander z Django.Django - Obracanie pliku obsługi pliku zablokowane, gdy plik jest równy maxBytes

Problemem jest to, że gdy plik jest do wielkości maxBytes, nie stworzy nowy plik i nadać komunikat o błędzie, gdy staramy się robić logger.info („żadnych wiadomości”):

Dziwna część:

  1. Nikt nie udostępnia rejestratorów, widoki miałyby własny rejestrator, zadania od selera mają własne rejestratory.
  2. Przewoźnicy są inicjowane tylko raz na początku pliku (chartLogger = getLogger ...) różne funkcje w tym samym pliku będzie używać tej samej nazwy

    Logged from file views.py, line 1561 
    Traceback (most recent call last): 
        File "C:\Python27\lib\logging\handlers.py", line 77, in emit 
        self.doRollover() 
        File "C:\Python27\lib\logging\handlers.py", line 142, in doRollover 
        os.rename(self.baseFilename, dfn) 
    WindowsError: [Error 32] The process cannot access the file because it is being used by another process 
    

Wewnątrz mojego settings.py , Mam:

LOGGING = { 
      'version': 1, 
      'disable_existing_loggers': True, 
      'formatters' : { 
       'standard' : { 
        'format' : '%(asctime)s [%(levelname)s] %(name)s: %(message)s' 
       }, 
      }, 
      'handlers': { 
       'celery.webapp' : { 
        'level' : 'ERROR', 
        'class' : 'django.utils.log.AdminEmailHandler', 
       }, 
       'celery' : { 
        'level' : 'INFO', 
        'class' : 'logging.handlers.RotatingFileHandler', 
        'filename' : 'logs/celery.log', 
        'maxBytes' : 1024*1024*10, # 10MB 
        'backupCount' : 10, 
        'formatter' : 'standard', 
       }, 
       'views.error' : { 
        'level' : 'ERROR', 
        'class' : 'django.utils.log.AdminEmailHandler', 
       }, 
       'views' : { 
        'level' : 'INFO', 
        'class' : 'logging.handlers.RotatingFileHandler', 
        'filename' : 'logs/views.log', 
        'maxBytes' : 1024*1024*10, # 10MB 
        'backupCount' : 10, 
        'formatter' : 'standard', 
       }, 
      }, 

      'loggers': { 
       'celery.webapp' : { 
        'level' : 'ERROR', 
        'handlers' : ['celery.webapp'], 
        'propogate' : True, 
       }, 
       'celery.webapp.task' : { 
        'level' : 'INFO', 
        'handlers' : ['celery'], 
        'propogate' : True, 
       }, 
       'views.logger' : { 
        'level' : 'ERROR', 
        'handlers' : ['views.error'], 
        'propogate' : True, 
       }, 
       'views.logger.login' : { 
        'level' : 'INFO', 
        'handlers' : ['views'], 
        'propogate' : True, 
       }, 
       'views.logger.register' : { 
        'level' : 'INFO', 
        'handlers' : ['views'], 
        'propogate' : True, 
       }, 
       'views.logger.chartConfigure' : { 
        'level' : 'INFO', 
        'handlers' : ['views'], 
        'propogate' : True, 
       }, 
       'views.logger.sendEmail' : { 
        'level' : 'INFO', 
        'handlers' : ['views'], 
        'propogate' : True, 
       }, 
      }, 
    } 

Próbowałem zmienić różne rozmiary plików, ale utknął w maxBytes.

Mimo że powiedział, że proces nie może uzyskać dostępu do pliku, ponieważ jest używany przez inne procesy. Całe logowanie jest w porządku, zanim osiągnie maksymalny poziom.

EDIT:

mam podzielić rejestrowanie między selera i Django.

LOGGING = { 
     'version': 1, 
     'disable_existing_loggers': True, 
     'formatters' : { 
      'standard' : { 
       'format' : '%(asctime)s [%(levelname)s] %(name)s: %(message)s' 
      }, 
     }, 
     'handlers': { 
      'celery.webapp' : { 
       'level' : 'ERROR', 
       'class' : 'django.utils.log.AdminEmailHandler', 
      }, 
      'celery' : { 
       'level' : 'INFO', 
       'class' : 'logging.handlers.RotatingFileHandler', 
       'filename' : 'logs/celery.log', 
       'maxBytes' : 1024*1024*10, # 10MB 
       'backupCount' : 10, 
       'formatter' : 'standard', 
      }, 
      'celery_chartConfigure' : { 
       'level' : 'INFO', 
       'class' : 'logging.handlers.RotatingFileHandler', 
       'filename' : 'logs/celery_chartConfigure.log', 
       'maxBytes' : 1024*1024*10, # 10MB 
       'backupCount' : 10, 
       'formatter' : 'standard', 
      }, 
      'celery_register' : { 
       'level' : 'INFO', 
       'class' : 'logging.handlers.RotatingFileHandler', 
       'filename' : 'logs/celery_register.log', 
       'maxBytes' : 1024*1024*10, # 10MB 
       'backupCount' : 10, 
       'formatter' : 'standard', 
      }, 
      'views.error' : { 
       'level' : 'ERROR', 
       'class' : 'django.utils.log.AdminEmailHandler', 
      }, 
      'views' : { 
       'level' : 'INFO', 
       'class' : 'logging.handlers.RotatingFileHandler', 
       'filename' : 'logs/views.log', 
       'maxBytes' : 1024*1024*10, # 10MB 
       'backupCount' : 10, 
       'formatter' : 'standard', 
      }, 
      'views_login' : { 
       'level' : 'INFO', 
       'class' : 'logging.handlers.RotatingFileHandler', 
       'filename' : 'logs/views_login.log', 
       'maxBytes' : 1024*1024*10, # 10MB 
       'backupCount' : 10, 
       'formatter' : 'standard', 
      }, 
      'views_sendEmail' : { 
       'level' : 'INFO', 
       'class' : 'logging.handlers.RotatingFileHandler', 
       'filename' : 'logs/views_sendEmail.log', 
       'maxBytes' : 1024*1024*10, # 10MB 
       'backupCount' : 10, 
       'formatter' : 'standard', 
      }, 
      'views_register' : { 
       'level' : 'INFO', 
       'class' : 'logging.handlers.RotatingFileHandler', 
       'filename' : 'logs/views_register.log', 
       'maxBytes' : 1024*1024*10, # 10MB 
       'backupCount' : 10, 
       'formatter' : 'standard', 
      }, 
      'views_chartConfigure' : { 
       'level' : 'INFO', 
       'class' : 'logging.handlers.RotatingFileHandler', 
       'filename' : 'logs/views_chartConfigure.log', 
       'maxBytes' : 1024*1024*10, # 10MB 
       'backupCount' : 10, 
       'formatter' : 'standard', 
      }, 
     }, 

     'loggers': { 
      'celery.webapp' : { 
       'level' : 'ERROR', 
       'handlers' : ['celery.webapp'], 
       'propogate' : True, 
      }, 
      'celery.webapp.task' : { 
       'level' : 'INFO', 
       'handlers' : ['celery'], 
       'propogate' : True, 
      }, 
      'celery.webapp.chartConfigure' : { 
       'level' : 'INFO', 
       'handlers' : ['celery_chartConfigure'], 
       'propogate' : True, 
      }, 
      'celery.webapp.register' : { 
       'level' : 'INFO', 
       'handlers' : ['celery_register'], 
       'propogate' : True, 
      }, 
      'views.logger' : { 
       'level' : 'ERROR', 
       'handlers' : ['views.error'], 
       'propogate' : True, 
      }, 
      'views.logger.login' : { 
       'level' : 'INFO', 
       'handlers' : ['views_login'], 
       'propogate' : True, 
      }, 
      'views.logger.register' : { 
       'level' : 'INFO', 
       'handlers' : ['views_register'], 
       'propogate' : True, 
      }, 
      'views.logger.chartConfigure' : { 
       'level' : 'INFO', 
       'handlers' : ['views_chartConfigure'], 
       'propogate' : True, 
      }, 
      'views.logger.sendEmail' : { 
       'level' : 'INFO', 
       'handlers' : ['views_sendEmail'], 
       'propogate' : True, 
      }, 
     }, 
} 

Jednak nadal ma problemy z wykonaniem doRollOver.

Czy podzielenie dzienników między selerami i Django nie rozwiązałoby problemu? Ponieważ nie ma kilku procesów uzyskujących dostęp do dziennika, ale tylko Django lub Seler.

EDYTUJ 2:

Wykonuję również połączenia Ajax. Czy w ten sposób pojawi się inny proces, który może zakłócać logowanie?

Odpowiedz

10

Chyba napotykają problem opisany w tym poście: Django logging with RotatingFileHandler error

To znaczy, gdy uruchomiony serwer deweloperski Django, rzeczywiście istnieją dwa uruchomione procesy.

domyślnie działają dwa procesy serwerów Django. Jednym z nich jest rzeczywisty serwer , a drugim jest wykrywanie zmian w kodzie i ponowne ładowanie serwera przez . Dlatego plik settings.py jest importowany dwukrotnie, a następnie w konsekwencji oba procesy uzyskują dostęp do pliku dziennika w tym samym czasie: .

Jak poinformowała tam, spróbuj

python manage.py runserver --noreload 
+1

Witam, dziękuję za odpowiedź! Dodanie --noreload nie rozwiązuje problemu. – user1157751

2

Jak opisać w innych odpowiedzi python manage.py runserver --noreload zadziała. Ale tutaj jest inne rozwiązanie, które nadal działa z przeładowaniem kodu.

Dodaj to na końcu swoich ustawień.py

if DEBUG and os.environ.get('RUN_MAIN', None) != 'true': 
    LOGGING = {} 

python manage.py runserver rozpoczyna proces Pythona, który uruchamia serwer w procesie Pythona dziecko. Za każdym razem, gdy rodzic wykryje zmianę, odtwarza nowe dziecko. Problem polega na tym, że rotacja dziennika przez proces potomny nie powiedzie się, ponieważ rodzic nadal ma uchwyt tego pliku. To rozwiązanie mówi rodzicowi, że nie ma pliku dziennika.

+0

Dzięki, spróbuję to następnym razem – user1157751

+0

To działa jak wdzięk dziękuję. PITA musiała przejść na '--noreload' lub usunąć rotację logów podczas pracy na moim komputerze. – whoisearth

Powiązane problemy