-
Notifications
You must be signed in to change notification settings - Fork 716
Add syslog supports #2537
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add syslog supports #2537
Changes from 20 commits
ae86c6a
ad6a2f3
216b4a8
216911e
a19d932
953fdec
98289d5
f527072
ee8ffed
5c547d6
f4bd797
0e6c99b
f9df215
a60f314
d051dc6
12e7bdf
169b5d0
0c61a95
584e4df
718519c
c98a454
9f3596e
541801e
596280b
1cadebe
7014ca1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| Add support for `syslog`, `openlog`, `closelog` on `macos`. | ||
tisonkun marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,188 @@ | ||
| //! Interfaces for controlling system log. | ||
|
|
||
| use crate::NixPath; | ||
| use crate::Result; | ||
| use std::ffi::OsStr; | ||
|
|
||
| /// Logging options of subsequent [`syslog`] calls can be set by calling [`openlog`]. | ||
| /// | ||
| /// The parameter `ident` is a string that will be prepended to every message. The `logopt` | ||
| /// argument specifies logging options. The `facility` parameter encodes a default facility to be | ||
| /// assigned to all messages that do not have an explicit facility encoded. | ||
| pub fn openlog<S>( | ||
| ident: Option<&S>, | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This interface should be good for UNIXs other than Linux, since Linux would store the
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. And thanks for adding the Option here! I didn't catch it in my first round of review.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd suggest we remove the It's not easy to just add
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't observe the
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nix does not pursue uniform interfaces across OSes, if they are different, let them be different. I suggest keeping the original interface for non-Linux platforms as they are not constrained by this limit and adding a separate interface for Linux
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you send a patch to this PR or just edit this PR with the suggested change?
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Yeah, let me send a commit
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. See 596280b There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I just stumbled upon this review comment when writing a portable interface that relies on
Moreover, the POSIX standard says that "the application shall ensure that the string pointed to by What do you think about this? Would a PR to tweak this be welcome? 😄 |
||
| logopt: LogFlags, | ||
| facility: Facility, | ||
| ) -> Result<()> | ||
| where | ||
| S: AsRef<OsStr> + ?Sized, | ||
| { | ||
| let logopt = logopt.bits(); | ||
| let facility = facility as libc::c_int; | ||
| match ident.map(OsStr::new) { | ||
| None => unsafe { | ||
| libc::openlog(std::ptr::null(), logopt, facility); | ||
| }, | ||
| Some(ident) => ident.with_nix_path(|ident| unsafe { | ||
| libc::openlog(ident.as_ptr(), logopt, facility); | ||
| })?, | ||
| } | ||
| Ok(()) | ||
| } | ||
|
|
||
| /// Writes message to the system message logger. | ||
| /// | ||
| /// The message is then written to the system console, log files, logged-in users, or forwarded | ||
| /// to other machines as appropriate. | ||
| /// | ||
| /// # Examples | ||
| /// | ||
| /// ```rust | ||
| /// use nix::syslog::{openlog, syslog, Facility, LogFlags, Severity}; | ||
| /// | ||
| /// openlog(None::<&str>, LogFlags::LOG_PID, Facility::LOG_USER).unwrap(); | ||
| /// syslog(Severity::LOG_EMERG, "Hello, nix!").unwrap(); | ||
| /// | ||
| /// // use `format!` to format the message | ||
| /// let name = "syslog"; | ||
| /// syslog(Severity::LOG_EMERG, &format!("Hello, {name}!")).unwrap(); | ||
| /// ``` | ||
| pub fn syslog<P, S>(priority: P, message: &S) -> Result<()> | ||
| where | ||
| P: Into<Priority>, | ||
tisonkun marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| S: AsRef<OsStr> + ?Sized, | ||
| { | ||
| let priority = priority.into(); | ||
| let formatter = OsStr::new("%s"); | ||
tisonkun marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| let message = OsStr::new(message); | ||
| formatter.with_nix_path(|formatter| { | ||
| message.with_nix_path(|message| unsafe { | ||
| libc::syslog(priority.0, formatter.as_ptr(), message.as_ptr()) | ||
| }) | ||
| })??; | ||
| Ok(()) | ||
| } | ||
|
|
||
| /// Closes the log file. | ||
| pub fn closelog() { | ||
| unsafe { libc::closelog() } | ||
| } | ||
|
|
||
| /// The priority for a log message. | ||
| #[derive(Debug, Clone, Copy)] | ||
| pub struct Priority(libc::c_int); | ||
|
|
||
| impl Priority { | ||
| /// Create a new priority from a facility and severity level. | ||
| pub fn new(severity: Severity, facility: Facility) -> Self { | ||
| let priority = (facility as libc::c_int) | (severity as libc::c_int); | ||
| Priority(priority) | ||
| } | ||
| } | ||
|
|
||
| impl From<Severity> for Priority { | ||
| fn from(severity: Severity) -> Self { | ||
| let priority = severity as libc::c_int; | ||
| Priority(priority) | ||
| } | ||
| } | ||
|
|
||
| libc_bitflags! { | ||
| /// Options for system logging. | ||
| pub struct LogFlags: libc::c_int { | ||
tisonkun marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| /// Log the process id with each message: useful for identifying instantiations of | ||
| /// daemons. | ||
| #[cfg(not(target_os = "haiku"))] | ||
| LOG_PID; | ||
| /// If syslog() cannot pass the message to syslogd(8) it will attempt to write the | ||
| /// message to the console ("/dev/console"). | ||
| #[cfg(not(target_os = "haiku"))] | ||
| LOG_CONS; | ||
| /// The converse of [`LOG_NDELAY`][LogFlags::LOG_NDELAY]; opening of the connection is | ||
| /// delayed until `syslog` is called. | ||
| /// | ||
| /// This is the default, and need not be specified. | ||
| #[cfg(not(target_os = "haiku"))] | ||
| LOG_ODELAY; | ||
| /// Open the connection to syslogd(8) immediately. Normally the open is delayed until | ||
| /// the first message is logged. Useful for programs that need to manage the order in | ||
| /// which file descriptors are allocated. | ||
| #[cfg(not(target_os = "haiku"))] | ||
| LOG_NDELAY; | ||
| /// Write the message to standard error output as well to the system log. | ||
| #[cfg(not(target_os = "haiku"))] | ||
| LOG_PERROR; | ||
| } | ||
| } | ||
|
|
||
| libc_enum! { | ||
| /// Severity levels for log messages. | ||
| #[repr(i32)] | ||
| #[non_exhaustive] | ||
| pub enum Severity { | ||
tisonkun marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| /// A panic condition. | ||
| /// | ||
| /// This is normally broadcast to all users. | ||
| LOG_EMERG, | ||
| /// A condition that should be corrected immediately, such as a corrupted system database. | ||
| LOG_ALERT, | ||
| /// Critical conditions, e.g., hard device errors. | ||
| LOG_CRIT, | ||
| /// Errors. | ||
| LOG_ERR, | ||
| /// Warning messages. | ||
| LOG_WARNING, | ||
| /// Conditions that are not error conditions, but should possibly be handled specially. | ||
| LOG_NOTICE, | ||
| /// Informational messages. | ||
| LOG_INFO, | ||
| /// Messages that contain information normally of use only when debugging a program. | ||
| LOG_DEBUG, | ||
| } | ||
| } | ||
|
|
||
| libc_enum! { | ||
| /// Facilities for log messages. | ||
| #[repr(i32)] | ||
| #[non_exhaustive] | ||
| pub enum Facility { | ||
| /// Messages generated by the kernel. | ||
| /// | ||
| /// These cannot be generated by any user processes. | ||
| LOG_KERN, | ||
| /// Messages generated by random user processes. | ||
| /// | ||
| /// This is the default facility identifier if none is specified. | ||
| LOG_USER, | ||
| /// The mail system. | ||
| LOG_MAIL, | ||
| /// System daemons, such as routed(8), that are not provided for explicitly by other facilities. | ||
| LOG_DAEMON, | ||
| /// The authorization system: login(1), su(1), getty(8), etc. | ||
| LOG_AUTH, | ||
| /// Messages generated internally by syslogd(8). | ||
| LOG_SYSLOG, | ||
| /// The line printer spooling system: cups-lpd(8), cupsd(8), etc. | ||
| LOG_LPR, | ||
| /// The network news system. | ||
| LOG_NEWS, | ||
| /// The uucp system. | ||
| LOG_UUCP, | ||
| /// Reserved for local use. | ||
| LOG_LOCAL0, | ||
| /// Reserved for local use. | ||
| LOG_LOCAL1, | ||
| /// Reserved for local use. | ||
| LOG_LOCAL2, | ||
| /// Reserved for local use. | ||
| LOG_LOCAL3, | ||
| /// Reserved for local use. | ||
| LOG_LOCAL4, | ||
| /// Reserved for local use. | ||
| LOG_LOCAL5, | ||
| /// Reserved for local use. | ||
| LOG_LOCAL6, | ||
| /// Reserved for local use. | ||
| LOG_LOCAL7, | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| use nix::syslog::{openlog, syslog, Facility, LogFlags, Severity}; | ||
|
|
||
| #[test] | ||
| fn test_syslog_hello_world() { | ||
| openlog(None::<&str>, LogFlags::LOG_PID, Facility::LOG_USER).unwrap(); | ||
| syslog(Severity::LOG_EMERG, "Hello, nix!").unwrap(); | ||
|
|
||
| let name = "syslog"; | ||
| syslog(Severity::LOG_NOTICE, &format!("Hello, {name}!")).unwrap(); | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.