728x90
반응형

환경

ㆍPython 3.6

ㆍDjango 2.1.1

 

요약

Django의 settings.py 에서 다음과 같이 일단위로 로그 파일을 생성하게 설정하였으나 어느날 다음과 같은 오류가 발생하였다.

 

 # logger

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': "[%(asctime)s][%(levelname)s][%(name)s:%(lineno)s][%(funcName)s] %(message)s",
            'datefmt': "%Y-%m-%d %H:%M:%S"
        },
    },
    'handlers': {
        'file': {
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': 'logs/app.log',
            'when': 'D',
            'interval': 1,
            'backupCount': 30,
            'formatter': 'verbose',
        },
    },
    'loggers': {
        '': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}

- 오류 내용

Arguments: ()
--- Logging error ---
Traceback (most recent call last):
  File "C:\Users\Anaconda3\envs\py36_aid\lib\logging\handlers.py", line 72, in emit
    self.doRollover()
  File "C:\Users\Anaconda3\envs\py36_aid\lib\logging\handlers.py", line 396, in doRollover
    self.rotate(self.baseFilename, dfn)
  File "C:\Users\Anaconda3\envs\py36_aid\lib\logging\handlers.py", line 113, in rotate
    os.rename(source, dest)
PermissionError: [WinError 32] 다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다: 'logs/app.log' -> 'logs/app.log.2018-12-27'

 

원인

Django 웹 서버를 기동하면 아래와 같이 프로세스가 아래와 같이 2개 떠있는 것을 볼 수 있다. 

하나는 웹 서버를 기동한 프로세스이고 다른 하나는 python 소스 파일이 변경시 감시를 하여 소스를 바로 적용할 수 있도록 하는 프로세스이다.

root     14513 10272 24 09:36 pts/0    00:00:00 python manage.py runserver 0.0.0.0:81
root     14543 14513 64 09:36 pts/0    00:00:01 /home/py36_dev/bin/python manage.py runserver 0.0.0.0:81

 

 

웹 서버는 현재 로그 파일(app.log)을 이전 날짜 파일(app.log.yyyy-mm-dd)로 변경한 다음 새로운 로그 파일을 생성하려고 하는데 python 소스 파일이 변경시 감시하는 프로세스가 현재 로그 파일(app.log)을 엑세스하고 있기 때문에 파일 이름을 변경을 하지 못해서 발생하는 오류이다.

 

대응

웹 서버 기동 옵션에 --noreload를 설정하여 기동하도록 한다.

    • 변경전
nohup python manage.py runserver 0.0.0.0:80 1>/dev/null 2>&1 &
    • 변경후
nohup python manage.py runserver 0.0.0.0:80 --noreload 1>/dev/null 2>&1 &
 

 

728x90
반응형