如何在Flask应用程序和其他类之间共享记录器实例

时间:2016-01-21 15:50:35

标签: python logging flask

我有一个python应用程序,其中主类是Flask应用程序,当我收到HTTP请求时,我从其他类启动方法。我想分享记录器,显然它应该很容易,但我无法使它工作。

这是我的主要类的代码:

#!flask/bin/python
from flask import Flask, jsonify, abort, make_response, request
from SGRuntime import SGRuntime
import logging
from logging.handlers import TimedRotatingFileHandler

app = Flask(__name__)
sgRuntime = SGRuntime()

@app.route('/sg/api/v2.0/init', methods=['GET'])
def init_service():
    app.logger.info('Request: Init service')
    return sgRuntime.start()


@app.route('/sg/api/v2.0/stop', methods=['GET'])
def stop_service():
    app.logger.info('Request: Stop service')
    return sgRuntime.stop()


@app.route('/sg/api/v2.0/restart', methods=['GET'])
def restart_service():
    app.logger.info('Request: Restart service')
    return sgRuntime.restart()


@app.route('/sg/api/v2.0/alive', methods=['GET'])
def alive():
    if sgRuntime.running == True:
        return sgRuntime.get_stat()
    else:
        return "Service not running"

@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)


if __name__ == '__main__':
    handler = TimedRotatingFileHandler('./SGLog.log', when='midnight', interval=1)
    handler.setLevel(logging.DEBUG)
    fileFormatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s')
    handler.setFormatter(fileFormatter)
    app.logger.addHandler(handler)
    app.run(debug=True)

我的SGRuntime.py的代码,我想使用相同的记录器:

import serial
import logging

class SGRuntime():

CONFIG_FILE_PATH = "config.cfg"
running = False
configuration = {
    'port' : 'COM5',
    'baudrate' : '9600',
    'debug' : '0',
    'serverip' : '127.0.0.1',
    'serverport' : 8080
}    
protocol = None
startedSince = None

def __init__(self):
    self.running = False

def start(self):
    if self.running:

        return 'ERROR: ALREADY RUNNING'

    self.logger = logging.getLogger()
    self.logger.info('SGRuntime started')

记录器的输出为:

2016-01-21 16:20:28,137 INFO     Request: Init service

所以我错过了SGRuntime课程的日志记录。你能救我吗?

非常感谢您的进步!

2 个答案:

答案 0 :(得分:2)

logging.getlogger创建一个记录器。所以在SGRuntime中你创建了第二个记录器。您希望从包中导入app.logger实例并将其用于记录。

更简单的方法是按the logging how to: Logging from multiple modules中的描述配置标准记录器。您只需要调用logging.info('Your message'),它将在日志记录级别为INFO或DEBUG时记录。

答案 1 :(得分:1)

logging.getLogger()返回相同的logger实例(针对记录器名称)以测试它你可以做的:

name = "myname"
logger = logging.getLogger(name)
for _ in range(100):
    assert logger is logging.getLogger(name)

所以要有一个记录器的相同实例。创建一个名为" mylogger"的模块。并将在此模块中创建的记录器实例导入到需要记录器的任何位置。