我正在尝试编写一个使用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.')
除非我删除写日志的代码,否则它将导致该错误。但是我真的想在运行调试时记录日志。 有谁知道该怎么解决?