Skip to content

Commit f1e7ecd

Browse files
committed
add logger
1 parent 5f82df4 commit f1e7ecd

File tree

8 files changed

+73
-42
lines changed

8 files changed

+73
-42
lines changed

mqpy/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@
33
This package provides a bridge between Python and MetaTrader 5, allowing users to
44
create Expert Advisors and implement trading strategies in Python.
55
"""
6+
7+
from mqpy.logger import get_logger
8+
9+
__all__ = ["get_logger"]

mqpy/book.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,14 @@
55

66
from __future__ import annotations
77

8-
import logging
98
from typing import Any
109

1110
import MetaTrader5 as Mt5
1211

12+
from mqpy.logger import get_logger
13+
1314
# Configure logging
14-
logger = logging.getLogger(__name__)
15-
logger.setLevel(logging.INFO)
16-
17-
# Create console handler with formatting
18-
console_handler = logging.StreamHandler()
19-
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
20-
console_handler.setFormatter(formatter)
21-
logger.addHandler(console_handler)
15+
logger = get_logger(__name__)
2216

2317

2418
class Book:

mqpy/indicator_connector.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,13 @@
77

88
import ast
99
import json
10-
import logging
1110
import socket
1211
from typing import Any
1312

13+
from mqpy.logger import get_logger
14+
1415
# Configure logging
15-
logger = logging.getLogger(__name__)
16-
logger.setLevel(logging.INFO)
17-
18-
# Create console handler with formatting
19-
console_handler = logging.StreamHandler()
20-
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
21-
console_handler.setFormatter(formatter)
22-
logger.addHandler(console_handler)
16+
logger = get_logger(__name__)
2317

2418
# To be able to use it you need the MQL5 Service to send the data, it is possible to found it here:
2519
# -------------------------------------------------------------------- #

mqpy/logger.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"""Logging configuration for the MqPy application.
2+
3+
This module provides a centralized logging configuration for the entire application.
4+
Import this module instead of directly importing the logging module to ensure consistent
5+
logging behavior across the application.
6+
"""
7+
8+
from __future__ import annotations
9+
10+
import logging
11+
import sys
12+
13+
14+
def get_logger(name: str, level: int | None = None) -> logging.Logger:
15+
"""Get a logger with the specified name and level.
16+
17+
Args:
18+
name (str): The name of the logger, typically __name__.
19+
level (int | None): The logging level. Defaults to INFO if None.
20+
21+
Returns:
22+
logging.Logger: A configured logger instance.
23+
"""
24+
logger = logging.getLogger(name)
25+
26+
# Only configure the logger if it doesn't already have handlers
27+
if not logger.handlers:
28+
# Set default level if not specified
29+
if level is None:
30+
level = logging.INFO
31+
32+
logger.setLevel(level)
33+
34+
# Create console handler with a specific format
35+
console_handler = logging.StreamHandler(sys.stdout)
36+
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
37+
console_handler.setFormatter(formatter)
38+
logger.addHandler(console_handler)
39+
40+
return logger
41+
42+
43+
# Configure the root logger
44+
root_logger = logging.getLogger()
45+
if not root_logger.handlers:
46+
root_logger.setLevel(logging.WARNING)
47+
console_handler = logging.StreamHandler(sys.stdout)
48+
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
49+
console_handler.setFormatter(formatter)
50+
root_logger.addHandler(console_handler)

mqpy/template.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
from __future__ import annotations
77

88
import argparse
9-
import logging
109
from pathlib import Path
1110
from typing import Any, Callable
1211

12+
from mqpy.logger import get_logger
13+
1314
# Configure logging
14-
logging.basicConfig(level=logging.INFO, format="%(message)s")
15+
logger = get_logger(__name__)
1516

1617

1718
def get_arguments() -> dict[str, Any]:
@@ -539,9 +540,9 @@ def main() -> None:
539540
with output_file.open("w", encoding="utf-8") as file:
540541
file.write(template_content)
541542

542-
logging.info(f"Strategy template generated: {output_file.absolute()}")
543-
logging.info(f"Strategy type: {args['strategy']}")
544-
logging.info(f"Trading symbol: {args['symbol']}")
543+
logger.info(f"Strategy template generated: {output_file.absolute()}")
544+
logger.info(f"Strategy type: {args['strategy']}")
545+
logger.info(f"Trading symbol: {args['symbol']}")
545546

546547

547548
if __name__ == "__main__":

mqpy/trade.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,15 @@
1212
The Trade class automatically respects these limitations when attempting to open or close positions.
1313
"""
1414

15-
import logging
1615
import sys
1716
from datetime import datetime, timedelta, timezone
1817

1918
import MetaTrader5 as Mt5
2019

20+
from mqpy.logger import get_logger
21+
2122
# Configure logging
22-
logger = logging.getLogger(__name__)
23-
logger.setLevel(logging.INFO)
24-
25-
# Create console handler with formatting
26-
console_handler = logging.StreamHandler()
27-
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
28-
console_handler.setFormatter(formatter)
29-
logger.addHandler(console_handler)
23+
logger = get_logger(__name__)
3024

3125

3226
class Trade:

mqpy/utilities.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,14 @@
33
Provides helper functions and classes for trading operations.
44
"""
55

6-
import logging
76
from datetime import datetime, timezone
87

98
import MetaTrader5 as Mt5
109

10+
from mqpy.logger import get_logger
11+
1112
# Configure logging
12-
logger = logging.getLogger(__name__)
13-
logger.setLevel(logging.INFO)
14-
15-
# Create console handler with formatting
16-
console_handler = logging.StreamHandler()
17-
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
18-
console_handler.setFormatter(formatter)
19-
logger.addHandler(console_handler)
13+
logger = get_logger(__name__)
2014

2115

2216
class Utilities:

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from setuptools import find_packages, setup
1010

1111
# Read the README for the long description
12-
with Path("README.md").open() as f:
12+
with Path("README.md").open(encoding="utf-8") as f:
1313
long_description = f.read()
1414

1515
setup(

0 commit comments

Comments
 (0)