为什么python3-asnycio与python3-logging冲突?

时间:2019-05-14 03:49:25

标签: python logging python-asyncio rsyslog

我正在尝试编写一个使用asyncio模块的echo服务器。为了简化管理,我运行了使用守护程序。我尝试记录使用日志记录模块的运行信息,但在从send接收消息时遇到错误(因为登录消息处理器的代码使之出错。)

---- agent.py(服务器端)----

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# agent.py

from listener import Listener
from daemon import runner

listener = Listener()
daemon_runner = runner.DaemonRunner(listener)
daemon_runner.do_action()

---- listener.py(服务器端)----

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# class listener

import sys
import time
import logging
import logging.handlers
import asyncio
# log initial
log = logging.getLogger('mylogger')
log.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler(address='/dev/log', facility='local4')
formatter = logging.Formatter('[controller]%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
log.addHandler(handler)
log.debug('this is debug')
# log.critical('this is critical')

class EchoServer(asyncio.Protocol):
    def connection_made(self, transport):
        log = logging.getLogger('mylogger')
        log.debug('Connection accepted.')  # !!! does not work, couldn't found any log in file related local4 !!!
        peername = transport.get_extra_info('peername')
        self.transport = transport

    def data_received(self, data):
        recv_cmd = data.decode()
        print("Sender said:{}".format(recv_cmd))
        # log.debug("Sender said:{}".format(recv_cmd))
        response = "Hey! Sender said:{}".format(recv_cmd)
        self.transport.write(response.encode())
        self.transport.close()


class Listener(asyncio.Protocol):
    TCP_LISTEN_PORT = 18801
    PID_FILENAME = None
    BUFFER_SIZE = 65535

    def __init__(self):
        # load parameter
        self.TCP_LISTEN_PORT = 18801
        self.PID_FILENAME = '/root/test.pid'
        self.BUFFER_SIZE = 65535
        # for daemon
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path = self.PID_FILENAME
        self.pidfile_timeout = 5

    def run(self):
        loop = asyncio.get_event_loop()
        coro = loop.create_server(EchoServer, '127.0.0.1', self.TCP_LISTEN_PORT)
        server = loop.run_until_complete(coro)
        print('Server agent running on {}'.format(server.sockets[0].getsockname()))

        try:
            loop.run_forever()
        finally:
            server.close()
        loop.close()

---- sender.py(客户端)----

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# sender.py
import asyncio

async def tcp_echo_client(message, loop):
    reader, writer = await asyncio.open_connection('127.0.0.1', 18801, loop=loop)

    print('Send: %r' % message)
    writer.write(message.encode())
    data = await reader.read(100)
    print('Received: %r' % data.decode())
    print('Close the socket')
    writer.close()

message = 'Hello World!'
loop = asyncio.get_event_loop()
loop.run_until_complete(tcp_echo_client(message, loop))
loop.close()

运行服务器使用命令“ python3 agent.py start”,当我使用“ python3 sender.py”时,服务器端显示以下错误:

Exception in callback _SelectorTransport._add_reader(10, <bound method..., bufsize=0>>>)
handle: <Handle _SelectorTransport._add_reader(10, <bound method..., bufsize=0>>>)>
Traceback (most recent call last):
  File "/usr/lib64/python3.6/asyncio/selector_events.py", line 264, in _add_reader
    key = self._selector.get_key(fd)
  File "/usr/lib64/python3.6/selectors.py", line 191, in get_key
    raise KeyError("{!r} is not registered".format(fileobj)) from None
KeyError: '10 is not registered'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib64/python3.6/asyncio/events.py", line 145, in _run
    self._callback(*self._args)
  File "/usr/lib64/python3.6/asyncio/selector_events.py", line 680, in _add_reader
    self._loop._add_reader(fd, callback, *args)
  File "/usr/lib64/python3.6/asyncio/selector_events.py", line 267, in _add_reader
    (handle, None))
  File "/usr/lib64/python3.6/selectors.py", line 412, in register
    self._epoll.register(key.fd, epoll_events)
OSError: [Errno 22] Invalid argument
Traceback (most recent call last):
  File "agent.py", line 10, in <module>
    daemon_runner.do_action()
  File "/usr/lib/python3.6/site-packages/daemon/runner.py", line 283, in do_action
    func(self)
  File "/usr/lib/python3.6/site-packages/daemon/runner.py", line 202, in _start
    self.app.run()
  File "/root/test/t1/listener.py", line 60, in run
    loop.run_forever()
  File "/usr/lib64/python3.6/asyncio/base_events.py", line 427, in run_forever
    self._run_once()
  File "/usr/lib64/python3.6/asyncio/base_events.py", line 1404, in _run_once
    event_list = self._selector.select(timeout)
  File "/usr/lib64/python3.6/selectors.py", line 445, in select
    fd_event_list = self._epoll.poll(timeout, max_ev)
OSError: [Errno 22] Invalid argument

可以在我的日志文件中找到logger最初的调试信息,但是EchoServer的connection_made函数中的日志记录代码出错。

无论我用什么

log = logging.getLogger('mylogger')
log.debug('Connection accepted.')

log.debug('Connection accepted.')

除非我删除写日志的代码,否则它将导致该错误。但是我真的想在运行调试时记录日志。 有谁知道该怎么解决?

0 个答案:

没有答案