我正在尝试对我们的应用程序(烧瓶)进行多处理日志记录。我们使用python2.7,我使用队列的概念来保留来自队列中所有分叉的日志请求和日志记录。我遵循了这个approach。唯一的变化是我使用的是TimedRotatatingFileHandler而不是RotatingFileHandler。这是我的dictconfig
我在初始化fork之前以以下方式初始化记录器
from flask import Flask
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
path = 'share/log_test/logging.yaml'
if os.path.exists(path):
with open(path, 'rt') as f:
config = yaml.load(f.read())
logging.config.dictConfig(config)
logger = logging.getLogger('debuglog') # problem starts if i keep this statement
app = Flask(__name__)
init_routes(app) # initialize our routes
server_conf = config_manager.load_config(key='server')
logger.info("Logging is set up.") # only this line gets logged and other log statement to be logged by forks in code with same logger are not writing to the file.
http_server = HTTPServer(WSGIContainer(app))
http_server.bind(server_conf.get("PORT")) # port to listen
http_server.start(server_conf.get("FORKS")) # number of forks
IOLoop.current().start()
我面临的问题是,如果我在初始化fork之前在代码中使用getLogger,则fork不会将日志写入日志文件,而仅记录初始化fork之前的log语句。如果删除logging.getLogger('debuglog')
,则分叉正确记录。
我暂停了执行流程,并验证了是否将处理程序分配给了记录器,但这似乎还可以
为什么会观察到这种奇怪的行为?
更新:当我使用另一个具有相同文件的记录器来编写并且一切正常时。但是,当我使用相同的记录器时,它不起作用。与RLock有关吗?
答案 0 :(得分:0)
我终于找到了解决方案。我在实现中删除了队列的概念,仅在接收到日志记录后立即打印,然后在那里打印。
def emit(self, record):
try:
s = self._format_record(record)
self._handler.emit(record) #emitting here itself
# self.send(s) #stopped sending it to queue
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
在以下测试中似乎可以正常工作
8 workers - 200 requests - 50 concurrency