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!
pourriez-vous essayer:
gunicorn --config config.py app:app --access-logfile '-'
Et voyez si quelque chose est connecté sur stdout (sortie console)?
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.
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é?
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)
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