2017-09-28 6 views
2

Mon application tornade utilise des modules hérités écrits il y a de nombreuses années. Ces modules sont configurés pour se déconnecter des choses avec l'enregistreur racine. Le problème auquel je suis confronté est que chaque fois que j'importe ces modules, les journaux imprimés par la tornade (c'est-à-dire tornado.access, tornado.application, etc.) sont supprimés.Les journaux python sont supprimés

Voici comment j'invoque mon serveur

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

"""Basic run script""" 

from zmq.eventloop import ioloop 
ioloop.install() 

import tornado.httpserver 
import tornado.ioloop 
import tornado.options 
import tornado.web 
import tornado.autoreload 
from tornado.options import options 
import tornado.web 

from grace_server.application import MyApplication 
from settings import settings 

def main(): 
    app = MyApplication(settings) 
    app.listen(options.port) 
    tornado.ioloop.IOLoop.current().start() 

if __name__ == "__main__": 
    main() 

Voici la définition du tornado.Application

import collections, zmq, os 
import logging, re 
import pickle, json 
from datetime import datetime 
from functools import partial 

from zmq.eventloop.zmqstream import ZMQStream 
from zmq.eventloop import ioloop 

from tornado import web 
from tornado.log import LogFormatter, app_log, access_log, gen_log 
from jupyter_client import MultiKernelManager 

from legacy_module import api 
from legacy_module.util.utils import get_env 

from urls import url_patterns 


ioloop = ioloop.IOLoop.current() 

class MyApplication(web.Application): 

    def __init__(self, settings): 
     self.init_logging() 
     self.connections = collections.defaultdict(list) 
     self.kernels = {} 
     self.listen_logs() 
     web.Application.__init__(self, url_patterns, **settings) 


    def init_logging(self): 
     self.logger = logging.getLogger('MyApplication') 
     self.logger.setLevel(logging.DEBUG) 


    def broadcast_message(self, message): 
     connections = self.connections.keys() 
     for conn in connections: 
      conn.write_message(message) 

    def multicat_message(self, filter_, message): 
     connections = self.connections.keys() 
     connections = filter(connections) 
     for conn in connections: 
      conn.write_message(message) 

    ... 
    ... 
    ... 

Voici comment logging est configuré dans mon legacy_module

import os, json 
import logging, logging.config 
from contextlib import contextmanager 

from kombu import Connection 
from terminaltables import AsciiTable 

from legacy_module import resources 
from legacy_module.resources.gredis import redis_tools 
from legacy_module.core import versioning 
from legacy_module.util.utils import get_logger_container, get_env 

from legacy_module.resources.databases.mongo import MongoDatabaseCollection 

DB_COLLECTION_OBJECT = MongoDatabaseCollection() 

LOGGING_FILE = os.path.join(os.environ['legacy_module_HOME'], 'config', 'logging.config') 
logging.config.fileConfig(LOGGING_FILE) 
LOGGER = logging.getLogger() 

... 
... 
... 

C'est comment logging.config regarde.

[loggers] 
keys = root 

[handlers] 
keys = consoleHandler 

[formatters] 
keys = simpleFormatter 

[logger_root] 
level = DEBUG 
handlers = consoleHandler 

[handler_consoleHandler] 
class = StreamHandler 
level = DEBUG 
formatter = simpleFormatter 
args = (sys.stdout,) 

[formatter_simpleFormatter] 
format = %(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt = 

Voici comment les journaux normale ressemble

2017-09-28 02:40:03,409 MyApplication DEBUG init_logging done 
2017-09-28 02:40:13,018 MyApplication DEBUG Authenticating 

Mais quand je commente à l'importation pour legacy_module de MyApplication, je peux voir tornado.access journaux

2017-09-28 02:40:03,409 MyApplication DEBUG init_logging done 
2017-09-28 02:40:13,017 tornado.access INFO  304 GET/(172.20.20.3) 1.79ms 
2017-09-28 02:40:14,264 tornado.access INFO  304 GET /api/login (172.20.20.3) 0.75ms 
2017-09-28 02:40:13,018 MyApplication DEBUG Authenticating 

donc les logging configurations de mon legacy_module est une certaine façon de supprimer les journaux par le tornado. Comment puis-je résoudre ce problème, j'ai besoin de ces journaux.

Répondre

0

D'abord, dans yourlegacymodule, supprimez l'appel logging.config.fileConfig(LOGGING_FILE) et remplacez LOGGER = logging.getLogger() par LOGGER = logging.getLogger(__name__). Ensuite, vous voudrez peut-être vous assurer que vous avez au moins l'enregistreur racine correctement configuré (ne sais pas ce que vous obtenez en tornade pour la configuration de la journalisation, vérifiez les docs). De manière plus générale: cette configuration de journalisation dans un module de bibliothèque est l'exemple parfait de l'antipattern de consignation - le point entier du package logging consiste à découpler l'utilisation du logger (du code de la bibliothèque) de la configuration de consignation qui doit être laissée à l'application en utilisant le code de la bibliothèque et doit être configurable par application instance. FWIW notez que votre propre MyApplication.init_logging() est également un antipattern - vous ne devriez pas coder en dur le niveau du logger dans votre code, cela devrait être fait en utilisant une configuration par instance (cf comment django utilise le module settings pour configurer la journalisation).

Mise à jour:

Je dois creuser dans le code de tornade pour vous donner une réponse détaillée exacte, mais il est évident dans l'appel logging.config.fileConfig() yourlegacymodule propre configuration prévaut sur tornade.

mes configs effectuées dans init_logging sont-elles remplacées par l'enregistreur racine?

La seule chose que vous actuellement « configurer » (et que vous ne devriez pas) dans init_logging est le niveau de l'enregistreur « MyApplication », cela n'a pas d'impact sur lequel Loggin gestionnaire est utilisé (=> où sont envoyés vos journaux) etc.

comment puis-je les empêcher?

Ce fut la première partie de ma réponse ...

+0

Merci pour la réponse @bruno, je garderai que l'anti-modèle dans mon esprit maintenant, mais pouvez-vous me expliquer pourquoi je peux ne vois pas les logs, mes configs faites dans 'init_logging' sont-elles remplacées par le root logger si oui, comment puis-je les empêcher? ou les journaux sont diffusés ailleurs? –

+0

cf ma réponse éditée. –