Tworzę plik dziennika w ten sposób:

    global logger
    logger = logging.getLogger("plus_dig_cname")
    logger.setLevel(logging.DEBUG)

    fh = logging.FileHandler( fdoc_log + "/plus_dig_cname.log" )

    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)

    logger.addHandler(fh)

A gdy rozmiar Plus_dig_cname.log jest większy niż 300 MB, obsłużyłem go za pomocą skryptu powłoki, głównym procesem jest:

 mv $LOG_DIR/$1 $LOG_DIR/$1.bk
 [ $? -ne 0 ] && return 1
 touch $LOG_DIR/$1
 [ $? -ne 0 ] && return 1
 chmod 666 $LOG_DIR/$1
 [ $? -ne 0 ] && return 1

Tylko mv i dotknij nowego.
Problemem jest, że rejestrator nie może nic dziwić Plik plus_dig_cname.log. Rejestrowanie nie może działać.
Może można go rozwiązać przez:

with open( "plus_dig_cname.log", "w" ):
               pass

W ten sposób może uzyskać nowy plik dziennika Python. Ale chcę uzyskać nowy plik dziennika przez bash.

Dlatego, dlaczego rejestrowanie nie może pracować po "MV Touch Chmod"?

Dziękuję Ci

7
lxgeek 17 wrzesień 2012, 10:12

2 odpowiedzi

Najlepsza odpowiedź

Użyj a RotatingFileHandler, aby to było obsługiwane dla Ciebie.

Na przykład:

MAX_SIZE = 300 * 1024 * 1024
LOG_PATH = fdoc_log + "/plus_dig_cname.log"
fh = logging.handlers.RotatingFileHandler(LOG_PATH, maxBytes=MAX_SIZE, backupCount=5)

Spowoduje to utworzenie 5 kopii zapasowych o 300 MB każdy.

6
sberry 17 wrzesień 2012, 06:16

Plik jest otwarty podczas tworzenia FileHandler() lub na pierwszy zapis. Jeśli przeniesiesz plik; odeszło.

Możesz użyć logging.handlers.RotatingFileHandler, ponieważ @Sberry sugeruje, aby obrócić plik za pomocą Pythona.

Jeśli obrócisz pliki dziennika zewnętrznie np. Używając Logrotate możesz powiadomić swój skrypt, który plik odszedł np. Ponownie uruchomić go lub wysyła sygnał w etapie pretrotate.

Skrypt może automatycznie ponownie otworzyć plik, jeśli używasz czegoś takiego jak inotify, aby wykryć zmianę. Porównaj jak tail -f i tail -F praca.

1
jfs 17 wrzesień 2012, 06:43