Skip to content

Commit 56aab7c

Browse files
authored
Add file and line num to log messages (#3782)
This commit adds a `slog::KV` implementation to `omicron_common` that can be plugged into any root slog logger to append file and line number information to all log entries. An example log message looks like the following: ``` Jul 27 22:19:44.139 WARN Connection error: Close, remote_peer_id: pc-a-1, peer_id: pc-b-1, subcomponent: bootstore, file: bootstore/src/schemes/v0/peer_networking.rs:216 ``` This logging support was then added to a bunch of existing servers.
1 parent 7793dd7 commit 56aab7c

File tree

10 files changed

+43
-11
lines changed

10 files changed

+43
-11
lines changed

common/src/lib.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,28 @@ macro_rules! generate_logging_api {
5050
);
5151
};
5252
}
53+
54+
/// A type that allows adding file and line numbers to log messages
55+
/// automatically. It should be instantiated at the root logger of each
56+
/// executable that desires this functionality, as in the following example.
57+
/// ```ignore
58+
/// slog::Logger::root(drain, o!(FileKv))
59+
/// ```
60+
pub struct FileKv;
61+
62+
impl slog::KV for FileKv {
63+
fn serialize(
64+
&self,
65+
record: &slog::Record,
66+
serializer: &mut dyn slog::Serializer,
67+
) -> slog::Result {
68+
// Only log file information when severity is at least info level
69+
if record.level() > slog::Level::Info {
70+
return Ok(());
71+
}
72+
serializer.emit_arguments(
73+
"file".into(),
74+
&format_args!("{}:{}", record.file(), record.line()),
75+
)
76+
}
77+
}

gateway/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub use management_switch::SpIdentifier;
2525
pub use management_switch::SpType;
2626
pub use management_switch::SwitchPortConfig;
2727
pub use management_switch::SwitchPortDescription;
28+
use omicron_common::FileKv;
2829

2930
use dropshot::ConfigDropshot;
3031
use dropshot::HandlerTaskMode;
@@ -302,7 +303,7 @@ pub async fn start_server(
302303
.to_logger("gateway")
303304
.map_err(|message| format!("initializing logger: {}", message))?,
304305
);
305-
let log = slog::Logger::root(drain.fuse(), slog::o!());
306+
let log = slog::Logger::root(drain.fuse(), slog::o!(FileKv));
306307
if let slog_dtrace::ProbeRegistration::Failed(e) = registration {
307308
let msg = format!("failed to register DTrace probes: {}", e);
308309
error!(log, "{}", msg);

installinator/src/dispatch.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use installinator_common::{
1313
InstallinatorStepId, StepContext, StepHandle, StepProgress, StepSuccess,
1414
StepWarning, UpdateEngine,
1515
};
16+
use omicron_common::FileKv;
1617
use omicron_common::{
1718
api::internal::nexus::KnownArtifactKind,
1819
update::{ArtifactHash, ArtifactHashId, ArtifactKind},
@@ -66,7 +67,7 @@ impl InstallinatorApp {
6667

6768
let drain = slog::Duplicate::new(file_drain, stderr_drain).fuse();
6869
let drain = slog_async::Async::new(drain).build().fuse();
69-
Ok(slog::Logger::root(drain, slog::o!()))
70+
Ok(slog::Logger::root(drain, slog::o!(FileKv)))
7071
}
7172
}
7273

nexus/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ use omicron_common::address::IpRange;
3434
use omicron_common::api::internal::shared::{
3535
ExternalPortDiscovery, SwitchLocation,
3636
};
37+
use omicron_common::FileKv;
3738
use slog::Logger;
3839
use std::collections::HashMap;
3940
use std::net::{SocketAddr, SocketAddrV6};
@@ -311,7 +312,7 @@ pub async fn run_server(config: &Config) -> Result<(), String> {
311312
format!("initializing logger: {}", message)
312313
})?,
313314
);
314-
let log = slog::Logger::root(drain.fuse(), slog::o!());
315+
let log = slog::Logger::root(drain.fuse(), slog::o!(FileKv));
315316
if let slog_dtrace::ProbeRegistration::Failed(e) = registration {
316317
let msg = format!("failed to register DTrace probes: {}", e);
317318
error!(log, "{}", msg);

oximeter/collector/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use internal_dns::resolver::{ResolveError, Resolver};
1515
use internal_dns::ServiceName;
1616
use omicron_common::address::{CLICKHOUSE_PORT, NEXUS_INTERNAL_PORT};
1717
use omicron_common::api::internal::nexus::ProducerEndpoint;
18-
use omicron_common::backoff;
18+
use omicron_common::{backoff, FileKv};
1919
use oximeter::types::{ProducerResults, ProducerResultsItem};
2020
use oximeter_db::{Client, DbWrite};
2121
use serde::{Deserialize, Serialize};
@@ -472,7 +472,7 @@ impl Oximeter {
472472
log: Logger,
473473
) -> Result<Self, Error> {
474474
let (drain, registration) = slog_dtrace::with_drain(log);
475-
let log = slog::Logger::root(drain.fuse(), o!());
475+
let log = slog::Logger::root(drain.fuse(), o!(FileKv));
476476
if let slog_dtrace::ProbeRegistration::Failed(e) = registration {
477477
let msg = format!("failed to register DTrace probes: {}", e);
478478
error!(log, "{}", msg);

oximeter/producer/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use dropshot::HttpServerStarter;
1717
use dropshot::Path;
1818
use dropshot::RequestContext;
1919
use omicron_common::api::internal::nexus::ProducerEndpoint;
20+
use omicron_common::FileKv;
2021
use oximeter::types::ProducerRegistry;
2122
use oximeter::types::ProducerResults;
2223
use schemars::JsonSchema;
@@ -95,7 +96,7 @@ impl Server {
9596
LogConfig::Logger(log) => log.clone(),
9697
};
9798
let (drain, registration) = slog_dtrace::with_drain(base_logger);
98-
let log = Logger::root(drain.fuse(), slog::o!());
99+
let log = Logger::root(drain.fuse(), slog::o!(FileKv));
99100
if let slog_dtrace::ProbeRegistration::Failed(e) = registration {
100101
let msg = format!("failed to register DTrace probes: {}", e);
101102
error!(log, "failed to register DTrace probes: {}", e);

sled-agent/src/bootstrap/server.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use super::views::ResponseEnvelope;
1414
use crate::bootstrap::http_entrypoints::api as http_api;
1515
use crate::bootstrap::maghemite;
1616
use crate::config::Config as SledConfig;
17+
use omicron_common::FileKv;
1718
use sled_hardware::underlay;
1819
use slog::Drain;
1920
use slog::Logger;
@@ -44,7 +45,7 @@ impl Server {
4445
format!("initializing logger: {}", message)
4546
})?,
4647
);
47-
let log = slog::Logger::root(drain.fuse(), slog::o!());
48+
let log = slog::Logger::root(drain.fuse(), slog::o!(FileKv));
4849
if let slog_dtrace::ProbeRegistration::Failed(e) = registration {
4950
let msg = format!("Failed to register DTrace probes: {}", e);
5051
error!(log, "{}", msg);

sled-agent/src/sim/server.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use omicron_common::backoff::{
2222
retry_notify, retry_policy_internal_service_aggressive, BackoffError,
2323
};
2424
use omicron_common::nexus_config::NUM_INITIAL_RESERVED_IP_ADDRESSES;
25+
use omicron_common::FileKv;
2526
use slog::{info, Drain, Logger};
2627
use std::collections::HashMap;
2728
use std::net::IpAddr;
@@ -269,7 +270,7 @@ pub async fn run_standalone_server(
269270
.to_logger("sled-agent")
270271
.map_err(|message| anyhow!("initializing logger: {}", message))?,
271272
);
272-
let log = slog::Logger::root(drain.fuse(), slog::o!());
273+
let log = slog::Logger::root(drain.fuse(), slog::o!(FileKv));
273274
if let slog_dtrace::ProbeRegistration::Failed(e) = registration {
274275
let msg = format!("failed to register DTrace probes: {}", e);
275276
error!(log, "{}", msg);

wicket/src/dispatch.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::net::{Ipv6Addr, SocketAddrV6};
99
use anyhow::{bail, Context, Result};
1010
use camino::{Utf8Path, Utf8PathBuf};
1111
use clap::Parser;
12-
use omicron_common::address::WICKETD_PORT;
12+
use omicron_common::{address::WICKETD_PORT, FileKv};
1313
use slog::Drain;
1414

1515
use crate::{rack_setup::SetupArgs, upload::UploadArgs, Runner};
@@ -81,7 +81,7 @@ fn setup_log(
8181
WithStderr::No => slog_async::Async::new(drain).build().fuse(),
8282
};
8383

84-
Ok(slog::Logger::root(drain, slog::o!()))
84+
Ok(slog::Logger::root(drain, slog::o!(FileKv)))
8585
}
8686

8787
#[derive(Copy, Clone, Debug)]

wicketd/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub use installinator_progress::{IprUpdateTracker, RunningUpdateState};
2222
pub use inventory::{RackV1Inventory, SpInventory};
2323
use mgs::make_mgs_client;
2424
pub(crate) use mgs::{MgsHandle, MgsManager};
25+
use omicron_common::FileKv;
2526
use sled_hardware::Baseboard;
2627

2728
use dropshot::{ConfigDropshot, HandlerTaskMode, HttpServer};
@@ -65,7 +66,7 @@ impl Server {
6566
pub async fn start(log: slog::Logger, args: Args) -> Result<Self, String> {
6667
let (drain, registration) = slog_dtrace::with_drain(log);
6768

68-
let log = slog::Logger::root(drain.fuse(), slog::o!());
69+
let log = slog::Logger::root(drain.fuse(), slog::o!(FileKv));
6970
if let slog_dtrace::ProbeRegistration::Failed(e) = registration {
7071
let msg = format!("failed to register DTrace probes: {}", e);
7172
error!(log, "{}", msg);

0 commit comments

Comments
 (0)