blob: 91152046849157336c1dcd101f8e0a6e5d0ea6e5 [file] [log] [blame] [edit]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Provides the command "syslog" for crosh.
use log::error;
use nix::unistd::getpid;
use syslog::{Facility, Formatter3164};
use crate::dispatcher::{self, Arguments, Command, Dispatcher};
pub fn register(dispatcher: &mut Dispatcher) {
dispatcher.register_command(
Command::new(
"syslog",
"<message>",
r#"Logs a message to syslog (the system log daemon).
This can help mark/flag/label the logs just before & after running a different
operation so you can locate the relevant errors faster."#,
)
.set_command_callback(Some(execute_syslog)),
);
}
fn execute_syslog(_cmd: &Command, args: &Arguments) -> Result<(), dispatcher::Error> {
// The log crate doesn't support NOTICE levels, so use syslog directly.
// https://github.com/rust-lang/log/issues/334
let formatter = Formatter3164 {
facility: Facility::LOG_USER,
hostname: None,
process: "crosh".to_string(),
pid: getpid().as_raw() as u32,
};
let mut writer = syslog::unix(formatter).map_err(|err| {
error!("unable to connect to syslog: {:?}", err);
dispatcher::Error::CommandReturnedError
})?;
writer.notice(args.get_args().join(" ")).map_err(|err| {
error!("unable to write to syslog: {:?}", err);
dispatcher::Error::CommandReturnedError
})
}