|
12 | 12 | // See the License for the specific language governing permissions and |
13 | 13 | // limitations under the License. |
14 | 14 |
|
15 | | -use crossbeam_channel::Receiver; |
| 15 | +use std::borrow::Cow; |
| 16 | +use std::sync::mpsc::Receiver; |
| 17 | +use std::time::SystemTime; |
| 18 | + |
16 | 19 | use logforth_core::Append; |
17 | 20 | use logforth_core::Diagnostic; |
18 | 21 | use logforth_core::Error; |
19 | 22 | use logforth_core::Trap; |
20 | 23 | use logforth_core::kv; |
| 24 | +use logforth_core::kv::KeyValues; |
21 | 25 | use logforth_core::kv::Visitor; |
| 26 | +use logforth_core::record::Level; |
| 27 | +use logforth_core::record::Record; |
22 | 28 |
|
23 | 29 | use crate::Task; |
24 | 30 |
|
@@ -56,7 +62,18 @@ impl Worker { |
56 | 62 | } else { |
57 | 63 | &[Box::new(OwnedDiagnostic(diags))] |
58 | 64 | }; |
59 | | - let record = record.as_record(); |
| 65 | + let payload = format_args!("{}", record.payload); |
| 66 | + let record = Record::builder() |
| 67 | + .time(record.now) |
| 68 | + .level(record.level) |
| 69 | + .target(record.target.as_ref()) |
| 70 | + .module_path(record.module_path.as_deref()) |
| 71 | + .file(record.file.as_deref()) |
| 72 | + .line(record.line) |
| 73 | + .column(record.column) |
| 74 | + .payload(payload) |
| 75 | + .key_values(KeyValues::from(record.kvs.as_slice())) |
| 76 | + .build(); |
60 | 77 | for append in appends.iter() { |
61 | 78 | if let Err(err) = append.append(&record, diags) { |
62 | 79 | let err = Error::new("failed to append record").with_source(err); |
@@ -93,3 +110,59 @@ impl Diagnostic for OwnedDiagnostic { |
93 | 110 | Ok(()) |
94 | 111 | } |
95 | 112 | } |
| 113 | + |
| 114 | +#[derive(Clone, Debug)] |
| 115 | +pub(crate) struct RecordOwned { |
| 116 | + // the observed time |
| 117 | + now: SystemTime, |
| 118 | + |
| 119 | + // the metadata |
| 120 | + level: Level, |
| 121 | + target: Cow<'static, str>, |
| 122 | + module_path: Option<Cow<'static, str>>, |
| 123 | + file: Option<Cow<'static, str>>, |
| 124 | + line: Option<u32>, |
| 125 | + column: Option<u32>, |
| 126 | + |
| 127 | + // the payload |
| 128 | + payload: Cow<'static, str>, |
| 129 | + |
| 130 | + // structural logging |
| 131 | + kvs: Vec<(kv::KeyOwned, kv::ValueOwned)>, |
| 132 | +} |
| 133 | + |
| 134 | +impl RecordOwned { |
| 135 | + pub fn from_record(record: &Record) -> Self { |
| 136 | + RecordOwned { |
| 137 | + now: record.time(), |
| 138 | + level: record.level(), |
| 139 | + target: if let Some(target) = record.target_static() { |
| 140 | + Cow::Borrowed(target) |
| 141 | + } else { |
| 142 | + Cow::Owned(record.target().to_string()) |
| 143 | + }, |
| 144 | + module_path: if let Some(module_path) = record.module_path_static() { |
| 145 | + Some(Cow::Borrowed(module_path)) |
| 146 | + } else { |
| 147 | + record.module_path().map(|s| Cow::Owned(s.to_string())) |
| 148 | + }, |
| 149 | + file: if let Some(file) = record.file_static() { |
| 150 | + Some(Cow::Borrowed(file)) |
| 151 | + } else { |
| 152 | + record.file().map(|s| Cow::Owned(s.to_string())) |
| 153 | + }, |
| 154 | + line: record.line(), |
| 155 | + column: record.column(), |
| 156 | + payload: if let Some(payload) = record.payload_static() { |
| 157 | + Cow::Borrowed(payload) |
| 158 | + } else { |
| 159 | + Cow::Owned(record.payload().to_string()) |
| 160 | + }, |
| 161 | + kvs: record |
| 162 | + .key_values() |
| 163 | + .iter() |
| 164 | + .map(|(k, v)| (k.to_owned(), v.to_owned())) |
| 165 | + .collect(), |
| 166 | + } |
| 167 | + } |
| 168 | +} |
0 commit comments