Skip to content

Commit 51ce56d

Browse files
Allow user to specify the basename of the log file (#60)
1 parent 6cff5fa commit 51ce56d

File tree

5 files changed

+37
-13
lines changed

5 files changed

+37
-13
lines changed

cli/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ data_path="./data"
9999
| Logging level for cli | `--log-level` | `False` | `INFO` | `String` | `['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']` |
100100
| Log rotation option. If `date` options is enabled RWM rotates logs each day. If `size` option is enabled RWM rotates log file when it reaches this size | `--log-rotation` | `False` | `date` | `String` | `['date', 'size']` |
101101
| Rotation log file size in Mb. RWM rotates log file when it reaches this size and `--log-rotation` is `size` | `--log-file-size` | `False` | `5` | `Int` | |
102+
| Log file name | `--log-file-name` | `False` | `rwm` | `String` | |
102103
| Drop database before workflow run, or not | `--drop-db` | `False` | `False` | `BooleanOptionalAction` | `True` - `--drop-db`, `False` - `--no-drop-db`, no argument - default value |
103104
| Remove RAI engine and database after run or not | `--cleanup-resources` | `False` | `False` | `BooleanOptionalAction` | `True` - `--cleanup-resources`, `False` - `--no-cleanup-resources`, no argument - default value |
104105
| Remove RAI engine after run or not | `--cleanup-engine` | `False` | `False` | `BooleanOptionalAction` | `True` - `--cleanup-engine`, `False` - `--no-cleanup-engine`, no argument - default value |

cli/args.py

+13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import re
12
from argparse import ArgumentParser, Namespace, BooleanOptionalAction
23
from cli.logger import LogRotationOption
34

5+
prohibited_symbols_in_file_name = re.compile(r'[\\/:*?"<>|]')
6+
47

58
def parse() -> Namespace:
69
parser = ArgumentParser()
@@ -100,6 +103,13 @@ def parse() -> Namespace:
100103
type=int,
101104
default=5 # 5 Mb
102105
)
106+
parser.add_argument(
107+
"--log-file-name",
108+
help="Log file name",
109+
required=False,
110+
type=str,
111+
default="rwm"
112+
)
103113
parser.add_argument(
104114
"--drop-db",
105115
help="Drop RAI database before run, or not",
@@ -181,6 +191,9 @@ def parse() -> Namespace:
181191
except ValueError:
182192
parser.error("`--step-timeout` should be key value pairs separated by comma. Value must have `int` type. "
183193
"Example: `--step-timeout \"step1=10,step2=20`\"")
194+
if 'log_file_name' in vars(args):
195+
if prohibited_symbols_in_file_name.search(args.log_file_name):
196+
parser.error(f"`--log-file-name` contains prohibited symbols: {prohibited_symbols_in_file_name.pattern}")
184197
return args
185198

186199

cli/logger.py

+19-11
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,49 @@
11
import logging
2+
import dataclasses
23
from logging.handlers import TimedRotatingFileHandler, RotatingFileHandler
34
from workflow.common import BaseEnum
45

5-
log_filename = 'rwm.log'
6-
76

87
class LogRotationOption(str, BaseEnum):
98
DATE = 'date'
109
SIZE = 'size'
1110

1211

13-
def configure(level=logging.INFO, rotation: LogRotationOption = LogRotationOption.DATE,
14-
log_file_size: int = 5) -> logging.Logger:
12+
@dataclasses.dataclass
13+
class LogConfiguration:
14+
level: int = logging.INFO
15+
rotation: LogRotationOption = LogRotationOption.DATE
16+
log_file_size: int = 5
17+
log_file_name: str = "rwm"
18+
19+
20+
def configure(config: LogConfiguration) -> logging.Logger:
1521
# override default logging level for azure
1622
logger = logging.getLogger('azure.core')
1723
logger.setLevel(logging.ERROR)
1824
logger = logging.getLogger('snowflake')
1925
logger.setLevel(logging.ERROR)
2026

2127
logger = logging.getLogger()
22-
logger.setLevel(level)
28+
logger.setLevel(config.level)
2329
formatter = logging.Formatter('[%(asctime)s.%(msecs)03d][%(levelname)s][%(name)s] %(message)s', '%Y-%m-%d %H:%M:%S')
2430

2531
stream_handler = logging.StreamHandler()
2632
stream_handler.setFormatter(formatter)
2733
logger.addHandler(stream_handler)
2834

29-
if rotation == LogRotationOption.SIZE:
30-
max_log_size = log_file_size * 1024 * 1024 # covert to Mb
31-
size_rotation_handler = RotatingFileHandler(log_filename, maxBytes=max_log_size, backupCount=30,
35+
full_log_file_name = f"{config.log_file_name}.log"
36+
37+
if config.rotation == LogRotationOption.SIZE:
38+
max_log_size = config.log_file_size * 1024 * 1024 # covert to Mb
39+
size_rotation_handler = RotatingFileHandler(full_log_file_name, maxBytes=max_log_size, backupCount=30,
3240
encoding='utf-8')
3341
size_rotation_handler.setFormatter(formatter)
3442
logger.addHandler(size_rotation_handler)
3543
logger.info("Log rotation by size is enabled")
36-
elif rotation == LogRotationOption.DATE:
37-
time_rotation_handler = TimedRotatingFileHandler(log_filename, when='midnight', interval=1, backupCount=30,
38-
encoding='utf-8')
44+
elif config.rotation == LogRotationOption.DATE:
45+
time_rotation_handler = TimedRotatingFileHandler(full_log_file_name, when='midnight', interval=1,
46+
backupCount=30, encoding='utf-8')
3947
time_rotation_handler.setFormatter(formatter)
4048
logger.addHandler(time_rotation_handler)
4149
logger.info("Log rotation by date is enabled")

cli/runner.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ def start():
1616
# parse arguments
1717
args = cli.args.parse()
1818
# configure logger
19-
logger = cli.logger.configure(logging.getLevelName(args.log_level), args.log_rotation, args.log_file_size)
19+
log_config = cli.logger.LogConfiguration(logging.getLevelName(args.log_level), args.log_rotation,
20+
args.log_file_size, args.log_file_name)
21+
logger = cli.logger.configure(log_config)
2022
try:
2123
with open(args.env_config, "rb") as fp:
2224
loader_config = tomli.load(fp)

workflow/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
__version_info__ = (0, 0, 31)
15+
__version_info__ = (0, 0, 32)
1616
__version__ = ".".join(map(str, __version_info__))

0 commit comments

Comments
 (0)