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
)
@@ -189,12 +190,14 @@ def dump_period(self) -> None:
189
190
self .resets += 1
190
191
191
192
192
- def create_app ( # pylint: disable=too-many-statements
193
+ def create_app ( # pylint: disable=too-many-statements,too-many-locals
193
194
dump_dir : Optional [Path ] = None ,
194
195
debug : bool = False ,
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,22 @@ 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 ,
211
225
)
212
226
tendermint_node .init ()
213
227
override_config_toml ()
@@ -238,18 +252,14 @@ def update_params() -> Dict:
238
252
239
253
try :
240
254
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
242
256
f"Data update requested with data={ data } "
243
257
)
244
258
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
248
260
update_genesis_config (data = data )
249
261
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
253
263
config_path = Path (os .environ ["TMHOME" ]) / "config" / "config.toml"
254
264
update_peers (
255
265
validators = data ["validators" ],
@@ -318,13 +328,13 @@ def hard_reset() -> Tuple[Any, int]:
318
328
@app .errorhandler (404 ) # type: ignore
319
329
def handle_notfound (e : NotFound ) -> Response :
320
330
"""Handle server error."""
321
- cast ( logging . Logger , app . logger ) .info (e ) # pylint: disable=E
331
+ app_logger .info (e ) # pylint: disable=E
322
332
return Response ("Not Found" , status = 404 , mimetype = "application/json" )
323
333
324
334
@app .errorhandler (500 ) # type: ignore
325
335
def handle_server_error (e : InternalServerError ) -> Response :
326
336
"""Handle server error."""
327
- cast ( logging . Logger , app . logger ) .info (e ) # pylint: disable=E
337
+ app_logger .info (e ) # pylint: disable=E
328
338
return Response ("Error Closing Node" , status = 500 , mimetype = "application/json" )
329
339
330
340
return app , tendermint_node
0 commit comments