
Vitali K.
05.04.2017
12:12:44
В воркерах у тебя свой логер, который пишет в worker.log, например

Eugene
05.04.2017
12:13:52
Ну да, между процессами логгер не пошарится. Хотя если смотреть multiprocessing, там шарится.

Vitali K.
05.04.2017
12:14:32
я уверен в multiprocessing тоже просто так ничего не шарится

Google

Vitali K.
05.04.2017
12:14:54
почему бы тебе просто не писать в stderr, зачем тебе логгер?

Eugene
05.04.2017
12:16:02
потому что вся эта байда запускается через сервисы systemd, нет там вывода, а как перенаправить вывод из systemd сервиса я не знаю.
Для планировщика rqscheduler -i 60

Vitali K.
05.04.2017
12:19:08
def main():
logging.basicConfig(stream=sys.stderr, level=logging.INFO,
format='%(asctime)s %(levelname)s %(funcName)s %(message)s')
queue_name = 'queue_name'
logger.info('Starting mail worker for queue=%s', queue_name)
logger.info('Connecting to redis=%s', REDIS_HOST)
with Connection(get_redis()):
worker = Worker(Queue(name=queue_name))
client = Client(RAVEN_CONFIG['dsn'], transport=HTTPTransport)
register_sentry(client, worker)
worker.work()
можно кастомизировать

Eugene
05.04.2017
12:20:55
я уверен в multiprocessing тоже просто так ничего не шарится
Шарится, попробуй написать простой пример:
import multiprocessing as mp
import logging
logger = logging.getLogger('app')
def worker():
logger.info('hello')
def main():
p = mp.Process(target=worker)
p.start()
p.join()
if __name__ == '__main__':
main()


Дмитрий Нан
05.04.2017
12:21:41
С логами я уже не могу, надоело бороться. Как правильно с логами работать в RQ?
Например, настраиваю логгер в main, откуда запускаю scheduler.
logger = logging.getLogger('myapp')
# настраиваю логгеру level, вывод в файл и т.п.
...
# создаю rq scheduler и отдаю ему задачу
scheduler.schedule(tasks.foobar, ...)
Дальше в модуле tasks:
logger = getLogger('myapp')
def foobar():
logger.debug('hello')
И тишина...
Начинает работать только если я создам отдельный логгер в модуле tasks, настрою его там и буду писать в файл в режиме добавления (так как если выставить режим w, то при каждом новом форке файл будет затёрт)
Вот как так, почему логгер, созданный в main не работает в tasks?
Вообще с логгированием везде мучение. Стабильно работает только логгер requests, который пишет в лог файл uwsgi сервера.
Чувак, тут походу дело вообще не в rq.
Трать больше времени на чтение и впринципе на питон, а не протсо на его пакет.
Тактика "наскоком" не работает как правило


Vitali K.
05.04.2017
12:21:54

Eugene
05.04.2017
12:22:22

Дмитрий Нан
05.04.2017
12:22:42
странно тогда слышать про непонятки с логером

Google

Дмитрий Нан
05.04.2017
12:22:51
логер не шарится
просто у логера в ином процессе такие же настройки
что создает ощущение шаринга

Eugene
05.04.2017
12:23:45

Дмитрий Нан
05.04.2017
12:24:31
для чистого шаринга нужны такие объекты , как mp.Array, mp.Value т.п

Eugene
05.04.2017
12:24:34

Дмитрий Нан
05.04.2017
12:24:40
я имею ввиду , что во втором процессе - копия

Eugene
05.04.2017
12:24:47
Я знаю

Sergey
05.04.2017
12:25:14

Eugene
05.04.2017
12:25:31
В случае с rq, где вообще отдельный процесс, я понял, что о логгере уже ничего не известно

Дмитрий Нан
05.04.2017
12:25:53
да как неизвестно, все ок там)

Eugene
05.04.2017
12:26:04

Дмитрий Нан
05.04.2017
12:26:28
вообще надо твой код смотреть
а не сообщения читать)

Vitali K.
05.04.2017
12:27:19
В Rq это не просто отдельный процесс, а N процессов

Eugene
05.04.2017
12:27:47

Vitali K.
05.04.2017
12:28:14
rq worker запускает процесс, который ждет тасок. как только появляется таска, то форкается потомок для выполнения

Google

Дмитрий Нан
05.04.2017
12:30:30
С логами я уже не могу, надоело бороться. Как правильно с логами работать в RQ?
Например, настраиваю логгер в main, откуда запускаю scheduler.
logger = logging.getLogger('myapp')
# настраиваю логгеру level, вывод в файл и т.п.
...
# создаю rq scheduler и отдаю ему задачу
scheduler.schedule(tasks.foobar, ...)
Дальше в модуле tasks:
logger = getLogger('myapp')
def foobar():
logger.debug('hello')
И тишина...
Начинает работать только если я создам отдельный логгер в модуле tasks, настрою его там и буду писать в файл в режиме добавления (так как если выставить режим w, то при каждом новом форке файл будет затёрт)
Вот как так, почему логгер, созданный в main не работает в tasks?
Вообще с логгированием везде мучение. Стабильно работает только логгер requests, который пишет в лог файл uwsgi сервера.
такое ощущение что ты просто не делаешь инициализацию настроек, например logging.config.dictconfig()


Eugene
05.04.2017
12:30:58
Да, я, похоже, реально не понимаю как работают логгеры во всём этом окружении.
Допустим, почему логгер из пакета requests выводит свои сообщения в лог uwsgi сервера, а логгер из Flask нет?

Дмитрий Нан
05.04.2017
12:31:11
ясен перец у тебя в одном процессе , где она есть лог будет делать вывод, в другом, в котором нету инициализации - не будет
так надо везде делать
ты делай вызовы requests в какой то свой модуль и не сделай инициализацию - вывода не будет
вообще кури систему логировнаия
ноги оттуда растут
ну или выкладывай весь код

Eugene
05.04.2017
12:33:37
Ага, а то сейчас получается, что есть несколько пакетов, в кажом есть логгирование, а все вместе они работают по-разному. В идеале, для меня, было бы если бы все логи стекались в одно место.

Дмитрий Нан
05.04.2017
12:33:50
чтоб не заниматься догадками

Vitali K.
05.04.2017
12:34:46
Кто-то говорил что неплохо было бы если бы сделали доклад по логированию)

Eugene
05.04.2017
12:35:34
Вот да! Я бы послушал :) Всегда полезно учиться

Дмитрий Нан
05.04.2017
12:35:38
человек хочет , чтоб все по шелчку взлетело, нежели за 9 лет опыта нельзя осознать обратное

Eugene
05.04.2017
12:36:11

Дмитрий Нан
05.04.2017
12:36:14
что желание захерачить по быстрому ведет к одному - боли и страданию)
ну тогда только выкладывание кода
либо самому исследовать вопрос

Eugene
05.04.2017
12:37:55
Вот ты тоже опытный, ты можешь объяснить понятным языком, почему по умочланию, логи из requests идут в лог, который задан в настройках uwsgi, а логи из flask нет?

Google

Дмитрий Нан
05.04.2017
12:38:20
по коду скажу

Eugene
05.04.2017
12:38:24
Это если вообще ничего не трогать и не настраивать явно.

Дмитрий Нан
05.04.2017
12:39:20
и по настрйокам
и еще за денежку))))
шучу

Vitali K.
05.04.2017
12:40:14
Flask вряд ли пишет в это же логер

Eugene
05.04.2017
12:41:02
Значит requests делает внутри себя "какую-то магию", в смысле сам определяет, куда писать?

Vitali K.
05.04.2017
12:41:12
Ну да

Дмитрий Нан
05.04.2017
12:41:42
нет никакой блин магии, хорош вам

Admin
ERROR: S client not available

Дмитрий Нан
05.04.2017
12:41:54
человек хочет конкретику, при этом не пишет сам конкретику
почитай как на stackovrflow посты оформляют блин

Vitali K.
05.04.2017
12:42:09
Ну оно магия когда не знаешь что под капотом

Eugene
05.04.2017
12:42:15
магия - это то, что скрыто :)

Дмитрий Нан
05.04.2017
12:42:28
ок

Vitali K.
05.04.2017
12:42:36
Можно открыть исходники requests и посмотреть что там

Eugene
05.04.2017
12:43:31
Явное лучше неявного, кто там говорил? :)

Vitali K.
05.04.2017
12:43:34
По моему у логеров есть ещё иерархии и признак propagate, который говорит отправлять ли сообщение выше

Eugene
05.04.2017
12:44:07
Ага, propagate отправляет сообщение по всей иерархии логгеров

Google

Eugene
05.04.2017
12:45:19
Иерархии работают в рамках одного пакета же, ну там, например mod1.mod2.mod3, а когда у нас несколько пакетов - это уже отдельные логгеры, по сути ансамбли логгеров и у каждого свои настройки.
Короче, я всё же разберусь с этой петрушкой и напишу, что получилось :)
В смысле, что именно происходит у меня в приложении.

Дмитрий Нан
05.04.2017
12:49:06
странные 9 лет опыта питона конечно
у меня ест друг , он знает 21 язык программирования

Eugene
05.04.2017
12:50:07

Vitali K.
05.04.2017
12:50:28

Дмитрий Нан
05.04.2017
12:50:29
логирование вообще одна из базовых вещей не только в питоне
не такой он и сложный

Dmitry
05.04.2017
12:50:50

Vitali K.
05.04.2017
12:51:01
?

Дмитрий Нан
05.04.2017
12:51:02
в его системе счисления видимо да)))

Dmitry
05.04.2017
12:51:08
лол)

Дмитрий Нан
05.04.2017
12:51:34
причем лет ему 25
с 4х лет по году на язык
норм
я просто завидую....

Eugene
05.04.2017
12:52:04

Дмитрий Нан
05.04.2017
12:52:15

Sergey
05.04.2017
12:52:15

Eugene
05.04.2017
12:52:33
брррр
Мерзкая хрень как и programm_options, но оно работает :)

Дмитрий Нан
05.04.2017
12:52:35
запахло плюсами, удаляюсь...