|
22 | 22 | resolve_solution_pack_path, |
23 | 23 | ) |
24 | 24 | from xian_cli.models import ( |
| 25 | + SUPPORTED_APP_LOG_LEVELS, |
25 | 26 | SUPPORTED_BLOCK_POLICY_MODES, |
26 | 27 | SUPPORTED_RUNTIME_BACKENDS, |
27 | 28 | SUPPORTED_TRACER_MODES, |
@@ -554,6 +555,43 @@ def _handle_network_create(args: argparse.Namespace) -> int: |
554 | 555 | block_policy_mode=manifest.block_policy_mode, |
555 | 556 | block_policy_interval=manifest.block_policy_interval, |
556 | 557 | tracer_mode=manifest.tracer_mode, |
| 558 | + transaction_trace_logging=_pick_template_value( |
| 559 | + args.transaction_trace_logging, |
| 560 | + None |
| 561 | + if template is None |
| 562 | + else template.get("transaction_trace_logging"), |
| 563 | + False, |
| 564 | + ), |
| 565 | + app_log_level=_pick_template_value( |
| 566 | + args.app_log_level, |
| 567 | + None if template is None else template.get("app_log_level"), |
| 568 | + "INFO", |
| 569 | + ), |
| 570 | + app_log_json=_pick_template_value( |
| 571 | + args.app_log_json, |
| 572 | + None if template is None else template.get("app_log_json"), |
| 573 | + False, |
| 574 | + ), |
| 575 | + app_log_rotation_hours=_validate_positive_int( |
| 576 | + "app_log_rotation_hours", |
| 577 | + _pick_template_value( |
| 578 | + args.app_log_rotation_hours, |
| 579 | + None |
| 580 | + if template is None |
| 581 | + else template.get("app_log_rotation_hours"), |
| 582 | + 1, |
| 583 | + ), |
| 584 | + ), |
| 585 | + app_log_retention_days=_validate_positive_int( |
| 586 | + "app_log_retention_days", |
| 587 | + _pick_template_value( |
| 588 | + args.app_log_retention_days, |
| 589 | + None |
| 590 | + if template is None |
| 591 | + else template.get("app_log_retention_days"), |
| 592 | + 7, |
| 593 | + ), |
| 594 | + ), |
557 | 595 | simulation_enabled=_pick_template_value( |
558 | 596 | args.simulation_enabled, |
559 | 597 | None |
@@ -813,6 +851,43 @@ def _handle_network_join(args: argparse.Namespace) -> int: |
813 | 851 | None if template is None else template.get("tracer_mode"), |
814 | 852 | network.get("tracer_mode", "python_line_v1"), |
815 | 853 | ), |
| 854 | + transaction_trace_logging=_pick_template_value( |
| 855 | + args.transaction_trace_logging, |
| 856 | + None |
| 857 | + if template is None |
| 858 | + else template.get("transaction_trace_logging"), |
| 859 | + False, |
| 860 | + ), |
| 861 | + app_log_level=_pick_template_value( |
| 862 | + args.app_log_level, |
| 863 | + None if template is None else template.get("app_log_level"), |
| 864 | + "INFO", |
| 865 | + ), |
| 866 | + app_log_json=_pick_template_value( |
| 867 | + args.app_log_json, |
| 868 | + None if template is None else template.get("app_log_json"), |
| 869 | + False, |
| 870 | + ), |
| 871 | + app_log_rotation_hours=_validate_positive_int( |
| 872 | + "app_log_rotation_hours", |
| 873 | + _pick_template_value( |
| 874 | + args.app_log_rotation_hours, |
| 875 | + None |
| 876 | + if template is None |
| 877 | + else template.get("app_log_rotation_hours"), |
| 878 | + 1, |
| 879 | + ), |
| 880 | + ), |
| 881 | + app_log_retention_days=_validate_positive_int( |
| 882 | + "app_log_retention_days", |
| 883 | + _pick_template_value( |
| 884 | + args.app_log_retention_days, |
| 885 | + None |
| 886 | + if template is None |
| 887 | + else template.get("app_log_retention_days"), |
| 888 | + 7, |
| 889 | + ), |
| 890 | + ), |
816 | 891 | simulation_enabled=_pick_template_value( |
817 | 892 | args.simulation_enabled, |
818 | 893 | None if template is None else template.get("simulation_enabled"), |
@@ -1312,6 +1387,13 @@ def _initialize_node_from_args(args: argparse.Namespace) -> dict: |
1312 | 1387 | network.get("tracer_mode", "python_line_v1"), |
1313 | 1388 | ) |
1314 | 1389 | ), |
| 1390 | + transaction_trace_logging=bool( |
| 1391 | + profile.get("transaction_trace_logging", False) |
| 1392 | + ), |
| 1393 | + app_log_level=str(profile.get("app_log_level", "INFO")), |
| 1394 | + app_log_json=bool(profile.get("app_log_json", False)), |
| 1395 | + app_log_rotation_hours=int(profile.get("app_log_rotation_hours", 1)), |
| 1396 | + app_log_retention_days=int(profile.get("app_log_retention_days", 7)), |
1315 | 1397 | simulation_enabled=bool(profile.get("simulation_enabled", True)), |
1316 | 1398 | simulation_max_concurrency=int( |
1317 | 1399 | profile.get("simulation_max_concurrency", 2) |
@@ -2492,6 +2574,49 @@ def build_parser() -> argparse.ArgumentParser: |
2492 | 2574 | "template defaults" |
2493 | 2575 | ), |
2494 | 2576 | ) |
| 2577 | + create_parser.add_argument( |
| 2578 | + "--transaction-trace-logging", |
| 2579 | + action=argparse.BooleanOptionalAction, |
| 2580 | + default=None, |
| 2581 | + help=( |
| 2582 | + "emit per-transaction debug summaries in generated bootstrap " |
| 2583 | + "profiles; overrides template defaults" |
| 2584 | + ), |
| 2585 | + ) |
| 2586 | + create_parser.add_argument( |
| 2587 | + "--app-log-level", |
| 2588 | + choices=sorted(SUPPORTED_APP_LOG_LEVELS), |
| 2589 | + type=str, |
| 2590 | + help=( |
| 2591 | + "application log level for generated bootstrap profiles; " |
| 2592 | + "overrides template defaults" |
| 2593 | + ), |
| 2594 | + ) |
| 2595 | + create_parser.add_argument( |
| 2596 | + "--app-log-json", |
| 2597 | + action=argparse.BooleanOptionalAction, |
| 2598 | + default=None, |
| 2599 | + help=( |
| 2600 | + "emit structured JSON application logs in generated bootstrap " |
| 2601 | + "profiles; overrides template defaults" |
| 2602 | + ), |
| 2603 | + ) |
| 2604 | + create_parser.add_argument( |
| 2605 | + "--app-log-rotation-hours", |
| 2606 | + type=int, |
| 2607 | + help=( |
| 2608 | + "rotate application log files after this many hours in generated " |
| 2609 | + "bootstrap profiles; overrides template defaults" |
| 2610 | + ), |
| 2611 | + ) |
| 2612 | + create_parser.add_argument( |
| 2613 | + "--app-log-retention-days", |
| 2614 | + type=int, |
| 2615 | + help=( |
| 2616 | + "retain rotated application logs for this many days in generated " |
| 2617 | + "bootstrap profiles; overrides template defaults" |
| 2618 | + ), |
| 2619 | + ) |
2495 | 2620 | create_parser.add_argument( |
2496 | 2621 | "--simulation-enabled", |
2497 | 2622 | action=argparse.BooleanOptionalAction, |
@@ -2741,6 +2866,49 @@ def build_parser() -> argparse.ArgumentParser: |
2741 | 2866 | "manifest value" |
2742 | 2867 | ), |
2743 | 2868 | ) |
| 2869 | + join_parser.add_argument( |
| 2870 | + "--transaction-trace-logging", |
| 2871 | + action=argparse.BooleanOptionalAction, |
| 2872 | + default=None, |
| 2873 | + help=( |
| 2874 | + "optional node-local per-transaction debug logging override; " |
| 2875 | + "defaults to the template value" |
| 2876 | + ), |
| 2877 | + ) |
| 2878 | + join_parser.add_argument( |
| 2879 | + "--app-log-level", |
| 2880 | + choices=sorted(SUPPORTED_APP_LOG_LEVELS), |
| 2881 | + type=str, |
| 2882 | + help=( |
| 2883 | + "optional node-local application log level override; defaults " |
| 2884 | + "to the template value" |
| 2885 | + ), |
| 2886 | + ) |
| 2887 | + join_parser.add_argument( |
| 2888 | + "--app-log-json", |
| 2889 | + action=argparse.BooleanOptionalAction, |
| 2890 | + default=None, |
| 2891 | + help=( |
| 2892 | + "optional node-local structured JSON logging override; defaults " |
| 2893 | + "to the template value" |
| 2894 | + ), |
| 2895 | + ) |
| 2896 | + join_parser.add_argument( |
| 2897 | + "--app-log-rotation-hours", |
| 2898 | + type=int, |
| 2899 | + help=( |
| 2900 | + "optional node-local log rotation interval override in hours; " |
| 2901 | + "defaults to the template value" |
| 2902 | + ), |
| 2903 | + ) |
| 2904 | + join_parser.add_argument( |
| 2905 | + "--app-log-retention-days", |
| 2906 | + type=int, |
| 2907 | + help=( |
| 2908 | + "optional node-local log retention override in days; defaults " |
| 2909 | + "to the template value" |
| 2910 | + ), |
| 2911 | + ) |
2744 | 2912 | join_parser.add_argument( |
2745 | 2913 | "--simulation-enabled", |
2746 | 2914 | action=argparse.BooleanOptionalAction, |
|
0 commit comments