Модуль Python "вход" двойной вывод - PullRequest
0 голосов
/ 02 сентября 2018

Я хочу использовать модуль logging, но у меня возникли некоторые проблемы, потому что он выводит дважды. Я прочитал много постов с людьми, имеющими ту же проблему, и log.propagate = False или `log.handlers.pop () ´ исправили ее для них. Это не работает для меня.

У меня есть файл с именем logger.py , который выглядит следующим образом:

import logging

def __init__():
    log = logging.getLogger("output")
    filelog = logging.FileHandler("output.log")
    formatlog = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
    filelog.setFormatter(formatlog)
    log.addHandler(filelog)
    log.setLevel(logging.INFO)

    return log

Чтобы я из нескольких файлов мог написать:

import logger
log = logger.__init__()

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

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Я нашел решение, которое было действительно простым. Все, что мне нужно было сделать, это добавить оператор if, проверяющий, существуют ли уже обработчики. Итак, мой logger.py файл теперь выглядит так:

import logging

def __init__():
    log = logging.getLogger("output")

    if not log.handlers:
        filelog = logging.FileHandler("output.log")
        formatlog = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
        filelog.setFormatter(formatlog)
        log.addHandler(filelog)
        log.setLevel(logging.INFO)

    return log
0 голосов
/ 02 сентября 2018

несколько сценариев ведут к нескольким процессам. таким образом, вы неудачно создаете несколько объектов, возвращаемых функцией logger.__init__().

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

если вы хотите, чтобы несколько процессов регистрировались в одном и том же месте назначения, я рекомендую использовать межпроцессное взаимодействие в качестве «именованных каналов» или иным образом использовать порт UDP / TCP для ведения журнала.

В Python также есть модули очереди для отправки (элементарной) записи журнала, которая будет записана в одной части (по сравнению с добавлением в файл несколькими процессами - это может привести к значениям от 111111 \ n и 22222 \ n до 11212121221 \ n \ n в файле)

иначе думать о именованных каналах ...

Фрагмент кода для сервера регистрации Примечание: я просто предполагал регистрировать все как ошибку ...

import socket
import logging

class mylogger():
    def __init__(self, port=5005):
    log = logging.getLogger("output")
    filelog = logging.FileHandler("output.log")
    formatlog = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
    filelog.setFormatter(formatlog)
    log.addHandler(filelog)
    log.setLevel(logging.INFO)
    self.log = log
    UDP_IP = "127.0.0.1"  # localhost
    self.port = port
    self.UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
    self.UDPClientSocket.bind((UDP_IP, self.port))
def pollReceive(self):
    data, addr = self.UDPClientSocket.recvfrom(1024)  # buffer size is 1024 bytes
    print("received message:", data)
    self.log.error( data )
pass

log = mylogger()

while True:
    log.pollReceive()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...