Skip to content

Commit ab983da

Browse files
committed
fix for deployment app-tendermint logging issue with the same file opened
1 parent 4b7ea9b commit ab983da

File tree

2 files changed

+24
-37
lines changed

2 files changed

+24
-37
lines changed

deployments/Dockerfiles/tendermint/app.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import shutil
2626
import stat
2727
import traceback
28+
from logging.handlers import RotatingFileHandler
2829
from pathlib import Path
2930
from typing import Any, Callable, Dict, List, Optional, Tuple, cast
3031

@@ -38,6 +39,7 @@
3839
except ImportError:
3940
from tendermint import TendermintNode, TendermintParams # type: ignore
4041

42+
DEFAULT_LOG_FILE_MAX_BYTES = 50 * 1024 * 1024 # 50MB
4143
ENCODING = "utf-8"
4244
DEFAULT_LOG_FILE = "log.log"
4345
IS_DEV_MODE = os.environ.get("DEV_MODE", "0") == "1"
@@ -50,7 +52,6 @@
5052
TM_STATUS_ENDPOINT = "http://localhost:26657/status"
5153

5254
logging.basicConfig(
53-
filename=os.environ.get("LOG_FILE", DEFAULT_LOG_FILE),
5455
level=logging.DEBUG,
5556
format="%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s", # noqa : W1309
5657
)
@@ -195,6 +196,8 @@ def create_app( # pylint: disable=too-many-statements
195196
) -> Tuple[Flask, TendermintNode]:
196197
"""Create the Tendermint server app"""
197198
write_to_log = os.environ.get("WRITE_TO_LOG", "false").lower() == "true"
199+
log_file = os.environ.get("LOG_FILE", DEFAULT_LOG_FILE)
200+
198201
tendermint_params = TendermintParams(
199202
proxy_app=os.environ["PROXY_APP"],
200203
consensus_create_empty_blocks=os.environ["CREATE_EMPTY_BLOCKS"] == "true",
@@ -203,11 +206,23 @@ def create_app( # pylint: disable=too-many-statements
203206
)
204207

205208
app = Flask(__name__)
209+
app_logger = cast(logging.Logger, app.logger)
210+
211+
max_bytes = int(os.environ.get("LOG_FILE_MAX_BYTES", DEFAULT_LOG_FILE_MAX_BYTES))
212+
handler = RotatingFileHandler(log_file, maxBytes=max_bytes, backupCount=1)
213+
app_logger.addHandler(handler)
214+
215+
# if needed, tendermint logger can have a different configuration of handlers
216+
tendermint_logger = app_logger.getChild("tendermint")
217+
218+
if not write_to_log:
219+
tendermint_logger.removeHandler(handler)
220+
206221
period_dumper = PeriodDumper(logger=app.logger, dump_dir=dump_dir)
207222
tendermint_node = TendermintNode(
208223
tendermint_params,
209-
logger=app.logger,
210-
write_to_log=write_to_log,
224+
logger=tendermint_logger,
225+
write_to_log=False, # controlled by tendermint_logger
211226
)
212227
tendermint_node.init()
213228
override_config_toml()
@@ -238,18 +253,14 @@ def update_params() -> Dict:
238253

239254
try:
240255
data: Dict = json.loads(request.get_data().decode(ENCODING))
241-
cast(logging.Logger, app.logger).debug( # pylint: disable=no-member
256+
app_logger.debug( # pylint: disable=no-member
242257
f"Data update requested with data={data}"
243258
)
244259

245-
cast(logging.Logger, app.logger).info( # pylint: disable=no-member
246-
"Updating genesis config."
247-
)
260+
app_logger.info("Updating genesis config.") # pylint: disable=no-member
248261
update_genesis_config(data=data)
249262

250-
cast(logging.Logger, app.logger).info( # pylint: disable=no-member
251-
"Updating peristent peers."
252-
)
263+
app_logger.info("Updating peristent peers.") # pylint: disable=no-member
253264
config_path = Path(os.environ["TMHOME"]) / "config" / "config.toml"
254265
update_peers(
255266
validators=data["validators"],
@@ -318,13 +329,13 @@ def hard_reset() -> Tuple[Any, int]:
318329
@app.errorhandler(404) # type: ignore
319330
def handle_notfound(e: NotFound) -> Response:
320331
"""Handle server error."""
321-
cast(logging.Logger, app.logger).info(e) # pylint: disable=E
332+
app_logger.info(e) # pylint: disable=E
322333
return Response("Not Found", status=404, mimetype="application/json")
323334

324335
@app.errorhandler(500) # type: ignore
325336
def handle_server_error(e: InternalServerError) -> Response:
326337
"""Handle server error."""
327-
cast(logging.Logger, app.logger).info(e) # pylint: disable=E
338+
app_logger.info(e) # pylint: disable=E
328339
return Response("Error Closing Node", status=500, mimetype="application/json")
329340

330341
return app, tendermint_node

deployments/Dockerfiles/tendermint/tendermint.py

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@
2424
import platform
2525
import signal
2626
import subprocess # nosec:
27-
import sys
2827
from logging import Logger
29-
from logging.handlers import RotatingFileHandler
3028
from pathlib import Path
3129
from threading import Event, Thread
3230
from typing import Any, Dict, List, Optional
@@ -147,32 +145,18 @@ def __init__(
147145
self,
148146
params: TendermintParams,
149147
logger: Optional[Logger] = None,
150-
write_to_log: bool = False,
151148
):
152149
"""
153150
Initialize a Tendermint node.
154151
155152
:param params: the parameters.
156153
:param logger: the logger.
157-
:param write_to_log: Write to log file.
158154
"""
159155
self.params = params
160156
self._process: Optional[subprocess.Popen] = None
161157
self._monitoring: Optional[StoppableThread] = None
162158
self._stopping = False
163159
self.logger = logger or logging.getLogger()
164-
self.log_file = os.environ.get("LOG_FILE", DEFAULT_TENDERMINT_LOG_FILE)
165-
self.write_to_log = write_to_log
166-
167-
if self.write_to_log:
168-
max_bytes = int(
169-
os.environ.get("LOG_FILE_MAX_BYTES", DEFAULT_LOG_FILE_MAX_BYTES)
170-
)
171-
handler = RotatingFileHandler(
172-
self.log_file, maxBytes=max_bytes, backupCount=1
173-
)
174-
handler.setFormatter(logging.Formatter("%(message)s"))
175-
self.logger.addHandler(handler)
176160

177161
def _build_init_command(self) -> List[str]:
178162
"""Build the 'init' command."""
@@ -299,17 +283,9 @@ def stop(self) -> None:
299283
self._stop_tm_process()
300284
self._stop_monitoring_thread()
301285

302-
@staticmethod
303-
def _write_to_console(line: str) -> None:
304-
"""Write line to console."""
305-
sys.stdout.write(str(line))
306-
sys.stdout.flush()
307-
308286
def log(self, line: str) -> None:
309287
"""Open and write a line to the log file."""
310-
self._write_to_console(line=line)
311-
if self.write_to_log:
312-
self.logger.info(line.strip())
288+
self.logger.info(line.strip())
313289

314290
def prune_blocks(self) -> int:
315291
"""Prune blocks from the Tendermint state"""

0 commit comments

Comments
 (0)