我使用以下设置登录gunicorn和nginx下的Flask应用程序中的日志文件:
def setup_logging():
stream_handler = logging.StreamHandler()
formatter = logging.Formatter('[%(asctime)s][PID:%(process)d][%(levelname)s][%(name)s.%(funcName)s()] %(message)s')
stream_handler.setFormatter(formatter)
stream_handler.setLevel("DEBUG")
logging.getLogger().addHandler(stream_handler)
file_handler = RotatingFileHandler("log.txt", maxBytes=100000, backupCount=10)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s '
'[in %(pathname)s:%(lineno)d]'
))
file_handler.setLevel("DEBUG")
logging.getLogger().addHandler(file_handler)
logging.getLogger().setLevel("DEBUG")
然后在创建应用之前初始化日志记录:
setup_logging()
def create_app(config_name):
app = Flask(__name__)
然后在模块中我使用:
进行记录import logging
logger = logging.getLogger(__name__)
x = 2
logger.debug('x: {0}' x)
日志在本地计算机上运行正常 - 包括stdout和log.txt
但是,当我在远程服务器上运行应用程序时,没有任何内容写入log.txt。我已经部署为具有远程系统上log.txt的读写权限的用户。
我尝试使用DEBUG = True初始化远程服务器上的应用程序,仍然没有写入日志文件。我可以查看任何日志的唯一方法是查看/var/log/supervisor/app-stdout---supervisor-nnn.log文件,但这些不显示所有日志记录输出
在服务器日志文件中使用HolgerShurig的答案Flask logging - Cannot get it to write to a file,我只获得了命名记录器输出(即没有来自模块级别记录的输出)
2017-10-21 00:32:45,125 - file - DEBUG - Debug FILE
运行相同的代码我得到的本地机器
2017-10-21 08:35:39,046 - file - DEBUG - Debug FILE
2017-10-21 08:35:42,340 - werkzeug - INFO - * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) ie
2017-10-21 08:38:46,236 [MainThread ] [INFO ] 127.0.0.1 - - [21/Oct/2017 08:38:46] "[37mGET /blah/blah HTTP/1.1[0m" 200 -
然后我将日志配置更改为:
def setup_logging(app):
stream_handler = logging.StreamHandler()
formatter = logging.Formatter('[%(asctime)s][PID:%(process)d][%(levelname)s][%(lineno)s][%(name)s.%(funcName)s()] %(message)s')
stream_handler.setFormatter(formatter)
stream_handler.setLevel(Config.LOG_LEVEL)
app.logger.addHandler(stream_handler)
file_handler = RotatingFileHandler(Config.LOGGING_FILE, maxBytes=Config.LOGGING_MAX_BYTES, backupCount=Config.LOGGING_BACKUP_COUNT)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s '
'[in %(pathname)s:%(lineno)d]'
))
file_handler.setLevel(Config.LOG_LEVEL)
loggers = [app.logger]
for logger in loggers:
logger.addHandler(file_handler)
app.logger.setLevel(Config.LOG_LEVEL)
app.logger.debug('this message should be recorded in the log file')
并在创建Flask应用后立即设置我们:
setup_logging(app)
我正在使用的每个模块
import logging
logger = logging.getLogger(__name__)
#for example
def example():
logger.debug('debug')
logger.info('info')
logger.warn('warn')
当我使用
在服务器上运行应用程序时gunicorn manage:app
log.txt文件中唯一打印的内容是
2017-10-21 02:48:32,982 DEBUG: this message should be recorded in the log file [in /../../__init__.py:82]
但是也显示了本地的MainThread过程
有什么想法吗?