Skip to content

Commit 82d37ac

Browse files
committed
Remove secrets from logs
(closes #274)
1 parent 657bca9 commit 82d37ac

File tree

5 files changed

+62
-22
lines changed

5 files changed

+62
-22
lines changed

datadog/__init__.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import logging
1515
import os
1616
import os.path
17+
import sys
1718

1819
# datadog
1920
from datadog import api
@@ -26,8 +27,46 @@
2627

2728
__version__ = get_version()
2829

30+
31+
def _replace_secrets(msg):
32+
for secret in [api._api_key, api._application_key]:
33+
if secret is not None:
34+
msg = msg.replace(secret, "<SECRET>")
35+
return msg
36+
37+
38+
class WrapSecretFormatter(object):
39+
40+
def __init__(self, formatter):
41+
self.formatter = formatter
42+
43+
def format(self, record):
44+
return _replace_secrets(self.formatter.format(record))
45+
46+
def __getattr__(self, attr):
47+
return getattr(self.formatter, attr)
48+
49+
50+
class SecretFormatter(logging.Formatter):
51+
52+
def format(self, record):
53+
return _replace_secrets(super(SecretFormatter, self).format(record))
54+
55+
56+
_root_logger = logging.getLogger()
57+
for h in _root_logger.handlers:
58+
h.setFormatter(WrapSecretFormatter(h.formatter))
59+
60+
for logger in logging.Logger.manager.loggerDict.values():
61+
for h in getattr(logger, 'handlers', []):
62+
h.setFormatter(WrapSecretFormatter(h.formatter))
63+
64+
_secret_handler = logging.StreamHandler(stream=sys.stderr)
65+
_secret_handler.setFormatter(SecretFormatter('%(levelname)s: %(message)s'))
66+
2967
# Loggers
3068
logging.getLogger('datadog.api').addHandler(NullHandler())
69+
logging.getLogger("datadog.dogshell").addHandler(_secret_handler)
3170
logging.getLogger('datadog.dogstatsd').addHandler(NullHandler())
3271
logging.getLogger('datadog.threadstats').addHandler(NullHandler())
3372

datadog/dogshell/common.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,29 @@
55
from __future__ import print_function
66
import os
77
import sys
8+
import logging
9+
import warnings
810

911
# datadog
10-
from datadog.util.compat import is_p3k, configparser, IterableUserDict,\
12+
from datadog.util.compat import configparser, IterableUserDict,\
1113
get_input
1214

15+
log = logging.getLogger("datadog.dogshell")
16+
1317

1418
def print_err(msg):
15-
if is_p3k():
16-
print(msg + '\n', file=sys.stderr)
17-
else:
18-
sys.stderr.write(msg + '\n')
19+
warnings.warn("Use datadog.dogshell logger directly", warnings.DeprecationWarning, stacklevel=2)
20+
log.error(msg)
1921

2022

2123
def report_errors(res):
2224
if 'errors' in res:
2325
errors = res['errors']
2426
if isinstance(errors, list):
2527
for error in errors:
26-
print_err("ERROR: {}".format(error))
28+
log.error(error)
2729
else:
28-
print_err("ERROR: {}".format(errors))
30+
log.error(errors)
2931
sys.exit(1)
3032
return False
3133

@@ -35,9 +37,9 @@ def report_warnings(res):
3537
warnings = res['warnings']
3638
if isinstance(warnings, list):
3739
for warning in warnings:
38-
print_err("WARNING: {}".format(warning))
40+
log.warning(warning)
3941
else:
40-
print_err("WARNING: {}".format(warnings))
42+
log.warning(warnings)
4143
return True
4244
return False
4345

@@ -79,11 +81,11 @@ def load(self, config_file, api_key, app_key):
7981
print('Wrote %s' % config_file)
8082
elif response.strip().lower() == 'n':
8183
# Abort
82-
print_err('Exiting\n')
84+
log.info('Exiting')
8385
sys.exit(1)
8486
except KeyboardInterrupt:
8587
# Abort
86-
print_err('\nExiting')
88+
log.info('Exiting')
8789
sys.exit(1)
8890

8991
self['api_key'] = config.get('Connection', 'apikey')

datadog/dogshell/monitor.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
# stdlib
55
import argparse
66
import json
7+
import warnings
78

89
# 3p
910
from datadog.util.format import pretty_json
1011

1112
# datadog
1213
from datadog import api
13-
from datadog.dogshell.common import report_errors, report_warnings, print_err
14+
from datadog.dogshell.common import log, report_errors, report_warnings
1415

1516

1617
class MonitorClient(object):
@@ -185,19 +186,17 @@ def _update(cls, args):
185186
if args.type:
186187
if args.type_opt:
187188
msg = 'Duplicate arguments for `type`. Using optional value --type'
188-
print_err("WARNING: {}".format(msg))
189+
log.warning(msg)
189190
else:
190191
to_update['type'] = args.type
191-
msg = "[DEPRECATION] `type` is no longer required to `update` and may be omitted"
192-
print_err("WARNING: {}".format(msg))
192+
warnings.warn("`type` is no longer required to `update` and may be omitted", warnings.DeprecationWarning)
193193
if args.query:
194194
if args.query_opt:
195195
msg = 'Duplicate arguments for `query`. Using optional value --query'
196-
print_err("WARNING: {}".format(msg))
196+
log.warning(msg)
197197
else:
198198
to_update['query'] = args.query
199-
msg = "[DEPRECATION] `query` is no longer required to `update` and may be omitted"
200-
print_err("WARNING: {}".format(msg))
199+
warnings.warn("`query` is no longer required to `update` and may be omitted", warnings.DeprecationWarning)
201200
if args.name:
202201
to_update['name'] = args.name
203202
if args.message:

datadog/dogshell/screenboard.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
# datadog
1515
from datadog import api
16-
from datadog.dogshell.common import report_errors, report_warnings, print_err
16+
from datadog.dogshell.common import log, report_errors, report_warnings
1717
from datetime import datetime
1818

1919

@@ -126,7 +126,7 @@ def _push(cls, args):
126126
res = api.Screenboard.create(**screen_obj)
127127

128128
if 'errors' in res:
129-
print_err('Upload of screenboard {0} from file {1} failed.'
129+
log.error('Upload of screenboard {0} from file {1} failed.'
130130
.format(screen_obj["id"], f.name))
131131

132132
report_warnings(res)

datadog/dogshell/timeboard.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
# datadog
1515
from datadog import api
16-
from datadog.dogshell.common import report_errors, report_warnings, print_err
16+
from datadog.dogshell.common import log, report_errors, report_warnings
1717
from datadog.util.format import pretty_json
1818
from datetime import datetime
1919

@@ -213,7 +213,7 @@ def _push(cls, args):
213213
graphs=dash_obj["graphs"], template_variables=tpl_vars)
214214

215215
if 'errors' in res:
216-
print_err('Upload of dashboard {0} from file {1} failed.'
216+
log.error('Upload of dashboard {0} from file {1} failed.'
217217
.format(dash_obj["id"], f.name))
218218

219219
report_warnings(res)

0 commit comments

Comments
 (0)