I'm using containerized gunicorn process which I run by:
CMD gunicorn app:app -w 1 -b 0:44332 -t 300 --log-level debug --threads 5 --access-logfile - --error-logfile -
However I did manage to find an easy way in the docs how to make it print access log to stdout.
--access-logfile - doesn't work as it documented on http://docs.gunicorn.org/en/stable/settings.html#accesslog
Config for gunicorn==19.6.0
[2016-11-22 20:45:57 +0000] [7] [DEBUG] Current configuration:
secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
proxy_protocol: False
worker_connections: 1000
statsd_host: None
max_requests_jitter: 0
post_fork: <function post_fork at 0x7ff56a1a45f0>
pythonpath: None
enable_stdio_inheritance: False
worker_class: sync
ssl_version: 3
suppress_ragged_eofs: True
syslog: False
syslog_facility: user
when_ready: <function when_ready at 0x7ff56a1a4320>
pre_fork: <function pre_fork at 0x7ff56a1a4488>
cert_reqs: 0
preload_app: False
keepalive: 2
accesslog: -
group: 0
graceful_timeout: 30
do_handshake_on_connect: False
spew: False
workers: 1
proc_name: None
sendfile: None
pidfile: None
umask: 0
on_reload: <function on_reload at 0x7ff56a1a41b8>
pre_exec: <function pre_exec at 0x7ff56a1a4b90>
worker_tmp_dir: None
post_worker_init: <function post_worker_init at 0x7ff56a1a4758>
limit_request_fields: 100
on_exit: <function on_exit at 0x7ff56a1e62a8>
config: None
logconfig: None
check_config: False
statsd_prefix:
proxy_allow_ips: ['127.0.0.1']
pre_request: <function pre_request at 0x7ff56a1a4cf8>
post_request: <function post_request at 0x7ff56a1a4de8>
user: 0
forwarded_allow_ips: ['127.0.0.1']
worker_int: <function worker_int at 0x7ff56a1a48c0>
threads: 5
max_requests: 0
limit_request_line: 4094
access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
certfile: None
worker_exit: <function worker_exit at 0x7ff56a1a4f50>
chdir: /app
paste: None
default_proc_name: app:app
errorlog: -
loglevel: debug
capture_output: False
syslog_addr: udp://localhost:514
syslog_prefix: None
daemon: False
ciphers: TLSv1
on_starting: <function on_starting at 0x7ff56a1a4050>
worker_abort: <function worker_abort at 0x7ff56a1a4a28>
bind: ['0:44332']
raw_env: []
reload: False
limit_request_field_size: 8190
nworkers_changed: <function nworkers_changed at 0x7ff56a1e6140>
timeout: 300
ca_certs: None
django_settings: None
tmp_upload_dir: None
keyfile: None
backlog: 2048
logger_class: gunicorn.glogging.Logger
I'm using Gunicorn with Amazon ECS and --access-logfile - works exactly as documented; it prints the accesslog to stderr.
closing issue as "work as documented". Feel free to open a new one if you want to discuss a possible change of the current behaviour.
Hi! I hope this is the proper place to ask about it; I'm using gunicorn (v19.7.1) and failing at finding logs in stdoutput. The command, as I understand the documentation is:
gunicorn -b 0.0.0.0:6007 --access-logfile - --error-logfile - --log-level debug 'wsgi:load_application()'
Then, when I make any http request to the application I cannot see any log in the gunicorn terminal (although the application is responding properly to the request).
I've also tried with export PYTHONUNBUFFERED with same result.
Am I using gunicorn wrong? Could anyone provide a hint? Thanks in advance!!
@yamila-moreno I just tried the command you pasted with examples/test.py and I was able to see access logs in the terminal:
$ gunicorn -b 0.0.0.0:6007 --access-logfile - --error-logfile - --log-level debug test:app
[2018-03-22 17:42:29 +0300] [24642] [DEBUG] Current configuration:
[...snipped...]
[2018-03-22 17:42:29 +0300] [24642] [INFO] Starting gunicorn 19.7.1
[2018-03-22 17:42:29 +0300] [24642] [DEBUG] Arbiter booted
[2018-03-22 17:42:29 +0300] [24642] [INFO] Listening at: http://0.0.0.0:6007 (24642)
[2018-03-22 17:42:29 +0300] [24642] [INFO] Using worker: sync
[2018-03-22 17:42:29 +0300] [24645] [INFO] Booting worker with pid: 24645
[2018-03-22 17:42:29 +0300] [24642] [DEBUG] 1 workers
[2018-03-22 17:42:32 +0300] [24645] [DEBUG] GET /
127.0.0.1 - - [22/Mar/2018:17:42:32 +0300] "GET / HTTP/1.1" 200 14 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
[2018-03-22 17:42:33 +0300] [24645] [DEBUG] GET /favicon.ico
127.0.0.1 - - [22/Mar/2018:17:42:33 +0300] "GET /favicon.ico HTTP/1.1" 200 14 "http://0.0.0.0:6007/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
[2018-03-22 17:42:39 +0300] [24645] [DEBUG] GET /
127.0.0.1 - - [22/Mar/2018:17:42:39 +0300] "GET / HTTP/1.1" 200 14 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
[2018-03-22 17:42:40 +0300] [24645] [DEBUG] GET /favicon.ico
127.0.0.1 - - [22/Mar/2018:17:42:40 +0300] "GET /favicon.ico HTTP/1.1" 200 14 "http://0.0.0.0:6007/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
@berkerpeksag thanks for your answer. I was hoping I just misunderstood the documentation. At least I can stop looking there, and find the error in another place. When (if) I finally find the solution, I'll paste here, so it may be useful for someone.
@berkerpeksag sorry for bothering with this, but could you paste also the first part of your gunicorn command? the part "...snipped..."; I'd like to check if there is anything different that I could use as a hint.
thanks!!
Here it is:
keepalive: 2
pidfile: None
config: None
keyfile: None
enable_stdio_inheritance: False
threads: 1
preload_app: False
initgroups: False
worker_abort: <function WorkerAbort.worker_abort at 0x7fd287b241e0>
post_request: <function PostRequest.post_request at 0x7fd287b24620>
nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x7fd287b24ae8>
cert_reqs: 0
statsd_prefix:
ssl_version: 2
suppress_ragged_eofs: True
ciphers: TLSv1
worker_connections: 1000
max_requests: 0
on_exit: <function OnExit.on_exit at 0x7fd287b24c80>
timeout: 30
chdir: /home/berker/projects/gunicorn/examples
raw_env: []
group: 1000
forwarded_allow_ips: ['127.0.0.1']
accesslog: -
capture_output: False
pre_exec: <function PreExec.pre_exec at 0x7fd287b24378>
worker_tmp_dir: None
post_fork: <function Postfork.post_fork at 0x7fd287b1cc80>
secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-SSL': 'on', 'X-FORWARDED-PROTO': 'https'}
default_proc_name: test:app
worker_int: <function WorkerInt.worker_int at 0x7fd287b24048>
errorlog: -
loglevel: debug
syslog_prefix: None
syslog_facility: user
on_starting: <function OnStarting.on_starting at 0x7fd287b1c620>
worker_exit: <function WorkerExit.worker_exit at 0x7fd287b24950>
paste: None
backlog: 2048
sendfile: None
user: 1000
workers: 1
syslog_addr: udp://localhost:514
limit_request_fields: 100
statsd_host: None
proc_name: None
check_config: False
when_ready: <function WhenReady.when_ready at 0x7fd287b1c950>
child_exit: <function ChildExit.child_exit at 0x7fd287b247b8>
proxy_protocol: False
limit_request_field_size: 8190
raw_paste_global_conf: []
reload: False
spew: False
ca_certs: None
proxy_allow_ips: ['127.0.0.1']
limit_request_line: 4094
reload_engine: auto
daemon: False
umask: 0
tmp_upload_dir: None
logger_class: gunicorn.glogging.Logger
pre_fork: <function Prefork.pre_fork at 0x7fd287b1cae8>
post_worker_init: <function PostWorkerInit.post_worker_init at 0x7fd287b1ce18>
worker_class: sync
pre_request: <function PreRequest.pre_request at 0x7fd287b24510>
logconfig: None
do_handshake_on_connect: False
max_requests_jitter: 0
certfile: None
graceful_timeout: 30
bind: ['0.0.0.0:6007']
on_reload: <function OnReload.on_reload at 0x7fd287b1c7b8>
access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
pythonpath: None
syslog: False
Hi there!! @berkerpeksag thanks for your help. I realised that the problem was the configuration with the logging package.
Then I found this post which helped me to configure this properly.
@berkerpeksag @benoitc Hey guys, is there a way to disable the current configuration from being printed out when on DEBUG log level? (similar to the snipped section above).
FYI, if you use logging.config.fileConfig() or logging.config.dictConfig(), then you should set disable_existing_loggers to False. If it's True, it will disable gunicorn logger. For detail please see Logging HOWTO — Python 3.8.1rc1 documentation.
@dave4jr nope, why?
I'm using Gunicorn with Amazon ECS and
--access-logfile -works exactly as documented; it prints the accesslog to stderr.
@romabysen interesting. Do you still have the command?
I'm using the container with my gunicorn in ecs, and I have a startup.sh in docker file with this command to start the server, but it's not delivering the log to stdout.
This is my dockerfile:

This is the server :

@msoedov did you find the solution to print the log in stdout using the containerized gunicorn?
Most helpful comment
FYI, if you use
logging.config.fileConfig()orlogging.config.dictConfig(), then you should setdisable_existing_loggerstoFalse. If it'sTrue, it will disable gunicorn logger. For detail please see Logging HOWTO — Python 3.8.1rc1 documentation.