目前我正在使用gunicorn作为守护进程运行我的sanic(微框架)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'
接下来我启动webservice:
gunicorn --config config.py app:app
Sooo ..我的错误日志有效,但我绝对没有访问日志..
文档中没有关于此问题的提示,有人可以帮助我吗?
谢谢和问候!
答案 0 :(得分:1)
gunicorn --config config.py app:app --access-logfile '-'
看看stdout(控制台输出)上是否记录了任何内容?
答案 1 :(得分:0)
答案 2 :(得分:0)
您应该将日志配置传递给Sanic App,并将a文件而不是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运行应用程序,这也会有用。
答案 3 :(得分:0)
使用supervisord以记录参数启动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
答案 4 :(得分:0)
如果您使用的是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)