#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. Не уверен, почему это происходит