web-dev-qa-db-fra.com

Gunicorn - Aucun journal d'accès

actuellement, je lance mon service Web sanic (microframework) avec gunicorn en tant que démon et je voudrais enregistrer tous les journaux dans des fichiers (accès et erreur)

Ma config:

reload = True
daemon = True
bind = '0.0.0.0:6666'
worker_class = 'sanic.worker.GunicornWorker'
loglevel = 'debug'
accesslog = 'access.log'
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
errorlog = 'error.log'

Ensuite, je démarre le webservice:

gunicorn --config config.py app:app

Sooo .. mon journal d'erreurs fonctionne, mais je n'ai absolument aucun journal d'accès ..

Il n'y a aucun indice dans la documentation sur ce problème, quelqu'un pourrait-il m'aider?

Merci et salutations!

4
Creative crypter

pourriez-vous essayer:

gunicorn --config config.py app:app --access-logfile '-'

Et voyez si quelque chose est connecté sur stdout (sortie console)?

9
matt.LLVW

Vous devez transmettre une configuration de journal à l'application Sanic et définir le fichier a au lieu de sys.stdout comme flux pour le gestionnaire de journal d'accès.

app = Sanic('test', log_config=CUSTOM_LOGIN_CONFIG)

Vous pouvez copier la configuration par défaut de log.py dans le dossier sanic

accesslog_file = open('accesslog_file.log','w')


CUSTOM_LOGIN_CONFIG = dict(
    version=1,
    disable_existing_loggers=False,

    loggers={
        "root": {
            "level": "INFO",
            "handlers": ["console"]
        },
        "sanic.error": {
            "level": "INFO",
            "handlers": ["error_console"],
            "propagate": True,
            "qualname": "sanic.error"
        },

        "sanic.access": {
            "level": "INFO",
            "handlers": ["access_console"],
            "propagate": True,
            "qualname": "sanic.access"
        }
    },
    handlers={
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "generic",
            "stream": sys.stdout
        },
        "error_console": {
            "class": "logging.StreamHandler",
            "formatter": "generic",
            "stream": sys.stdout
        },
        "access_console": {
            "class": "logging.StreamHandler",
            "formatter": "access",
            "stream": accesslog_file
        },
    },
    formatters={
        "generic": {
            "format": "%(asctime)s [%(process)d] [%(levelname)s] %(message)s",
            "datefmt": "[%Y-%m-%d %H:%M:%S %z]",
            "class": "logging.Formatter"
        },
        "access": {
            "format": "%(asctime)s - (%(name)s)[%(levelname)s][%(Host)s]: " +
                      "%(request)s %(message)s %(status)d %(byte)d",
            "datefmt": "[%Y-%m-%d %H:%M:%S %z]",
            "class": "logging.Formatter"
        },
    }
)

Cela fonctionnera même si vous exécutez l'application avec gunicorn.

0
Pac

Je pense que vous pourriez simplement partir du cadre sanitaire directement.

vérifier le lien

Comment changer le répertoire du journal sanic par défaut en un répertoire personnalisé?

0
Jibin Mathew

Si vous utilisez logging.config.fileConfig('someFile.conf'), assurez-vous que vous utilisez disable_existing_loggers=False argument, il sera donc:

logging.config.fileConfig('someFile.conf', disable_existing_loggers=False)

Documentation ici: https://docs.python.org/3.7/library/logging.config.html#logging.config.fileConfig

Sinon, les journaux d'accès sont supprimés.

Le fait de laisser les enregistreurs existants actifs peut entraîner l’apparition d’autres journaux, par exemple de requests ou urllib3 bibliothèque. Ne vous inquiétez pas, désactivez simplement à la ligne suivante, si vous n'en avez pas besoin:

logging.getLogger("urllib3").setLevel(logging.WARNING)
0
Nikita Motornyi

utilisez supervisord pour démarrer le service gunicorn avec les paramètres de journalisation.

[program:sanic]
directory=/home/ubuntu/api
command=/home/ubuntu/api/venv/bin/gunicorn api:app --bind 0.0.0.0:8000 --worker-class sanic.worker.GunicornWorker -w 2
stderr_logfile = log/api_stderr.log
stdout_logfile = log/api_stdout.log

Cela fonctionne parfaitement pour moi, je peux donc juste tail -f log/api_stderr.log

0
Christo Goosen