Skip to content
This repository was archived by the owner on Dec 6, 2024. It is now read-only.

Commit f649e38

Browse files
authored
Merge pull request #50 from agawronski/feature/logging
Replace print with log at different levels, and add the option to mask AWS credentials
2 parents 2bf2e14 + 107482d commit f649e38

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

pandas_redshift/core.py

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import os
99
import re
1010
import uuid
11-
11+
import logging
1212

1313
S3_ACCEPTED_KWARGS = [
1414
'ACL', 'Body', 'CacheControl ', 'ContentDisposition', 'ContentEncoding', 'ContentLanguage',
@@ -19,6 +19,37 @@
1919
] # Available parameters for service: https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.put_object
2020

2121

22+
23+
logging_config = {
24+
'logger_level': logging.INFO,
25+
'mask_secrets': True
26+
}
27+
log_format = 'Pandas Redshift | %(asctime)s | %(name)s | %(levelname)s | %(message)s'
28+
logging.basicConfig(level=logging_config['logger_level'], format=log_format)
29+
logger = logging.getLogger(__name__)
30+
31+
32+
def set_log_level(level, mask_secrets=True):
33+
log_level_map = {
34+
'debug': logging.DEBUG,
35+
'info': logging.INFO,
36+
'warn': logging.WARN,
37+
'error': logging.ERROR
38+
}
39+
logging_config['logger_level'] = log_level_map[level]
40+
logger = logging.getLogger(__name__)
41+
logger.setLevel(logging_config['logger_level'])
42+
logging_config['mask_secrets'] = mask_secrets
43+
44+
45+
def mask_aws_credentials(s):
46+
if logging_config['mask_secrets']:
47+
import re
48+
s = re.sub('(?<=access_key_id \')(.*)(?=\')', '*'*8, s)
49+
s = re.sub('(?<=secret_access_key \')(.*)(?=\')', '*'*8, s)
50+
return s
51+
52+
2253
def connect_to_redshift(dbname, host, user, port=5439, **kwargs):
2354
global connect, cursor
2455
connect = psycopg2.connect(dbname=dbname,
@@ -103,15 +134,15 @@ def df_to_s3(data_frame, csv_name, index, save_local, delimiter, verbose=True, *
103134
if save_local:
104135
data_frame.to_csv(csv_name, index=index, sep=delimiter)
105136
if verbose:
106-
print('saved file {0} in {1}'.format(csv_name, os.getcwd()))
137+
logger.info('saved file {0} in {1}'.format(csv_name, os.getcwd()))
107138
#
108139
csv_buffer = StringIO()
109140
data_frame.to_csv(csv_buffer, index=index, sep=delimiter)
110141
s3.Bucket(s3_bucket_var).put_object(
111142
Key=s3_subdirectory_var + csv_name, Body=csv_buffer.getvalue(),
112143
**extra_kwargs)
113144
if verbose:
114-
print('saved file {0} in bucket {1}'.format(
145+
logger.info('saved file {0} in bucket {1}'.format(
115146
csv_name, s3_subdirectory_var + csv_name))
116147

117148

@@ -181,8 +212,8 @@ def create_redshift_table(data_frame,
181212
create_table_query += ' interleaved'
182213
create_table_query += ' sortkey({0})'.format(sortkey)
183214
if verbose:
184-
print(create_table_query)
185-
print('CREATING A TABLE IN REDSHIFT')
215+
logger.info(create_table_query)
216+
logger.info('CREATING A TABLE IN REDSHIFT')
186217
cursor.execute('drop table if exists {0}'.format(redshift_table_name))
187218
cursor.execute(create_table_query)
188219
connect.commit()
@@ -224,14 +255,14 @@ def s3_to_redshift(redshift_table_name, csv_name, delimiter=',', quotechar='"',
224255
s3_to_sql = s3_to_sql + "\n\tsession_token '{0}'".format(aws_token)
225256
s3_to_sql = s3_to_sql + ';'
226257
if verbose:
227-
print(s3_to_sql)
258+
logger.info(mask_aws_credentials(s3_to_sql))
228259
# send the file
229-
print('FILLING THE TABLE IN REDSHIFT')
260+
logger.info('FILLING THE TABLE IN REDSHIFT')
230261
try:
231262
cursor.execute(s3_to_sql)
232263
connect.commit()
233264
except Exception as e:
234-
print(e)
265+
logger.error(e)
235266
traceback.print_exc(file=sys.stdout)
236267
connect.rollback()
237268
raise

0 commit comments

Comments
 (0)