2525import shutil
2626import stat
2727import traceback
28+ from logging .handlers import RotatingFileHandler
2829from pathlib import Path
2930from typing import Any , Callable , Dict , List , Optional , Tuple , cast
3031
3839except ImportError :
3940 from tendermint import TendermintNode , TendermintParams # type: ignore
4041
42+ DEFAULT_LOG_FILE_MAX_BYTES = 50 * 1024 * 1024 # 50MB
4143ENCODING = "utf-8"
4244DEFAULT_LOG_FILE = "log.log"
4345IS_DEV_MODE = os .environ .get ("DEV_MODE" , "0" ) == "1"
5052TM_STATUS_ENDPOINT = "http://localhost:26657/status"
5153
5254logging .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)
@@ -189,12 +190,14 @@ def dump_period(self) -> None:
189190 self .resets += 1
190191
191192
192- def create_app ( # pylint: disable=too-many-statements
193+ def create_app ( # pylint: disable=too-many-statements,too-many-locals
193194 dump_dir : Optional [Path ] = None ,
194195 debug : bool = False ,
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,22 @@ 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 ,
211225 )
212226 tendermint_node .init ()
213227 override_config_toml ()
@@ -238,18 +252,14 @@ def update_params() -> Dict:
238252
239253 try :
240254 data : Dict = json .loads (request .get_data ().decode (ENCODING ))
241- cast ( logging . Logger , app . logger ) .debug ( # pylint: disable=no-member
255+ app_logger .debug ( # pylint: disable=no-member
242256 f"Data update requested with data={ data } "
243257 )
244258
245- cast (logging .Logger , app .logger ).info ( # pylint: disable=no-member
246- "Updating genesis config."
247- )
259+ app_logger .info ("Updating genesis config." ) # pylint: disable=no-member
248260 update_genesis_config (data = data )
249261
250- cast (logging .Logger , app .logger ).info ( # pylint: disable=no-member
251- "Updating peristent peers."
252- )
262+ app_logger .info ("Updating peristent peers." ) # pylint: disable=no-member
253263 config_path = Path (os .environ ["TMHOME" ]) / "config" / "config.toml"
254264 update_peers (
255265 validators = data ["validators" ],
@@ -318,13 +328,13 @@ def hard_reset() -> Tuple[Any, int]:
318328 @app .errorhandler (404 ) # type: ignore
319329 def handle_notfound (e : NotFound ) -> Response :
320330 """Handle server error."""
321- cast ( logging . Logger , app . logger ) .info (e ) # pylint: disable=E
331+ app_logger .info (e ) # pylint: disable=E
322332 return Response ("Not Found" , status = 404 , mimetype = "application/json" )
323333
324334 @app .errorhandler (500 ) # type: ignore
325335 def handle_server_error (e : InternalServerError ) -> Response :
326336 """Handle server error."""
327- cast ( logging . Logger , app . logger ) .info (e ) # pylint: disable=E
337+ app_logger .info (e ) # pylint: disable=E
328338 return Response ("Error Closing Node" , status = 500 , mimetype = "application/json" )
329339
330340 return app , tendermint_node
0 commit comments