All checks were successful
continuous-integration/drone/push Build is passing
59 lines
1.4 KiB
Rust
59 lines
1.4 KiB
Rust
use crate::app_config::AppConfig;
|
|
use crate::devices::device::DeviceId;
|
|
use crate::logs::log_entry::LogEntry;
|
|
use crate::logs::severity::LogSeverity;
|
|
use crate::utils::time_utils::{curr_day_number, time_secs};
|
|
use fs4::fs_std::FileExt;
|
|
use std::fs::OpenOptions;
|
|
use std::io::{Seek, SeekFrom, Write};
|
|
|
|
pub fn save_log(
|
|
device: Option<&DeviceId>,
|
|
severity: LogSeverity,
|
|
message: String,
|
|
) -> anyhow::Result<()> {
|
|
let log_path = AppConfig::get().log_of_day(curr_day_number());
|
|
|
|
let mut file = OpenOptions::new()
|
|
.append(true)
|
|
.create(true)
|
|
.open(&log_path)?;
|
|
|
|
file.lock_exclusive()?;
|
|
file.seek(SeekFrom::End(0))?;
|
|
file.write_all(
|
|
format!(
|
|
"{}\n",
|
|
(LogEntry {
|
|
device_id: device.cloned(),
|
|
time: time_secs(),
|
|
severity,
|
|
message,
|
|
})
|
|
.serialize()?
|
|
)
|
|
.as_bytes(),
|
|
)?;
|
|
file.flush()?;
|
|
fs4::fs_std::FileExt::unlock(&file)?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Make a logs extraction
|
|
pub fn get_logs(day: u64) -> anyhow::Result<Vec<LogEntry>> {
|
|
let file = AppConfig::get().log_of_day(day);
|
|
|
|
if !file.exists() {
|
|
return Ok(Vec::new());
|
|
}
|
|
|
|
let content = std::fs::read_to_string(file)?
|
|
.split('\n')
|
|
.filter(|l| !l.is_empty())
|
|
.map(serde_json::from_str)
|
|
.collect::<Result<Vec<_>, _>>()?;
|
|
|
|
Ok(content)
|
|
}
|