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

cjb*_*jbs 6 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)
Run Code Online (Sandbox Code Playgroud)

我想使用同一记录器的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')
Run Code Online (Sandbox Code Playgroud)

记录器的输出为:

2016-01-21 16:20:28,137 INFO     Request: Init service
Run Code Online (Sandbox Code Playgroud)

因此,我缺少了SGRuntime类的日志记录。你能帮助我吗?

非常感谢您!

Ali*_*MAR 1

logging.getLogger()返回 logger 的相同实例(针对 logger name )来测试它,您可以进行:

name = "myname"
logger = logging.getLogger(name)
for _ in range(100):
    assert logger is logging.getLogger(name)
Run Code Online (Sandbox Code Playgroud)

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