| 103 | |
| 104 | |
| 105 | class _TokenFilterFormatter(logging.Formatter): |
| 106 | def __init__(self, fmt): |
| 107 | super(_TokenFilterFormatter, self).__init__(fmt) |
| 108 | self._replacements = [] |
| 109 | if not self._replacements: |
| 110 | if six.PY2: |
| 111 | for k, v in os.environ.iteritems(): |
| 112 | if k.endswith('TOKEN') and v: |
| 113 | self._replacements.append(v) |
| 114 | elif six.PY3: |
| 115 | for k, v in os.environ.items(): |
| 116 | if k.endswith('TOKEN') and v: |
| 117 | self._replacements.append(v) |
| 118 | self._replacements = sorted(self._replacements) |
| 119 | |
| 120 | def _filter(self, s): |
| 121 | for r in self._replacements: |
| 122 | s = s.replace(r, "[SECRET]") |
| 123 | |
| 124 | return s |
| 125 | |
| 126 | def format(self, record): |
| 127 | return self._filter(super(_TokenFilterFormatter, self).format(record)) |
| 128 | |
| 129 | |
| 130 | def setup_logging(log_path, level=logging.DEBUG, *other_logs): |