мой первый пользовательский обработчик не работает - PullRequest
0 голосов
/ 18 октября 2019

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

Я вижу на принимающей стороне, что соединение установлено, а затем закрывается, однако сообщения не принимаются, и я вижубез ошибок.

вот код, который я запускаю

import socket
import time
import logging


hostname = '127.0.0.1'
port = '1234'
message = 'hello world!\n'

class Nc_handler(logging.Handler):
    def __init__(self, hostname, port):
        logging.Handler.__init__(self)
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect((hostname, int(port)))

    def emit(self, content):
        log_entry = self.format(content)
        print("Checking if emit is run")
        self.socket.send(log_entry.encode())




logger = logging.getLogger(__name__)

# set format
nc_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')

# create nc handler
nc_handler = Nc_handler(hostname, port)

# set handler's level
nc_handler.setLevel(logging.INFO)

# set handler's format
nc_handler.setFormatter(nc_format)

logger.addHandler(nc_handler)
logger.info(message)

Если я использую nc_handler.emit('Hello'), выдает ошибку:

  File "handler.py", line 35, in <module>
    nc_handler.emit(message)
  File "handler.py", line 17, in emit
    log_entry = self.format(content)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 869, in format
    return fmt.format(record)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 608, in format
    record.message = record.getMessage()
AttributeError: 'str' object has no attribute 'getMessage'

Так что я подозреваю, что я нене правильно использую Formatter, но я не могу понять, что именно я делаю неправильно.

Буду очень признателен за любую помощь или совет.

1 Ответ

1 голос
/ 18 октября 2019

Метод emit имеет неправильную подпись: его аргумент должен быть объектом LogRecord. Не строка

Это связано с тем, что для метода format требуется объект LogRecord.

Это является причиной исключения AttributeError .

Iсм. также путаницу, которую я не понимаю: почему использование message в качестве аргумента для logging.info ?

message является атрибутомОбъект LogRecord тоже взят из того, что вы явно вошли в систему.

Используйте жестко запрограммированную строку:

logging.info("Hello")

Или используйте другую переменную:

myvar = "Hello"
logging.info(myvar)

Делаетэто поможет?

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