Skip to content

Commit d520747

Browse files
NihalHarishrahul003
authored andcommitted
refactored logger (aws#230)
1 parent b610650 commit d520747

File tree

23 files changed

+119
-110
lines changed

23 files changed

+119
-110
lines changed

tests/analysis/integration_testing_rules.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import asyncio
2727
import aioboto3
2828
from tornasole.core.access_layer.s3handler import S3Handler, ListRequest
29-
from tornasole.core.utils import get_logger
29+
from tornasole.core.logger import get_logger
3030
from subprocess import Popen, PIPE
3131
from time import sleep
3232
import re

tests/analysis/invoker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from tornasole.exceptions import *
2-
from tornasole.core.utils import get_logger
2+
from tornasole.core.logger import get_logger
33
from tornasole.rules.rule_invoker import create_rule
44

55
logger = get_logger()

tornasole/core/access_layer/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from tornasole.core.utils import get_logger
1+
from tornasole.core.logger import get_logger
22

33

44
class TSAccessBase:

tornasole/core/access_layer/s3handler.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import aioboto3
22
import asyncio
3-
from tornasole.core.utils import is_s3, get_logger, get_region
3+
from tornasole.core.utils import is_s3, get_region
4+
from tornasole.core.logger import get_logger
45
import logging
56
import time
67

tornasole/core/access_layer/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
from botocore.exceptions import ClientError
33
from .file import TSAccessFile
44
from .s3 import TSAccessS3
5-
from tornasole.core.utils import is_s3, get_logger, check_dir_exists, get_region
5+
from tornasole.core.utils import is_s3, check_dir_exists, get_region
6+
from tornasole.core.logger import get_logger
67
from tornasole.core.access_layer.s3handler import S3Handler, ListRequest
78
import asyncio
89
import aioboto3

tornasole/core/actions/action_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from tornasole.core.utils import get_logger
1+
from tornasole.core.logger import get_logger
22

33
class Action:
44
def __init__(self):

tornasole/core/hook_utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
from .json_config import DEFAULT_SAGEMAKER_TORNASOLE_PATH
44
from .sagemaker_utils import is_sagemaker_job, get_sagemaker_out_dir
5-
from .utils import is_s3, check_dir_exists, get_logger
5+
from .utils import is_s3, check_dir_exists
6+
from .logger import get_logger
67

78
logger = get_logger()
89

tornasole/core/index_reader.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
from tornasole.core.locations import TensorLocation, IndexFileLocationUtils
44
from tornasole.core.s3_utils import list_s3_objects
55
from tornasole.core.access_layer.s3handler import ReadObjectRequest, S3Handler
6-
from tornasole.core.utils import get_logger, is_s3, list_files_in_directory, step_in_range
6+
from tornasole.core.utils import is_s3, list_files_in_directory, step_in_range
7+
from tornasole.core.logger import get_logger
78
from tornasole.core.tfrecord.tensor_reader import TensorReader
89
from tornasole.core.modes import ModeKeys
910

tornasole/core/json_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import os
33

44
from tornasole.core.modes import ModeKeys, ALLOWED_MODE_NAMES
5-
from tornasole.core.utils import get_logger
5+
from tornasole.core.logger import get_logger
66
from tornasole import ReductionConfig, SaveConfig
77

88
TORNASOLE_CONFIG_DEFAULT_WORKER_NAME = 'worker0'

tornasole/core/locations.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import os
22
import re
33

4-
from .utils import get_immediate_subdirectories, get_logger
4+
from .utils import get_immediate_subdirectories
5+
from .logger import get_logger
56

67
logger = get_logger()
78

tornasole/core/logger.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import logging
2+
import sys
3+
import socket
4+
import os
5+
6+
_logger_initialized = False
7+
8+
9+
class MaxLevelFilter(logging.Filter):
10+
'''Filters (lets through) all messages with level < LEVEL'''
11+
def __init__(self, level):
12+
super().__init__()
13+
self.level = level
14+
15+
def filter(self, record):
16+
# "<" instead of "<=": since logger.setLevel is inclusive, this should be exclusive
17+
return record.levelno < self.level
18+
19+
20+
def _get_log_level():
21+
default = 'info'
22+
log_level = os.environ.get('TORNASOLE_LOG_LEVEL', default=default)
23+
log_level = log_level.lower()
24+
allowed_levels = ['info', 'debug', 'warning', 'error', 'critical', 'off']
25+
if log_level not in allowed_levels:
26+
log_level = default
27+
28+
level = None
29+
if log_level is None or log_level == 'off':
30+
level = None
31+
else:
32+
if log_level == 'critical':
33+
level = logging.CRITICAL
34+
elif log_level == 'error':
35+
level = logging.ERROR
36+
elif log_level == 'warning':
37+
level = logging.WARNING
38+
elif log_level == 'info':
39+
level = logging.INFO
40+
elif log_level == 'debug':
41+
level = logging.DEBUG
42+
return level
43+
44+
45+
def get_logger(name='tornasole'):
46+
global _logger_initialized
47+
if not _logger_initialized:
48+
worker_pid = f"{socket.gethostname()}:{os.getpid()}"
49+
log_context = os.environ.get('TORNASOLE_LOG_CONTEXT',
50+
default=worker_pid)
51+
level = _get_log_level()
52+
logger = logging.getLogger(name)
53+
54+
logger.handlers = []
55+
log_formatter = logging.Formatter(fmt='[%(asctime)s.%(msecs)03d ' + log_context +
56+
' %(levelname)s %(filename)s:%(lineno)d] %(message)s',
57+
datefmt='%Y-%m-%d %H:%M:%S')
58+
59+
stdout_handler = logging.StreamHandler(sys.stdout)
60+
stdout_handler.setFormatter(log_formatter)
61+
62+
if os.environ.get('TORNASOLE_LOG_ALL_TO_STDOUT', default='TRUE').lower() == 'false':
63+
stderr_handler = logging.StreamHandler(sys.stderr)
64+
min_level = logging.DEBUG
65+
# lets through all levels less than ERROR
66+
stdout_handler.addFilter(MaxLevelFilter(logging.ERROR))
67+
stdout_handler.setLevel(min_level)
68+
69+
stderr_handler.setLevel(max(min_level, logging.ERROR))
70+
stderr_handler.setFormatter(log_formatter)
71+
logger.addHandler(stderr_handler)
72+
73+
logger.addHandler(stdout_handler)
74+
75+
# TORNASOLE_LOG_PATH is the full path to log file
76+
# by default, log is only written to stdout&stderr
77+
# if this is set, it is written to file
78+
path = os.environ.get('TORNASOLE_LOG_PATH', default=None)
79+
if path is not None:
80+
fh = logging.FileHandler(path)
81+
fh.setFormatter(log_formatter)
82+
logger.addHandler(fh)
83+
84+
if level:
85+
logger.setLevel(level)
86+
else:
87+
logger.disabled = True
88+
logger.propagate = False
89+
_logger_initialized = True
90+
return logging.getLogger(name)

tornasole/core/s3_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from tornasole.core.access_layer.s3handler import S3Handler, ListRequest
2-
from tornasole.core.utils import get_logger
2+
from tornasole.core.logger import get_logger
33

44

55
logger = get_logger()

tornasole/core/tfevent/events_writer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from tornasole.core.tfevent.proto.event_pb2 import Event
22
from tornasole.core.tfrecord.record_writer import RecordWriter
3-
from tornasole.core.utils import get_logger
3+
from tornasole.core.logger import get_logger
44

55

66
class EventsWriter:

tornasole/core/tfevent/util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from .proto.tensor_shape_pb2 import TensorShapeProto
33

44
import numpy as np
5-
from tornasole.core.utils import get_logger
5+
from tornasole.core.logger import get_logger
66

77
logger = get_logger()
88

tornasole/core/utils.py

Lines changed: 0 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import os
22
import re
3-
import logging
43
import bisect
54
from botocore.exceptions import ClientError
6-
import sys
7-
import socket
85
from pathlib import Path
96

107
def flatten(lis):
@@ -17,92 +14,6 @@ def flatten(lis):
1714
new_lis.append(item)
1815
return new_lis
1916

20-
_logger_initialized = False
21-
22-
23-
class MaxLevelFilter(logging.Filter):
24-
'''Filters (lets through) all messages with level < LEVEL'''
25-
def __init__(self, level):
26-
super().__init__()
27-
self.level = level
28-
29-
def filter(self, record):
30-
# "<" instead of "<=": since logger.setLevel is inclusive, this should be exclusive
31-
return record.levelno < self.level
32-
33-
34-
def _get_log_level():
35-
default = 'info'
36-
log_level = os.environ.get('TORNASOLE_LOG_LEVEL', default=default)
37-
log_level = log_level.lower()
38-
allowed_levels = ['info', 'debug', 'warning', 'error', 'critical', 'off']
39-
if log_level not in allowed_levels:
40-
log_level = default
41-
42-
level = None
43-
if log_level is None or log_level == 'off':
44-
level = None
45-
else:
46-
if log_level == 'critical':
47-
level = logging.CRITICAL
48-
elif log_level == 'error':
49-
level = logging.ERROR
50-
elif log_level == 'warning':
51-
level = logging.WARNING
52-
elif log_level == 'info':
53-
level = logging.INFO
54-
elif log_level == 'debug':
55-
level = logging.DEBUG
56-
return level
57-
58-
59-
def get_logger(name='tornasole'):
60-
global _logger_initialized
61-
if not _logger_initialized:
62-
worker_pid = f"{socket.gethostname()}:{os.getpid()}"
63-
log_context = os.environ.get('TORNASOLE_LOG_CONTEXT',
64-
default=worker_pid)
65-
level = _get_log_level()
66-
logger = logging.getLogger(name)
67-
68-
logger.handlers = []
69-
log_formatter = logging.Formatter(fmt='[%(asctime)s.%(msecs)03d ' + log_context +
70-
' %(levelname)s %(filename)s:%(lineno)d] %(message)s',
71-
datefmt='%Y-%m-%d %H:%M:%S')
72-
73-
stdout_handler = logging.StreamHandler(sys.stdout)
74-
stdout_handler.setFormatter(log_formatter)
75-
76-
if os.environ.get('TORNASOLE_LOG_ALL_TO_STDOUT', default='TRUE').lower() == 'false':
77-
stderr_handler = logging.StreamHandler(sys.stderr)
78-
min_level = logging.DEBUG
79-
# lets through all levels less than ERROR
80-
stdout_handler.addFilter(MaxLevelFilter(logging.ERROR))
81-
stdout_handler.setLevel(min_level)
82-
83-
stderr_handler.setLevel(max(min_level, logging.ERROR))
84-
stderr_handler.setFormatter(log_formatter)
85-
logger.addHandler(stderr_handler)
86-
87-
logger.addHandler(stdout_handler)
88-
89-
# TORNASOLE_LOG_PATH is the full path to log file
90-
# by default, log is only written to stdout&stderr
91-
# if this is set, it is written to file
92-
path = os.environ.get('TORNASOLE_LOG_PATH', default=None)
93-
if path is not None:
94-
fh = logging.FileHandler(path)
95-
fh.setFormatter(log_formatter)
96-
logger.addHandler(fh)
97-
98-
if level:
99-
logger.setLevel(level)
100-
else:
101-
logger.disabled = True
102-
logger.propagate = False
103-
_logger_initialized = True
104-
return logging.getLogger(name)
105-
10617

10718
def get_immediate_subdirectories(a_dir):
10819
return [name for name in os.listdir(a_dir)

tornasole/mxnet/hook.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from tornasole.core.save_config import SaveConfig
44
from tornasole.core.save_manager import SaveManager
55
from tornasole.core.modes import ModeKeys, ALLOWED_MODES
6-
from tornasole.core.utils import get_logger
6+
from tornasole.core.logger import get_logger
77
from tornasole.core.reductions import get_reduction_tensor_name
88
from tornasole.core.json_config import TORNASOLE_CONFIG_DEFAULT_WORKER_NAME, create_hook_from_json_config
99
from tornasole.core.access_layer.utils import training_has_ended

tornasole/pytorch/hook.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from tornasole.core.save_config import SaveConfig
44
from tornasole.core.save_manager import SaveManager
55
from tornasole.core.modes import ModeKeys, ALLOWED_MODES
6-
from tornasole.core.utils import get_logger
6+
from tornasole.core.logger import get_logger
77
from tornasole.core.hook_utils import verify_and_get_out_dir
88
from tornasole.core.reductions import get_reduction_tensor_name
99
from tornasole.core.json_config import create_hook_from_json_config

tornasole/rules/rule.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from .req_tensors import RequiredTensors
44
from tornasole.analysis.utils import no_refresh
5-
from tornasole.core.utils import get_logger
5+
from tornasole.core.logger import get_logger
66
from tornasole.exceptions import RuleEvaluationConditionMet
77

88

tornasole/rules/rule_invoker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from tornasole.exceptions import *
2-
from tornasole.core.utils import get_logger
2+
from tornasole.core.logger import get_logger
33
from tornasole.trials import create_trial
44
from tornasole.rules.generic import *
55
import inspect

tornasole/tensorflow/hook.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
from .reductions import get_tensorflow_reduction
77
from .collection import *
88
from tornasole.core.writer import FileWriter
9-
from tornasole.core.utils import get_logger, flatten, match_inc
9+
from tornasole.core.utils import flatten, match_inc
10+
from tornasole.core.logger import get_logger
1011
from tornasole.core.hook_utils import verify_and_get_out_dir
1112
from tornasole.core.reductions import get_reduction_tensor_name
1213
from tornasole.core.json_config import TORNASOLE_CONFIG_DEFAULT_WORKER_NAME, create_hook_from_json_config

tornasole/tensorflow/keras.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
from .collection import *
66
from tornasole.core.writer import FileWriter
7-
from tornasole.core.utils import get_logger, flatten
7+
from tornasole.core.utils import flatten
8+
from tornasole.core.logger import get_logger
89
from tornasole.core.hook_utils import verify_and_get_out_dir
910
from tornasole.core.modes import ModeKeys
1011
from tornasole.core.save_config import SaveConfig

tornasole/trials/trial.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
from tornasole.analysis.utils import refresh
99

1010
from tornasole.core.locations import EventFileLocation
11-
from tornasole.core.utils import get_logger, flatten
11+
from tornasole.core.utils import flatten
12+
from tornasole.core.logger import get_logger
1213
from tornasole.core.reductions import TORNASOLE_REDUCTIONS_PREFIX, \
1314
reverse_reduction_tensor_name
1415
from tornasole.core.modes import ModeKeys

tornasole/xgboost/hook.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
TORNASOLE_CONFIG_DEFAULT_WORKER_NAME,
1313
create_hook_from_json_config)
1414
from tornasole.core.writer import FileWriter
15-
from tornasole.core.utils import get_logger
15+
from tornasole.core.logger import get_logger
1616
from tornasole.core.hook_utils import verify_and_get_out_dir
1717
from .collection import get_collection, get_collection_manager
1818
from .utils import validate_data_file_path, get_content_type, get_dmatrix

0 commit comments

Comments
 (0)