在书的第14章,部署到Linux服务器一节,我按照书上的步骤部署bluelog程序,但启用gunicorn之后,日志不能写到文件中。
我的register_logging()方法是这样的:
bluelog/init.py:
def register_logging(app):
app.logger.setLevel(logging.INFO)
file_handler = RotatingFileHandler(os.path.join(basedir, 'logs/bluelog.log'),
maxBytes=10 * 1024 * 1024, backupCount=10)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.INFO)
mail_handler = SMTPHandler(
mailhost=app.config['MAIL_SERVER'],
fromaddr=app.config['MAIL_USERNAME'],
toaddrs=['ADMIN_EMAIL'],
subject='Bluelog Application Error',
credentials=(app.config['MAIL_USERNAME'], app.config['MAIL_PASSWORD']))
class RequestFormatter(logging.Formatter):
def format(self, record):
record.url = request.url
record.remote_addr = request.remote_addr
return super(RequestFormatter, self).format(record)
request_formatter = RequestFormatter(
'[%(asctime)s] %(remote_addr)s requested %(url)s\n'
'%(levelname)s in %(module)s: %(message)s'
)
mail_handler.setLevel(logging.ERROR)
mail_handler.setFormatter(request_formatter)
if not app.debug:
app.logger.addHandler(file_handler)
app.logger.addHandler(mail_handler)
gunicorn启动时的命令是这样的:
···
$ gunicorn --workers=4 --bind=0.0.0.0:8000 wsgi:app
[2019-07-04 09:41:38 +0800] [14741] [INFO] Starting gunicorn 19.9.0
[2019-07-04 09:41:38 +0800] [14741] [INFO] Listening at: http://0.0.0.0:8000 (14741)
[2019-07-04 09:41:38 +0800] [14741] [INFO] Using worker: sync
[2019-07-04 09:41:38 +0800] [14744] [INFO] Booting worker with pid: 14744
[2019-07-04 09:41:38 +0800] [14745] [INFO] Booting worker with pid: 14745
[2019-07-04 09:41:38 +0800] [14747] [INFO] Booting worker with pid: 14747
[2019-07-04 09:41:38 +0800] [14749] [INFO] Booting worker with pid: 14749
···
日志直接打印到了终端上。
我在网上找了些文章,上面提到了一个问题,就是gunicorn有自己的日志,所以没有写到Flask的日志里面,然后我又在register_logging()方法上增加了一些内容,来修复这个问题,但问题依然没有解决,下面是增加的内容:
def register_logging(app):
gunicorn_logger = logging.getLogger('gunicorn.error')
app.logger.handlers = gunicorn_logger.handlers
app.logger.setLevel(gunicorn_logger.level)
...
抑或是这种情况:
def register_logging(app):
gunicorn_logger = logging.getLogger('gunicorn.error')
app.logger.handlers.extend(gunicorn_logger.handlers)
app.logger.setLevel(logging.INFO)
...
还是不能把日志写入到文件中,或者只写入了少量的gunicorn日志,跟开发阶段输出的日志完全不一样。
日志问题困扰了我很长时间。部署到生产环境没有日志的话非常不方便,不知道各位是否遇到了这样的问题,如果有的话还请帮忙指点一下。