diff --git a/examples/advanced_logging/Cargo.toml b/examples/advanced_logging/Cargo.toml
new file mode 100644
index 00000000..7533781c
--- /dev/null
+++ b/examples/advanced_logging/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "advanced_logging"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+rclrs = "*"
+std_msgs = "*"
+anyhow = { version = "1", features = ["backtrace"] }
diff --git a/examples/advanced_logging/package.xml b/examples/advanced_logging/package.xml
new file mode 100644
index 00000000..c008721f
--- /dev/null
+++ b/examples/advanced_logging/package.xml
@@ -0,0 +1,19 @@
+
+
+
+ examples_rclrs_advanced_logging
+ 0.1.0
+ Package containing an advanced example of the logging mechanism in rclrs.
+ Antoine Van Malleghem
+ Apache License 2.0
+
+ rclrs
+ rosidl_runtime_rs
+ std_msgs
+
+
+ ament_cargo
+
+
\ No newline at end of file
diff --git a/examples/advanced_logging/src/main.rs b/examples/advanced_logging/src/main.rs
new file mode 100644
index 00000000..eb462e1a
--- /dev/null
+++ b/examples/advanced_logging/src/main.rs
@@ -0,0 +1,40 @@
+use anyhow::{Error, Result};
+use rclrs::*;
+use std::time::Duration;
+
+fn main() -> Result<(), Error> {
+ let context = Context::default_from_env()?;
+ let executor = context.create_basic_executor();
+
+ let node = executor.create_node("advanced_logger")?;
+
+ let publisher = node.create_publisher::("topic", QOS_PROFILE_DEFAULT)?;
+
+ let mut message = std_msgs::msg::String::default();
+
+ let mut publish_count: u32 = 1;
+
+ while context.ok() {
+ message.data = format!("Hello, world! {}", publish_count);
+ // log_fatal!(&node.name(), "Simple message from {}", node.name());
+ log!(
+ node.info().skip_first(),
+ "Publish every message but the first one: [{}]",
+ message.data
+ );
+ log!(
+ node.warn().throttle(Duration::from_millis(3000)),
+ "Publish with 3s throttling: [{}]",
+ message.data
+ );
+ log!(
+ node.error().only_if(publish_count % 10 == 0),
+ "Publishing every 10 messages: [{}]",
+ message.data
+ );
+ publisher.publish(&message)?;
+ publish_count += 1;
+ std::thread::sleep(std::time::Duration::from_millis(500));
+ }
+ Ok(())
+}