25
25
import shutil
26
26
import stat
27
27
import traceback
28
+ from logging .handlers import RotatingFileHandler
28
29
from pathlib import Path
29
30
from typing import Any , Callable , Dict , List , Optional , Tuple , cast
30
31
38
39
except ImportError :
39
40
from tendermint import TendermintNode , TendermintParams # type: ignore
40
41
42
+ DEFAULT_LOG_FILE_MAX_BYTES = 50 * 1024 * 1024 # 50MB
41
43
ENCODING = "utf-8"
42
44
DEFAULT_LOG_FILE = "log.log"
43
45
IS_DEV_MODE = os .environ .get ("DEV_MODE" , "0" ) == "1"
50
52
TM_STATUS_ENDPOINT = "http://localhost:26657/status"
51
53
52
54
logging .basicConfig (
53
- filename = os .environ .get ("LOG_FILE" , DEFAULT_LOG_FILE ),
54
55
level = logging .DEBUG ,
55
56
format = "%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s" , # noqa : W1309
56
57
)
@@ -195,6 +196,8 @@ def create_app( # pylint: disable=too-many-statements
195
196
) -> Tuple [Flask , TendermintNode ]:
196
197
"""Create the Tendermint server app"""
197
198
write_to_log = os .environ .get ("WRITE_TO_LOG" , "false" ).lower () == "true"
199
+ log_file = os .environ .get ("LOG_FILE" , DEFAULT_LOG_FILE )
200
+
198
201
tendermint_params = TendermintParams (
199
202
proxy_app = os .environ ["PROXY_APP" ],
200
203
consensus_create_empty_blocks = os .environ ["CREATE_EMPTY_BLOCKS" ] == "true" ,
@@ -203,11 +206,23 @@ def create_app( # pylint: disable=too-many-statements
203
206
)
204
207
205
208
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
+
206
221
period_dumper = PeriodDumper (logger = app .logger , dump_dir = dump_dir )
207
222
tendermint_node = TendermintNode (
208
223
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
211
226
)
212
227
tendermint_node .init ()
213
228
override_config_toml ()
@@ -238,18 +253,14 @@ def update_params() -> Dict:
238
253
239
254
try :
240
255
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
242
257
f"Data update requested with data={ data } "
243
258
)
244
259
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
248
261
update_genesis_config (data = data )
249
262
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
253
264
config_path = Path (os .environ ["TMHOME" ]) / "config" / "config.toml"
254
265
update_peers (
255
266
validators = data ["validators" ],
@@ -318,13 +329,13 @@ def hard_reset() -> Tuple[Any, int]:
318
329
@app .errorhandler (404 ) # type: ignore
319
330
def handle_notfound (e : NotFound ) -> Response :
320
331
"""Handle server error."""
321
- cast ( logging . Logger , app . logger ) .info (e ) # pylint: disable=E
332
+ app_logger .info (e ) # pylint: disable=E
322
333
return Response ("Not Found" , status = 404 , mimetype = "application/json" )
323
334
324
335
@app .errorhandler (500 ) # type: ignore
325
336
def handle_server_error (e : InternalServerError ) -> Response :
326
337
"""Handle server error."""
327
- cast ( logging . Logger , app . logger ) .info (e ) # pylint: disable=E
338
+ app_logger .info (e ) # pylint: disable=E
328
339
return Response ("Error Closing Node" , status = 500 , mimetype = "application/json" )
329
340
330
341
return app , tendermint_node
0 commit comments