|
2 | 2 | // Licensed under the MIT License.
|
3 | 3 |
|
4 | 4 | use jsonschema::JSONSchema;
|
| 5 | +use serde::Deserialize; |
5 | 6 | use serde_json::Value;
|
6 | 7 | use std::{collections::HashMap, env, process::Stdio};
|
7 | 8 | use crate::configure::{config_doc::ExecutionKind, config_result::{ResourceGetResult, ResourceTestResult}};
|
@@ -815,26 +816,114 @@ pub fn log_stderr_line<'a>(process_id: &u32, trace_line: &'a str) -> &'a str
|
815 | 816 | {
|
816 | 817 | if !trace_line.is_empty()
|
817 | 818 | {
|
818 |
| - if let Result::Ok(json_obj) = serde_json::from_str::<Value>(trace_line) { |
| 819 | + if let Ok(trace_object) = serde_json::from_str::<Trace>(trace_line) { |
| 820 | + let mut include_target = trace_object.level == TraceLevel::Debug || trace_object.level == TraceLevel::Trace; |
| 821 | + let target = if let Some(t) = trace_object.target.as_deref() { t } else { |
| 822 | + include_target = false; |
| 823 | + "" |
| 824 | + }; |
| 825 | + let line_number = if let Some(l) = trace_object.line_number { l } else { |
| 826 | + include_target = false; |
| 827 | + 0 |
| 828 | + }; |
| 829 | + match trace_object.level { |
| 830 | + TraceLevel::Error => { |
| 831 | + if include_target { |
| 832 | + error!("Process {process_id}: {target}: {line_number}: {}", trace_object.fields.message); |
| 833 | + } |
| 834 | + else { |
| 835 | + error!("Process {process_id}: {}", trace_object.fields.message); |
| 836 | + } |
| 837 | + }, |
| 838 | + TraceLevel::Warning => { |
| 839 | + if include_target { |
| 840 | + warn!("Process {process_id}: {target}: {line_number}: {}", trace_object.fields.message); |
| 841 | + } |
| 842 | + else { |
| 843 | + warn!("Process {process_id}: {}", trace_object.fields.message); |
| 844 | + } |
| 845 | + }, |
| 846 | + TraceLevel::Info => { |
| 847 | + if include_target { |
| 848 | + info!("Process {process_id}: {target}: {line_number}: {}", trace_object.fields.message); |
| 849 | + } |
| 850 | + else { |
| 851 | + info!("Process {process_id}: {}", trace_object.fields.message); |
| 852 | + } |
| 853 | + }, |
| 854 | + TraceLevel::Debug => { |
| 855 | + if include_target { |
| 856 | + debug!("Process {process_id}: {target}: {line_number}: {}", trace_object.fields.message); |
| 857 | + } |
| 858 | + else { |
| 859 | + debug!("Process {process_id}: {}", trace_object.fields.message); |
| 860 | + } |
| 861 | + }, |
| 862 | + TraceLevel::Trace => { |
| 863 | + if include_target { |
| 864 | + trace!("Process {process_id}: {target}: {line_number}: {}", trace_object.fields.message); |
| 865 | + } |
| 866 | + else { |
| 867 | + trace!("Process {process_id}: {}", trace_object.fields.message); |
| 868 | + } |
| 869 | + }, |
| 870 | + } |
| 871 | + } |
| 872 | + else if let Ok(json_obj) = serde_json::from_str::<Value>(trace_line) { |
819 | 873 | if let Some(msg) = json_obj.get("Error") {
|
820 |
| - error!("Process id {process_id} : {}", msg.as_str().unwrap_or_default()); |
| 874 | + error!("Process {process_id}: {}", msg.as_str().unwrap_or_default()); |
821 | 875 | } else if let Some(msg) = json_obj.get("Warning") {
|
822 |
| - warn!("Process id {process_id} : {}", msg.as_str().unwrap_or_default()); |
| 876 | + warn!("Process {process_id}: {}", msg.as_str().unwrap_or_default()); |
823 | 877 | } else if let Some(msg) = json_obj.get("Info") {
|
824 |
| - info!("Process id {process_id} : {}", msg.as_str().unwrap_or_default()); |
| 878 | + info!("Process {process_id}: {}", msg.as_str().unwrap_or_default()); |
825 | 879 | } else if let Some(msg) = json_obj.get("Debug") {
|
826 |
| - debug!("Process id {process_id} : {}", msg.as_str().unwrap_or_default()); |
| 880 | + debug!("Process {process_id}: {}", msg.as_str().unwrap_or_default()); |
827 | 881 | } else if let Some(msg) = json_obj.get("Trace") {
|
828 |
| - trace!("Process id {process_id} : {}", msg.as_str().unwrap_or_default()); |
| 882 | + trace!("Process {process_id}: {}", msg.as_str().unwrap_or_default()); |
829 | 883 | } else {
|
830 | 884 | // the line is a valid json, but not one of standard trace lines - return it as filtered stderr_line
|
| 885 | + trace!("Process {process_id}: {trace_line}"); |
831 | 886 | return trace_line;
|
832 | 887 | };
|
833 | 888 | } else {
|
834 | 889 | // the line is not a valid json - return it as filtered stderr_line
|
| 890 | + trace!("Process {process_id}: {}", trace_line); |
835 | 891 | return trace_line;
|
836 | 892 | }
|
837 | 893 | };
|
838 | 894 |
|
839 | 895 | ""
|
840 | 896 | }
|
| 897 | + |
| 898 | +#[derive(PartialEq, Eq, Deserialize)] |
| 899 | +enum TraceLevel { |
| 900 | + #[serde(rename = "ERROR")] |
| 901 | + Error, |
| 902 | + #[serde(rename = "WARN")] |
| 903 | + Warning, |
| 904 | + #[serde(rename = "INFO")] |
| 905 | + Info, |
| 906 | + #[serde(rename = "DEBUG")] |
| 907 | + Debug, |
| 908 | + #[serde(rename = "TRACE")] |
| 909 | + Trace, |
| 910 | +} |
| 911 | + |
| 912 | +#[derive(Deserialize)] |
| 913 | +struct Fields { |
| 914 | + message: String, |
| 915 | +} |
| 916 | + |
| 917 | +#[derive(Deserialize)] |
| 918 | +struct Trace { |
| 919 | + #[serde(rename = "timestamp")] |
| 920 | + _timestamp: String, |
| 921 | + level: TraceLevel, |
| 922 | + fields: Fields, |
| 923 | + target: Option<String>, |
| 924 | + line_number: Option<u32>, |
| 925 | + #[serde(rename = "span")] |
| 926 | + _span: Option<HashMap<String, Value>>, |
| 927 | + #[serde(rename = "spans")] |
| 928 | + _spans: Option<Vec<HashMap<String, Value>>>, |
| 929 | +} |
0 commit comments