我有一个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课程的日志记录。你能救我吗?
非常感谢您的进步!
答案 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"的模块。并将在此模块中创建的记录器实例导入到需要记录器的任何位置。