Skip to content

Commit 4acdc3b

Browse files
committed
Add a command audit log
Signed-off-by: Didier Wenzek <didier.wenzek@free.fr>
1 parent 951de34 commit 4acdc3b

File tree

9 files changed

+60
-15
lines changed

9 files changed

+60
-15
lines changed

Cargo.lock

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ tokio-util = { version = "0.7", features = ["codec"] }
181181
toml = "0.8"
182182
tower = "0.4"
183183
tracing = { version = "0.1", features = ["attributes", "log"] }
184+
tracing-appender = "0.2"
184185
tracing-subscriber = { version = "0.3", features = ["time", "env-filter"] }
185186
try-traits = "0.1"
186187
tungstenite = "0.20"

crates/common/tedge_config/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ tedge_utils = { workspace = true, features = ["timestamp"] }
3434
thiserror = { workspace = true }
3535
toml = { workspace = true }
3636
tracing = { workspace = true }
37+
tracing-appender = { workspace = true }
3738
tracing-subscriber = { workspace = true }
3839
url = { workspace = true }
3940
which = { workspace = true }

crates/common/tedge_config/src/system_services/log_config.rs

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ use crate::system_services::SystemConfig;
55
use crate::system_services::SystemServiceError;
66
use std::io::IsTerminal;
77
use std::str::FromStr;
8+
use tracing::metadata::LevelFilter;
9+
use tracing_subscriber::filter::filter_fn;
10+
use tracing_subscriber::layer::SubscriberExt;
11+
use tracing_subscriber::util::SubscriberInitExt;
12+
use tracing_subscriber::Layer;
813

914
/// Configures and enables logging taking into account flags, env variables and file config.
1015
///
@@ -19,7 +24,8 @@ pub fn log_init(
1924
flags: &LogConfigArgs,
2025
config_dir: &Utf8Path,
2126
) -> Result<(), SystemServiceError> {
22-
let subscriber = tracing_subscriber::fmt()
27+
// General logging
28+
let log_layer = tracing_subscriber::fmt::layer()
2329
.with_writer(std::io::stderr)
2430
.with_ansi(std::io::stderr().is_terminal())
2531
.with_timer(tracing_subscriber::fmt::time::UtcTime::rfc_3339());
@@ -28,22 +34,35 @@ pub fn log_init(
2834
.log_level
2935
.or(flags.debug.then_some(tracing::Level::DEBUG));
3036

31-
if let Some(log_level) = log_level {
32-
subscriber.with_max_level(log_level).init();
33-
return Ok(());
34-
}
35-
36-
if std::env::var("RUST_LOG").is_ok() {
37-
subscriber
38-
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
37+
let log_layer = if let Some(log_level) = log_level {
38+
log_layer
39+
.with_filter(LevelFilter::from_level(log_level))
40+
.boxed()
41+
} else if std::env::var("RUST_LOG").is_ok() {
42+
log_layer
3943
.with_file(true)
4044
.with_line_number(true)
41-
.init();
42-
return Ok(());
43-
}
44-
45-
let log_level = get_log_level(sname, config_dir)?;
46-
subscriber.with_max_level(log_level).init();
45+
.with_filter(tracing_subscriber::EnvFilter::from_default_env())
46+
.boxed()
47+
} else {
48+
let log_level = get_log_level(sname, config_dir)?;
49+
log_layer
50+
.with_filter(LevelFilter::from_level(log_level))
51+
.boxed()
52+
};
53+
54+
// Audit journal
55+
let audit_appender = tracing_appender::rolling::hourly("/tmp", "tedge.audit.log");
56+
let audit_layer = tracing_subscriber::fmt::layer()
57+
.with_writer(audit_appender)
58+
.with_timer(tracing_subscriber::fmt::time::UtcTime::rfc_3339())
59+
.with_filter(LevelFilter::INFO)
60+
.with_filter(filter_fn(|metadata| metadata.target() == "Audit"));
61+
62+
tracing_subscriber::registry()
63+
.with(audit_layer)
64+
.with(log_layer)
65+
.init();
4766

4867
Ok(())
4968
}

crates/core/tedge/src/cli/config/commands/add.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ impl Command for AddConfigCommand {
2525
.map_err(|e| e.into())
2626
})
2727
.map_err(anyhow::Error::new)?;
28+
tracing::info!(target: "Audit", "tedge config add {} {}", &self.key, &self.value);
2829
Ok(())
2930
}
3031
}

crates/core/tedge/src/cli/config/commands/remove.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ impl Command for RemoveConfigCommand {
2121
.map_err(|e| e.into())
2222
})
2323
.map_err(anyhow::Error::new)?;
24+
tracing::info!(target: "Audit", "tedge config remove {} {}", &self.key, &self.value);
2425
Ok(())
2526
}
2627
}

crates/core/tedge/src/cli/config/commands/set.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ impl Command for SetConfigCommand {
2525
.map_err(|e| e.into())
2626
})
2727
.map_err(anyhow::Error::new)?;
28+
tracing::info!(target: "Audit", "tedge config set {} {}", &self.key, &self.value);
2829
Ok(())
2930
}
3031
}

crates/core/tedge/src/cli/config/commands/unset.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ impl Command for UnsetConfigCommand {
1717
self.config_location
1818
.update_toml(&|dto, _reader| Ok(dto.try_unset_key(&self.key)?))
1919
.map_err(anyhow::Error::new)?;
20+
tracing::info!(target: "Audit", "tedge config unset {}", &self.key);
2021
Ok(())
2122
}
2223
}

crates/core/tedge_agent/src/operation_workflows/actor.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ impl Actor for WorkflowActor {
6565
}
6666

6767
async fn run(mut self) -> Result<(), RuntimeError> {
68+
tracing::info!(target: "Audit", "tedge-agent started");
6869
self.workflow_repository.load().await;
6970
self.publish_operation_capabilities().await?;
7071
self.load_command_board().await?;
@@ -95,11 +96,15 @@ impl Actor for WorkflowActor {
9596
)
9697
.await
9798
{
99+
tracing::info!(target: "Audit", "Updated capability {}",
100+
updated_capability.topic.as_ref(),
101+
);
98102
self.mqtt_publisher.send(updated_capability).await?
99103
}
100104
}
101105
}
102106
}
107+
tracing::info!(target: "Audit", "tedge-agent stopped");
103108
Ok(())
104109
}
105110
}
@@ -159,6 +164,7 @@ impl WorkflowActor {
159164
Ok(Some(new_state)) => {
160165
self.persist_command_board().await?;
161166
if new_state.is_init() {
167+
tracing::info!(target: "Audit", "Execute {operation} command");
162168
self.process_command_update(new_state.with_log_path(&log_file.path))
163169
.await?;
164170
}
@@ -211,6 +217,7 @@ impl WorkflowActor {
211217

212218
match action {
213219
OperationAction::Clear => {
220+
tracing::info!(target: "Audit", "{} {operation} command", if state.is_successful() {"Executed"} else { "Failed"});
214221
if let Some(invoking_command) =
215222
self.workflow_repository.invoking_command_state(&state)
216223
{

0 commit comments

Comments
 (0)