現在、デーモンとしてgunicornを使用してsanic(microframework)Webサービスを実行しており、すべてのログをファイルに保存したい(アクセスとエラー)
私の設定:
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'
次に、Webサービスを開始します。
gunicorn --config config.py app:app
Sooo ..私のエラーログは機能しますが、アクセスログはまったく取得されません。
この問題に関するドキュメントにはヒントがありません。誰か助けていただけますか?
よろしくお願いいたします。
あなたは試すことができます:
gunicorn --config config.py app:app --access-logfile '-'
そして、何かがstdout(コンソール出力)にログオンしているかどうかを確認しますか?
ログ構成をSanicアプリに渡し、sys.stdoutの代わりにファイルをアクセスログハンドラーのストリームとして設定する必要があります。
app = Sanic('test', log_config=CUSTOM_LOGIN_CONFIG)
Sanicフォルダーのlog.pyからデフォルトの構成をコピーできます
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"
},
}
)
これはアプリをgunicornで実行しても機能します。
logging.config.fileConfig('someFile.conf')
を使用している場合は、disable_existing_loggers=False
引数を使用していることを確認してください。
logging.config.fileConfig('someFile.conf', disable_existing_loggers=False)
ここにドキュメント: https://docs.python.org/3.7/library/logging.config.html#logging.config.fileConfig
それ以外の場合、アクセスログは抑制されます。
既存のロガーを存続させると、たとえばrequests
またはurllib3
ライブラリからの他のログが表示される可能性があります。心配しないでください。必要がなければ、次の行で無効にしてください。
logging.getLogger("urllib3").setLevel(logging.WARNING)
スーパーバイザを使用して、ログパラメータでgunicornサービスを開始します。
[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
これは私にとっては完璧に機能するので、-f log/api_stderr.logをテールするだけです