| 162 | |
| 163 | |
| 164 | class Logger: |
| 165 | |
| 166 | LOG_LEVELS = { |
| 167 | "critical": logging.CRITICAL, |
| 168 | "error": logging.ERROR, |
| 169 | "warning": logging.WARNING, |
| 170 | "info": logging.INFO, |
| 171 | "debug": logging.DEBUG |
| 172 | } |
| 173 | loglevel = logging.INFO |
| 174 | |
| 175 | error_fmt = r"%(asctime)s [%(process)d] [%(levelname)s] %(message)s" |
| 176 | datefmt = r"[%Y-%m-%d %H:%M:%S %z]" |
| 177 | |
| 178 | access_fmt = "%(message)s" |
| 179 | syslog_fmt = "[%(process)d] %(message)s" |
| 180 | |
| 181 | atoms_wrapper_class = SafeAtoms |
| 182 | |
| 183 | def __init__(self, cfg): |
| 184 | self.error_log = logging.getLogger("gunicorn.error") |
| 185 | self.error_log.propagate = False |
| 186 | self.access_log = logging.getLogger("gunicorn.access") |
| 187 | self.access_log.propagate = False |
| 188 | self.error_handlers = [] |
| 189 | self.access_handlers = [] |
| 190 | self.logfile = None |
| 191 | self.lock = threading.Lock() |
| 192 | self.cfg = cfg |
| 193 | self.setup(cfg) |
| 194 | |
| 195 | def setup(self, cfg): |
| 196 | self.loglevel = self.LOG_LEVELS.get(cfg.loglevel.lower(), logging.INFO) |
| 197 | self.error_log.setLevel(self.loglevel) |
| 198 | self.access_log.setLevel(logging.INFO) |
| 199 | |
| 200 | # set gunicorn.error handler |
| 201 | if self.cfg.capture_output and cfg.errorlog != "-": |
| 202 | for stream in sys.stdout, sys.stderr: |
| 203 | stream.flush() |
| 204 | |
| 205 | self.logfile = open(cfg.errorlog, 'a+') |
| 206 | os.dup2(self.logfile.fileno(), sys.stdout.fileno()) |
| 207 | os.dup2(self.logfile.fileno(), sys.stderr.fileno()) |
| 208 | |
| 209 | self._set_handler(self.error_log, cfg.errorlog, |
| 210 | logging.Formatter(self.error_fmt, self.datefmt)) |
| 211 | |
| 212 | # set gunicorn.access handler |
| 213 | if cfg.accesslog is not None: |
| 214 | self._set_handler( |
| 215 | self.access_log, cfg.accesslog, |
| 216 | fmt=logging.Formatter(self.access_fmt), stream=sys.stdout |
| 217 | ) |
| 218 | |
| 219 | # set syslog handler |
| 220 | if cfg.syslog: |
| 221 | self._set_syslog_handler( |
no outgoing calls