Как записывать сообщения консоли в файл? Python 3
Выполняю скрипт на pythonanywhere.com. Иногда скрипт отключается, при этом в консоли ничего нет (даже сообщений через print), т.е. из консоли пропадают все сообщение. Для того, что бы видеть ошибки, хочу весь вывод консоли копировать в файл. Но не могу, этого сделать.
Нужно запускать логирование прямо из скрипта. C:> py скрипт.py > log.txt не подходит.
Пишу ВК бота. Примерный вид кода:
import всякой-всячины
много_переменных = значения
#тут главный цикл
while True:
тут много if
В коддинге недавно. Если что не так - бейте санными тряпками
upd Покажу весь код. Может, чего подскажете.
import vk_api
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
import random
import datetime
import requests
#переменные
from_id_old = 0
chat_id_old = 0
#полученные сообщения
cmdREF = ["!реф", "дай реф", "Дай реф", "даф реф", "Даф реф", "смотри в рефе", "Смотри в рефе", "смотри в референсе", "Смотри в референсе", "СУКА ДАЙ РЕФ"]
cmdTEST = ["!тест", "!test"]
#Авторизация
token = 'ЦЕНЗУРА'
group = 'ЦЕНЗУРА'
vk_session = vk_api.VkApi(token=token)
vk = vk_session.get_api()
while True:
longpoll = VkBotLongPoll(vk_session, group)
try:
for event in longpoll.listen():
if event.type == VkBotEventType.MESSAGE_NEW:
msg = event.object.message['text']
#вывод лога
timestamp = event.object.message['date']
value = datetime.datetime.fromtimestamp(timestamp)
from_id_new = event.object.message['from_id']
chat_id_new = event.chat_id
if from_id_old != from_id_new or chat_id_old != chat_id_new:
from_id_old = from_id_new
chat_id_old = chat_id_new
if event.from_user:
print (" [От ",event.object.message['from_id'],"]\n",value.strftime('%Y-%m-%d %H:%M:%S'),"| ", msg, sep='')
else:
print (" [Беседа №",event.chat_id,"] [От ",event.object.message['from_id'],"]\n",value.strftime('%Y-%m-%d %H:%M:%S'),"| ", msg, sep='')
else:
print (value.strftime('%Y-%m-%d %H:%M:%S'),"| ", msg, sep='')
#логика бота
if (msg in cmdREF):
vk.messages.send(
random_id=random.randint(1, 2147483647),
peer_id=event.object.message['peer_id'],
message='https://docs.google.com/spreadsheets/d/1vEku_j8QwgsTzB5oMS_IDUiHfhzZVESeSrkyrS4tndk/edit?usp=drive_web&ouid=113405240046602651547',
)
elif (msg in cmdTEST):
vk.messages.send(
random_id=random.randint(1, 2147483647),
peer_id=event.object.message['peer_id'],
message= "TEST, BOT ACTIVE. Кто будет использовать эту команду, тому бан.@ЦЕНЗУРА",
)
except requests.exceptions.ReadTimeout as timeout:
continue
Ответы (4 шт):
Не могу конечно претендовать на 100%-ную правду т.к. тоже не давно в питоне начал шарить, но я считаю что у тебя нет ошибок, а сайт не может выводить в реальном времени изменения лога и просто советую сделай это через консоль в винде, так как у тебя может быть большой код, который в реальном времени отправляет огромное количество данных в лог и попробуй оптимизировать его, а еще сделай ему конец, если его нет...
Посмотрите эту ссылку: https://python-scripts.com/logging-python . Там рассказано о логгировании в Python. С помощью данной библиотеки можно записывать абсолютно все действия и события, которые происходят в работе программы. Но сразу предупреждаю вас, делать логгирование и понимать что вы делаете - сложно. Если хотите использовать логи на постоянной основе, то придётся очень долго вникать в это дело(одной - двух статей будет недостаточно)
Если у вас бесплатный аккаунт pythonanywhere.com, то у вас "мягкое" ограничение на 100 секунд CPU в день (см. Pricing). Если бы у вас был просто пустой цикл while True, вы бы выработали лимит очень быстро (за 100 секунд), а так как у вас большую часть времени приложение в режиме ожидания, то хватает на дольше.
После того как ограничение превышено, вашему приложению сначала понижают приоритет, если же ограничение превышено более чем в 10 раз, то приложение прибивают (если быть более точным - "оставляют за собой право прибить" ваши процессы - "we reserve the right to kill them" - см. Trapit ("битумная яма" - так они называют принудительное понижение приоритета)).
Фактически процесс с пустым бесконечным циклом на бесплатном аккаунте прибьют примерно через 4 с половиной часа (установлено опытным путем - в консоли запустил бесконечный цикл, который каждую секунду пишет текущее время).
Если это действительно превышение лимитов, никаких сообщений об ошибке скорее всего вы не увидите, но вам на почту должны были прийти уведомления с темами [PythonAnywhere] Your processes are in the tarpit, потом [PythonAnywhere] Your processes have been killed.
Бот вырубался, потому что происходил time-out. Надо весь код обернуть в
try:
...
except (requests.exceptions.ReadTimeout, socket.timeout, urllib3.exceptions.ReadTimeoutError) as timeout:
continue
Раньше было только except requests.exceptions.ReadTimeout