본문 바로가기
백엔드/개발

Django - 웹 서버 기동시 LOG 파일 엑세스 오류

by yscho03 2018. 12. 31.
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
반응형