Size: a a a

2020 December 06

🚲U

🚲 Oleh Kopyl UI/UX d... in SPb Python
Как настроить logger чтобы он работал исключительно как print, только с выводом и в файл и в терминал одновременно и без задержек?

То есть чтобы. написал

log("тест")

а мне в ответ сразу же

тест

+ то же в файл

без всяких ваших file.py > fuck.txt

То есть по сути то же что и принт, но для людей
источник

ЮШ

Юрий Шумилов... in SPb Python
import os
import sys
import logging
from logging.handlers import SysLogHandler

log_format = logging.Formatter("[%(asctime)s] [%(levelname)s] - %(message)s")
log_level = logging.DEBUG
log_file_max_bytes = 1024 * 1024 * 50 # 50 это MB
log_file_backup_count = 5
logger = logging.getLogger("logname")
logger.setLevel(log_level)
# Добаляем вывод в консоль
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(log_level)
console_handler.setFormatter(log_format)
logger.addHandler(console_handler)
# Добаляем вывод в файл
file_handler = logging.handlers.RotatingFileHandler("fuck.txt", maxBytes=log_file_max_bytes, backupCount=log_file_backup_count)
file_handler.setLevel(log_level)
file_handler.setFormatter(log_format)
logger.addHandler(file_handler)
# по желанию, если код исполняется не под windows, выводим в syslog
if os.path.exists("/dev/log"):
   syslog_handler = SysLogHandler()
   syslog_handler.setLevel(log_level)
   syslog_handler.setFormatter(log_format)
   logger.addHandler(syslog_handler)
источник

🚲U

🚲 Oleh Kopyl UI/UX d... in SPb Python
Подскажите плиз как в loguru ротировать файлик чтобы он перезаписывался, если достигает нужного обьема.

Например вот достиг он 10 мб и первые строки файла удаляются и новая инфа все так же дописывается в конец файла, как и дописывалась.

Никаких новых файлов и зипов, спасибо
источник

🚲U

🚲 Oleh Kopyl UI/UX d... in SPb Python
Юрий Шумилов
import os
import sys
import logging
from logging.handlers import SysLogHandler

log_format = logging.Formatter("[%(asctime)s] [%(levelname)s] - %(message)s")
log_level = logging.DEBUG
log_file_max_bytes = 1024 * 1024 * 50 # 50 это MB
log_file_backup_count = 5
logger = logging.getLogger("logname")
logger.setLevel(log_level)
# Добаляем вывод в консоль
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(log_level)
console_handler.setFormatter(log_format)
logger.addHandler(console_handler)
# Добаляем вывод в файл
file_handler = logging.handlers.RotatingFileHandler("fuck.txt", maxBytes=log_file_max_bytes, backupCount=log_file_backup_count)
file_handler.setLevel(log_level)
file_handler.setFormatter(log_format)
logger.addHandler(file_handler)
# по желанию, если код исполняется не под windows, выводим в syslog
if os.path.exists("/dev/log"):
   syslog_handler = SysLogHandler()
   syslog_handler.setLevel(log_level)
   syslog_handler.setFormatter(log_format)
   logger.addHandler(syslog_handler)
Это будет работать так же как и print принимая все те же аргументы что и print?
источник

ЮШ

Юрий Шумилов... in SPb Python
🚲 Oleh Kopyl UI/UX designer
Подскажите плиз как в loguru ротировать файлик чтобы он перезаписывался, если достигает нужного обьема.

Например вот достиг он 10 мб и первые строки файла удаляются и новая инфа все так же дописывается в конец файла, как и дописывалась.

Никаких новых файлов и зипов, спасибо
logging.handlers.RotatingFileHandler("fuck.txt", maxBytes=1024*1024*10)
источник

ЮШ

Юрий Шумилов... in SPb Python
🚲 Oleh Kopyl UI/UX designer
Это будет работать так же как и print принимая все те же аргументы что и print?
да.
единственное настроить надо log_format = logging.Formatter("[%(asctime)s] [%(levelname)s] - %(message)s") под ваши требования.
То есть если не хотите дополнительную информацию выводить, то можно просто указать log_format = logging.Formatter(" %(message)s")
источник
2020 December 07

🚲U

🚲 Oleh Kopyl UI/UX d... in SPb Python
Юрий Шумилов
да.
единственное настроить надо log_format = logging.Formatter("[%(asctime)s] [%(levelname)s] - %(message)s") под ваши требования.
То есть если не хотите дополнительную информацию выводить, то можно просто указать log_format = logging.Formatter(" %(message)s")
Бред, конечно.

Но спасибо.

Я сделал по-своему
источник

🚲U

🚲 Oleh Kopyl UI/UX d... in SPb Python
🚲 Oleh Kopyl UI/UX designer
Бред, конечно.

Но спасибо.

Я сделал по-своему
источник

ЮШ

Юрий Шумилов... in SPb Python
через велосипеды учатся - тоже полезно, но учится использовать встроенные инструменты (батарейки) нужно и код читать
источник

ЮШ

Юрий Шумилов... in SPb Python
зачем 2 раза контекстный менеджер на один и тот же файл?
# Предупреждение, читать в память надо относительно не большой кусок файла, так как память не безгранична, но для файла 10Mb сгодится. В момент чтения все содержимое нового файла будет в памяти и мы не можем заранее знать сколько свободной памяти на устройстве в данный момент и это частая ошибка. Для небольших файлов это работает отлично.
with open(file, "rb+") as log_file:
   # будущий размер файла
   file_size = file_size_limit_bytes * 0.25
   # переходим в файле на позицию будущего размера файла считая от конца файла
   log_file.seek(file_size) .seek(file_size * -1, os.SEEK_END)
   # читаем от этой позиции до конца файла
   file_data = log_file.read()
   # переходим в начало файла
   log_file.seek(0)
   # записываем новые данные
   log_file.write(file_data)
   # усекаем файл до размера нового файла
   log_file.truncate(file_size)
источник

p

pragus in SPb Python
Попробуйте не читать все содержимое файла в память
источник

p

pragus in SPb Python
Потому что если file_size_limit_bytes=4*1024*1024*1024 (это 4гб), ваш python-процесс распухнет на эти самые 4гб.

А дальше может прийти oom killer с sigkill, например
источник

ЮШ

Юрий Шумилов... in SPb Python
pragus
Потому что если file_size_limit_bytes=4*1024*1024*1024 (это 4гб), ваш python-процесс распухнет на эти самые 4гб.

А дальше может прийти oom killer с sigkill, например
поэтому лучше пользоваться батарейками в которых это учтено, а тут велосипед же строится и он должен строится поэтапно, пока не будет выкинут и заменен на решение, которым все пользуются и оно настраивается. Но опыт строительства полезен. Сделал заметку в предыдущем коде в виде предупреждения.
источник

p

pragus in SPb Python
Юрий Шумилов
поэтому лучше пользоваться батарейками в которых это учтено, а тут велосипед же строится и он должен строится поэтапно, пока не будет выкинут и заменен на решение, которым все пользуются и оно настраивается. Но опыт строительства полезен. Сделал заметку в предыдущем коде в виде предупреждения.
Это да. Шишки полезны
источник

🚲U

🚲 Oleh Kopyl UI/UX d... in SPb Python
pragus
Попробуйте не читать все содержимое файла в память
А как?
источник

ЮШ

Юрий Шумилов... in SPb Python
ну тут усложнение прям будет или прыгать туда сюда читая и записывая блоками, или записывать в новый файл с дальнейшим удалением исходного файла и переименование нового в старый.
источник

ЮШ

Юрий Шумилов... in SPb Python
В общем если у Вас файл не будет слишком большим точно ну скажем до 50Mb не усложняйте. Если больше вдруг то воспользуйтесь все таки библиотекой logging и решайте действительно нужные Вам задачи, не застревая на мелочах.
источник

🚲U

🚲 Oleh Kopyl UI/UX d... in SPb Python
Юрий Шумилов
зачем 2 раза контекстный менеджер на один и тот же файл?
# Предупреждение, читать в память надо относительно не большой кусок файла, так как память не безгранична, но для файла 10Mb сгодится. В момент чтения все содержимое нового файла будет в памяти и мы не можем заранее знать сколько свободной памяти на устройстве в данный момент и это частая ошибка. Для небольших файлов это работает отлично.
with open(file, "rb+") as log_file:
   # будущий размер файла
   file_size = file_size_limit_bytes * 0.25
   # переходим в файле на позицию будущего размера файла считая от конца файла
   log_file.seek(file_size) .seek(file_size * -1, os.SEEK_END)
   # читаем от этой позиции до конца файла
   file_data = log_file.read()
   # переходим в начало файла
   log_file.seek(0)
   # записываем новые данные
   log_file.write(file_data)
   # усекаем файл до размера нового файла
   log_file.truncate(file_size)
2 раза потому что режимы разные ж
источник

ЮШ

Юрий Шумилов... in SPb Python
"rb+" Открывает файл для чтения и записи в двоичном формате. Указатель стоит в начале файла.
Не в режиме дело.
источник

🚲U

🚲 Oleh Kopyl UI/UX d... in SPb Python
Юрий Шумилов
В общем если у Вас файл не будет слишком большим точно ну скажем до 50Mb не усложняйте. Если больше вдруг то воспользуйтесь все таки библиотекой logging и решайте действительно нужные Вам задачи, не застревая на мелочах.
не, на логгинг у меня нет 100 часов на чтение доки
источник