首页 文章

记录远程服务器上的Flask应用程序无法正常工作

提问于
浏览
0

我使用以下设置登录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我得到的只是logger输出(即没有来自模块级日志记录的输出)

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过程

有任何想法吗?

1 回答

  • 1

    如果您的配置在本地计算机上运行而不在远程服务器上运行,那么您的问题是关于文件或日志文件所在目录的权限 .

    这是something可以帮助你 .

    除此之外,这里有一个Gist,它可以为Flask应用程序的日志配置提供另一个视角 .

相关问题