|
@@ -13,21 +13,23 @@
|
|
|
//!
|
|
|
//! ```no_run
|
|
|
//! # let mut bpf = aya::Bpf::load(&[], None)?;
|
|
|
-//! use aya_log::BpfLogger;
|
|
|
//! use simplelog::{ColorChoice, ConfigBuilder, LevelFilter, TermLogger, TerminalMode};
|
|
|
+//! use aya_log::BpfLogger;
|
|
|
//!
|
|
|
-//! BpfLogger::init(
|
|
|
-//! &mut bpf,
|
|
|
-//! TermLogger::new(
|
|
|
-//! LevelFilter::Trace,
|
|
|
-//! ConfigBuilder::new()
|
|
|
-//! .set_target_level(LevelFilter::Error)
|
|
|
-//! .set_location_level(LevelFilter::Error)
|
|
|
-//! .build(),
|
|
|
-//! TerminalMode::Mixed,
|
|
|
-//! ColorChoice::Auto,
|
|
|
-//! ),
|
|
|
-//! ).unwrap();
|
|
|
+//! // initialize simplelog::TermLogger as the default logger
|
|
|
+//! TermLogger::init(
|
|
|
+//! LevelFilter::Debug,
|
|
|
+//! ConfigBuilder::new()
|
|
|
+//! .set_target_level(LevelFilter::Error)
|
|
|
+//! .set_location_level(LevelFilter::Error)
|
|
|
+//! .build(),
|
|
|
+//! TerminalMode::Mixed,
|
|
|
+//! ColorChoice::Auto,
|
|
|
+//! )
|
|
|
+//! .unwrap();
|
|
|
+//!
|
|
|
+//! // start reading aya-log records and log them using the default logger
|
|
|
+//! BpfLogger::init(&mut bpf).unwrap();
|
|
|
//! ```
|
|
|
//!
|
|
|
//! With the following eBPF code:
|
|
@@ -61,7 +63,7 @@ use std::{convert::TryInto, io, mem, ptr, sync::Arc};
|
|
|
|
|
|
use aya_log_common::{RecordField, LOG_BUF_CAPACITY, LOG_FIELDS};
|
|
|
use bytes::BytesMut;
|
|
|
-use log::{Level, Log, Record};
|
|
|
+use log::{logger, Level, Log, Record};
|
|
|
use thiserror::Error;
|
|
|
|
|
|
use aya::{
|
|
@@ -79,9 +81,18 @@ use aya::{
|
|
|
pub struct BpfLogger;
|
|
|
|
|
|
impl BpfLogger {
|
|
|
+ /// Starts reading log records created with `aya-log-ebpf` and logs them
|
|
|
+ /// with the default logger. See [log::logger].
|
|
|
+ pub fn init(bpf: &mut Bpf) -> Result<BpfLogger, Error> {
|
|
|
+ BpfLogger::init_with_logger(bpf, DefaultLogger {})
|
|
|
+ }
|
|
|
+
|
|
|
/// Starts reading log records created with `aya-log-ebpf` and logs them
|
|
|
/// with the given logger.
|
|
|
- pub fn init<T: Log + 'static>(bpf: &mut Bpf, logger: T) -> Result<BpfLogger, Error> {
|
|
|
+ pub fn init_with_logger<T: Log + 'static>(
|
|
|
+ bpf: &mut Bpf,
|
|
|
+ logger: T,
|
|
|
+ ) -> Result<BpfLogger, Error> {
|
|
|
let logger = Arc::new(logger);
|
|
|
let mut logs: AsyncPerfEventArray<_> = bpf.map_mut("AYA_LOGS")?.try_into()?;
|
|
|
|
|
@@ -110,6 +121,23 @@ impl BpfLogger {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#[derive(Copy, Clone, Debug)]
|
|
|
+struct DefaultLogger;
|
|
|
+
|
|
|
+impl Log for DefaultLogger {
|
|
|
+ fn enabled(&self, metadata: &log::Metadata) -> bool {
|
|
|
+ log::logger().enabled(metadata)
|
|
|
+ }
|
|
|
+
|
|
|
+ fn log(&self, record: &Record) {
|
|
|
+ log::logger().log(record)
|
|
|
+ }
|
|
|
+
|
|
|
+ fn flush(&self) {
|
|
|
+ log::logger().flush()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#[derive(Error, Debug)]
|
|
|
pub enum Error {
|
|
|
#[error("error opening log event array")]
|