title: How to see details of Django errors with Gunicorn?
body: <p>I just deployed my Django (1.6) project with gunicorn and Nginx.</p>
  
  <p>It seems to be working fine but I have one page were I'm getting an HTTP 500 error and I can't find any details about the error anywhere.</p>
  
  <p>How do I get gunicorn to show me errors?</p>
  
  <p>Here's all I currently see in the log file when I hit the page giving me the error:</p>
  
  <pre><code>&gt;tail gunicorn.errors 
  2014-02-21 14:41:02 [22676] [INFO] Listening at: unix:/opt/djangoprojects/reports/bin/gunicorn.sock (22676)
  2014-02-21 14:41:02 [22676] [INFO] Using worker: sync
  2014-02-21 14:41:02 [22689] [INFO] Booting worker with pid: 22689
  ...
  2014-02-21 19:41:10 [22691] [DEBUG] GET /reports/2/
  </code></pre>
  
  <p>Here's my bash script I use to start gunicorn:</p>
  
  <pre><code>&gt;cat gunicorn_start
  #!/bin/bash
  
  NAME="reports"                                  # Name of the application
  DJANGODIR=/opt/djangoprojects/reports          # Django project directory
  SOCKFILE=/opt/djangoprojects/reports/bin/gunicorn.sock  # we will communicte using this unix socket
  USER=reportsuser                                        # the user to run as
  GROUP=webapps                                     # the group to run as
  NUM_WORKERS=4                                     # how many worker processes should Gunicorn spawn
  DJANGO_SETTINGS_MODULE=reports.settings             # which settings file should Django use
  DJANGO_WSGI_MODULE=reports.wsgi                     # WSGI module name
  
  #echo "Starting $NAME as `whoami`"
  
  # Activate the virtual environment
  cd $DJANGODIR
  source pythonenv/bin/activate
  export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
  export PYTHONPATH=$DJANGODIR:$PYTHONPATH
  
  # Create the run directory if it doesn't exist
  RUNDIR=$(dirname $SOCKFILE)
  test -d $RUNDIR || mkdir -p $RUNDIR
  
  # Start your Django Unicorn
  # Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
  exec gunicorn ${DJANGO_WSGI_MODULE}:application \
    --name $NAME \
    --workers $NUM_WORKERS \
    --user=$USER --group=$GROUP \
    --log-level=debug \
    --bind=unix:$SOCKFILE \
    --error-logfile /opt/djangoprojects/reports/bin/gunicorn.errors \
    --log-file /opt/djangoprojects/reports/bin/gunicorn.errors
  </code></pre>
  
  <p>More info:</p>
  
  <p>I'm starting/stopping gunicorn with this init.d script I copied and modified using <code>sudo service reports start|stop|restart</code>:</p>
  
  <pre><code>&gt;cat /etc/init.d/reports
  #!/bin/sh
  ### BEGIN INIT INFO
  # Provides:          django_gunicorn
  # Required-Start:    $local_fs $network $remote_fs
  # Required-Stop:     $local_fs $network $remote_fs
  # Default-Start:     2 3 4 5
  # Default-Stop:      0 1 6
  # Short-Description: Starts django_unicorn reports at boot time.
  # Description:       Starts django_unicorn reports at boot time.
  ### END INIT INFO
  
  name=`basename $0`
  dir="/opt/djangoprojects/reports"
  cmd="${dir}/bin/gunicorn_start"
  pid_file="/var/run/$name.pid"
  log_file="${dir}/bin/reports.log"
  
  get_pid() {
      cat "$pid_file"    
  }
  
  is_running() {
      [ -f "$pid_file" ] &amp;&amp; ps `get_pid` &gt; /dev/null 2&gt;&amp;1
  }
  
  case "$1" in
      start)
      if is_running; then
          echo "Already running"
      else
          echo -n "Starting ${name}... "
          cd "$dir"
          #sudo -u "$user" $cmd &amp;&gt;&gt; "$log_file"
          $cmd &amp;&gt;&gt; "$log_file" &amp;
          echo $! &gt; "$pid_file"
          if ! is_running; then
              echo "Unable to start; see $log_file"
              exit 1
          else
              echo "[STARTED]"
          fi
      fi
      ;;
      stop)
      if is_running; then
          echo -n "Stopping ${name}... "
          kill `get_pid`
          for i in {1..10}
          do
              if ! is_running; then
                  break
              fi
  
              echo -n "."
              sleep 1
          done
          echo
  
          if is_running; then
              echo "Not stopped; may still be shutting down or shutdown may have failed"
              exit 1
          else
              echo "[STOPPED]"
              if [ -f "$pid_file" ]; then
                  rm "$pid_file"
              fi
          fi
      else
          echo "Not running"
      fi
      ;;
      restart)
      $0 stop
      if is_running; then
          echo "Unable to stop, will not attempt to start"
          exit 1
      fi
      $0 start
      ;;
      status)
      if is_running; then
          echo "[RUNNING]"
      else
          echo "[STOPPED]"
          exit 1
      fi
      ;;
      *)
      echo "Usage: $0 {start|stop|restart|status}"
      exit 1
      ;;
  esac
  
  exit 0
  </code></pre>