как использовать TimedRotatingFileHandler для имени файла в python logging.basicConfig?

#python-3.6 #python-logging

#python-3.6 #python-ведение журнала

Вопрос:

Впервые я использую модуль Python ‘logging’ и в настоящее время пытаюсь сгенерировать некоторый образец файла журнала с помощью «logging.basicConfig()». Мой основной мотив — сгенерировать образец файла журнала с датой в его названии «dd-mm-YY_.log». После выполнения некоторых первоначальных исследований я обнаружил, что мы можем использовать «TimedRotatingFileHandler» для выполнения задания. Ниже приведен пример кода из одного из сообщений Stackoverflow

 from logging.handlers import TimedRotatingFileHandler
fh = TimedRotatingFileHandler('mylogfile',  when='midnight')
fh.suffix = '%Y_%m_%d.log'
  

Но я не могу понять, как мне использовать «формат» и «уровень» из «logging.basicConfig» в функции TimedRotatingFileHandler().

Ниже приведен весь код python, который я написал:

 import logging
from logging.handlers import TimedRotatingFileHandler
log = logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', filename='log.txt', level=logging.INFO)
try:
    var = TimedRotatingFileHandler(log, when='midnight')
    var.suffix = '%y_%m_$d.log'
except Exception as e:
    print("expected str")
    logging.exception(e)

print(" ")
print("This is a Logging demo")
print(" ")
logging.info("new request came")
print(" ")
try:
    x = int(input("Enter the first number: "))
    y = int(input("Enter the second number: "))
    print(x / y)
except ZeroDivisionError as msg:
    print("cannot divide with zero")
    logging.exception(msg)
    print(" ")
except ValueError as msg:
    print("enter only integer value")
    logging.exception(msg)
    print(" ")
logging.info("executed successfully")
  

В приведенном выше коде все работало должным образом, пока я не захотел ввести в программу «TimedRotatingFileHandler».

Ниже приведена ошибка, которую я получаю в моем log.txt

 2019-03-25 14:14:00,528:ERROR:expected str, bytes or os.PathLike object, not NoneType
Traceback (most recent call last):
  File "/Users/amitesh/PycharmProjects/Automation/Databases/DB_Conn.py", line 17, in <module>
    var = TimedRotatingFileHandler(log, when='midnight')
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/logging/handlers.py", line 202, in __init__
    BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/logging/handlers.py", line 57, in __init__
    logging.FileHandler.__init__(self, filename, mode, encoding, delay)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/logging/__init__.py", line 1019, in __init__
    filename = os.fspath(filename)
TypeError: expected str, bytes or os.PathLike object, not NoneType
2019-03-25 14:14:00,530:INFO:new request came
  

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

Новая структура Журналов

 executed successfully
new request came
executed successfully
new request came
invalid literal for int() with base 10: ''
Traceback (most recent call last):
  File "/Users/amitesh/PycharmProjects/Automation/Databases/DB_Conn.py", line 61, in <module>
    y = int(input("Enter the second number: "))
ValueError: invalid literal for int() with base 10: ''
executed successfully
new request came
new request came
division by zero
Traceback (most recent call last):
  File "/Users/amitesh/PycharmProjects/Automation/Databases/DB_Conn.py", line 62, in <module>
    print(x / y)
ZeroDivisionError: division by zero
executed successfully
new request came
invalid literal for int() with base 10: 'er'
Traceback (most recent call last):
  File "/Users/amitesh/PycharmProjects/Automation/Databases/DB_Conn.py", line 61, in <module>
    y = int(input("Enter the second number: "))
ValueError: invalid literal for int() with base 10: 'er'
executed successfully
new request came
executed successfully
new request came
  

Любезно предложите.
Спасибо.

Ответ №1:

Это сделает работу, вы также можете настроить формат.

 root_logger = logging.getLogger()
formatter = logging.Formatter('%(asctime)s : %(msecs)d %(name)s %(levelname)s %(lineno)d %(message)s')
handler = TimedRotatingFileHandler(FILE_PATH_OR_NAME, 'midnight', 10)
handler.setFormatter(formatter)
root_logger.addHandler(handler)
root_logger.setLevel(logging.INFO)
  

Ответ №2:

Хорошо, я нашел ответ, и ниже приведен измененный код:

 import logging
from logging.handlers import TimedRotatingFileHandler
LOGGING_MSG_FORMAT = '%(name)-14s > [%(levelname)s] [%(asctime)s] : %(message)s'
LOGGING_DATE_FORMAT = '%Y-%m-%d %H:%M:%S'

logging.basicConfig(level=logging.DEBUG, format=LOGGING_MSG_FORMAT, datefmt=LOGGING_DATE_FORMAT)
root_logger = logging.getLogger('')
logger = logging.handlers.TimedRotatingFileHandler('amitesh.log', 'midnight', 1)
root_logger.addHandler(logger)
while True:
    print(" ")
    print("This is a Logging demo")
    print(" ")
    logging.info("new request came")
    print(" ")
    try:
        x = int(input("Enter the first number: "))
        y = int(input("Enter the second number: "))
        print(x / y)
    except ZeroDivisionError as msg:
        print("cannot divide with zero")
        logging.exception(msg)
        print(" ")
    except ValueError as msg:
        print("enter only integer value")
        logging.exception(msg)
        print(" ")
    logging.info("executed successfully")
  

Комментарии:

1. Но в сгенерированном файле журнала я не могу найти дату / временную метку, я также не нахожу имя регистратора, и я также не нахожу «уровень». Я добавил новые журналы, сгенерированные в исходном сообщении. Удивительно, но я мог видеть имя регистратора, тип уровня и дату / временную метку в консоли моей IDE. Не уверен, почему это происходит