вращаться; в результате его можно легко использовать при настройке ведения журнала с использованием

ользую модуль регистрации в Python, и я хотел бы, чтобы он создавал новый файл журнала при каждом запуске моего приложения. Старые журнальные файлы должны быть повернуты (например: logfile.txt -> logfile1.txt и т. Д.).

Я уже нашел это:

http://docs.python.org/library/logging.html

BaseRotatingHandler - это базовый класс для обработчиков, которые вращают файлы журнала в определенный момент. Он не предназначен для непосредственного создания экземпляра. Вместо этого используйте RotatingFileHandler или TimedRotatingFileHandler.

RotatingFileHandler выполняет ролловер с заранее определенным размером, а TimedRotatingFileHandler выполняет ролловер в зависимости от произведения времени и интервала. И то, и другое не то, чего я хочу, я хочу, чтобы ротация происходила сразу после запуска моего приложения.

Ответы на вопрос(4)

ельны, когда приложение работает в течение очень длительного времени (дней), и вы хотите, чтобы журнал продолжал вращаться. В тех случаях, когда мне приходится вращать журнал при перезапуске приложения, мне приходилось делать это вне обработчика Logfile, что было проще. Это было похоже на то, что перед первым вызовом программы записи журнала я бы увидел, существует ли уже файл журнала, и если да, переименуйте его и создайте новый файл журнала. Переименование должно отличаться от механизма переименования обработчика.

ы, поэтому при каждом запуске приложения вы каждый раз получаете новый файл журнала.

например

dateTag = datetime.datetime.now().strftime("%Y-%b-%d_%H-%M-%S")
logging.basicConfig(filename="myapp_%s.log" % dateTag, level=logging.DEBUG)

так что каждый раз у вас будет логmyapp_2011-Jan-11_12-27-29.log

Еще одним преимуществом является то, что вы можете смешивать это с RotatingFileHandler, чтобы иметь отдельный журнал для каждого вызова приложения, где каждый сам журнал дополнительно делится на несколько журналов фиксированного размера.

 Overdrivr19 февр. 2016 г., 21:50
@ krypto07 У меня, используя FileHandler напрямую, работает без нареканий.handler = FileHandler('io-%s.log' % dateTag)
 krypto0705 сент. 2015 г., 13:04
Кто-нибудь пробовал это? В моем случае файл создается только для первого запуска, а для последующих запусков тот же файл выбирается и добавляется.
 Harkish21 янв. 2013 г., 08:30
Есть ли способ поставить метку времени в файле журнала в файле logging.conf?

чтобы иметь возможность принудительно чередовать журналы при запуске, основываясь на параметре командной строки, но файлы журналов могли вращаться в обычном порядке. Это было мое решение:

import logging

from logging.handlers import BaseRotatingHandler
from typing import Union

def rotate_logs(loggers: Union[str,list]=None, delimiter: str=','):
    """Rotate logs.

    Args:
        loggers: List of logger names as list object or as string,
            separated by `delimiter`.

        delimiter: Separator for logger names, if `loggers` is :obj:`str`.
            Defaults to ``,`` (comma).

    """

    # Convert loggers to list.
    if isinstance(loggers, str):
        loggers = [t.strip() for t in loggers.split(delimiter)]

    handlers = []
    root = logging.getLogger()

    # Include root logger in dict.    
    ld = {'': root, **root.manager.loggerDict}

    for k, v in ld.items():
        if loggers is not None and k not in loggers:
            continue

        try:
            for h in v.handlers:
                if (isinstance(h, BaseRotatingHandler) and
                    h not in handlers):

                    handlers.append(h)

        except AttributeError:
            pass

    for h in handlers:
        h.doRollover()



if __name__ == '__main__':
    pass

Примечания:

Это было проверено, чтобы работать, еслиmaxBytes > 0 наRotatingFileHandler.

Этот метод не был протестирован сTimedRotatingFileHandler, но должно работать.

Этот метод устраняет необходимость сохранять ссылку наRotatingFileHandler вращаться; в результате его можно легко использовать при настройке ведения журнала с использованиемlogging.config.

Решение Вопроса

RotatingFileHandler безmaxBytesзатем позвонитеdoRollover() при запуске приложения.

Да, похоже, работает нормально. Приведенный ниже код создаст новый файл журнала при каждом запуске приложения с добавленными временными метками для начала и закрытия журнала. Запустив его, вы напечатаете список доступных файлов журнала. Вы можете проверить их, чтобы проверить правильное поведение. Адаптировано из примера документов Python:

import os
import glob
import logging
import logging.handlers
import time

LOG_FILENAME = 'logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Check if log exists and should therefore be rolled
needRoll = os.path.isfile(LOG_FILENAME)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(LOG_FILENAME, backupCount=50)

my_logger.addHandler(handler)

# This is a stale log, so roll it
if needRoll:    
    # Add timestamp
    my_logger.debug('\n---------\nLog closed on %s.\n---------\n' % time.asctime())

    # Roll over on application start
    my_logger.handlers[0].doRollover()

# Add timestamp
my_logger.debug('\n---------\nLog started on %s.\n---------\n' % time.asctime())

# Log some messages
for i in xrange(20):
    my_logger.debug('i = %d' % i)

# See what files are created
logfiles = glob.glob('%s*' % LOG_FILENAME)

print '\n'.join(logfiles)
 kylejmcintyre19 сент. 2013 г., 22:46
Я почти уверен, что вы можете просто вызвать handler.doRollover (). Другими словами, сохранить ссылку на это где-нибудь.
 JS.30 июл. 2013 г., 00:56
+1 За практическое решение. К сожалению, это решение требует знания, какие обработчики заказов были добавлены - то есть my_logger.handlers [0] против my_logger.handlers [n]. Есть ли элегантный способ избежать жесткого кодирования этого значения?

Ваш ответ на вопрос