-
Notifications
You must be signed in to change notification settings - Fork 697
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
Conversation
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
@SteveLauC I'd like to learn the following things:
|
Hi, thanks for the PR!
I am not quite sure I understand the question, you mean how to pick a feature? Putting these interfaces under the feature
Do you mean the conversion between the Nix wrapper types and the C types used by the libc crate?
A few tests to ensure the wrapper would work should be sufficient.
Yeah, it is ok. |
BTW, a changelog is needed, please see CONTRIBUTING.md on how to add one. |
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
This reverts commit 98289d5.
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
@SteveLauC Thanks for your information! All updated.
Updated.
Updated.
Reasonable.
No. As stated at #413 (comment), I think we just simply use Rust's formatting function and pass the formatted string. This is also how Python wraps syslog functionalities.
Included. |
This patch doesn't wrap For For |
Signed-off-by: tison <wander4096@gmail.com>
#[macro_export]
macro_rules! LOG_MASK
{
($($arg:tt)*) => (
(1 << $($arg)*)
)
}
#[macro_export]
macro_rules! LOG_UPTO
{
($($arg:tt)*) => (
((1 << (($($arg)*) + 1)) - 1)
)
} But I'd like to wait for this patch getting review and perhaps did it in a followup so that we don't push everything at once. |
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
This comment was marked as resolved.
This comment was marked as resolved.
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
Signed-off-by: tison <wander4096@gmail.com>
@SteveLauC test on unix and updated. I have an idea to implement pub fn setlogmask(maskpri: libc::c_int) -> libc::c_int {
let mask = unsafe { libc::setlogmask(maskpri) };
mask
}
pub fn log_mask(pri: Severity) -> libc::c_int {
1 << (pri as libc::c_int)
}
pub fn log_upto(pri: Severity) -> libc::c_int {
(1 << ((pri as libc::c_int) + 1)) - 1
} Also related test ideas - https://stackoverflow.com/questions/56049852/python-2-7-setlogmask0-not-disabling-syslog |
Signed-off-by: tison <wander4096@gmail.com>
34dfe60
to
c98a454
Compare
src/syslog.rs
Outdated
/// 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>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The 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 ident
pointer as-is (will be used during whole process lifetime), we need to add a separate interface for Linux, and gate this with #[cfg(not(target_os = "linux"))]
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The 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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd suggest we remove the ident
param for now.
It's not easy to just add Option<&'static str>
because it may not end with nul
and I don't know how to achieve this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't observe the ident
on macos and linux, perhaps this is because the allocated string is collected 🤣
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe Option<&'static CStr>
. Let me try.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The 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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The 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?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you send a patch to this PR
Yeah, let me send a commit
There was a problem hiding this comment.
Choose a reason for hiding this comment
The 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 comment
The 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 openlog
and I found the different signature among different Unix flavors quite strange, and potentially inappropriate.
openlog
is a function provided by the environment C library, which may be implemented in different ways even for the same Unix flavor (Linux targets routinely use both musl
and glibc
as C library implementations, and macOS has an history of changing relevant implementation details of this function over OS versions), so changing a function signature just because the target is Linux is something that should be done with lots of caution, as it's likely to not be proper.
Moreover, the POSIX standard says that "the application shall ensure that the string pointed to by ident
remains valid during the syslog()
calls that will prepend this identifier". Because we can't really know in this function at what times syslog()
will be further called, the only safe lifetime for the ident
parameter is 'static
. And because the string is assumed to be a standard C string with no NUL characters in the middle, it should be CStr
, or a str
that uses the Nix path helper to check for absence of NULs (more ergonomic). Thus, I think the Linux signature of this function, potentially with a change from CStr
to str
+ Nix path checks, is the one that should be used for all Unix flavors.
What do you think about this? Would a PR to tweak this be welcome? 😄
Co-authored-by: SteveLauC <stevelauc@outlook.com>
@SteveLauC Here is an open question on whether to include |
Regarding the /// System log priority mask.
#[repr(transparent)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LogMask(libc::c_int);
/// Set the process-wide priority mask to `mask` and return the previous mask
/// value.
///
/// Calls to `syslog()` with a priority level not set in `mask` are ignored. The
/// default is to log all priorities.
///
/// If the `mask` argument is `None`, the current logmask is not modified, this
/// can be used to query the current log mask.
pub fn setlogmask(mask: Option<LogMask>) -> LogMask {
let mask = match mask {
Some(mask) => mask.0,
None => 0,
};
let prev_mask = unsafe {
libc::setlogmask(mask)
};
LogMask(prev_mask)
}
impl LogMask {
/// Creates a mask of all priorities up to and including `priority`.
#[doc(alias("LOG_UPTO"))]
pub fn up_to(priority: Severity) -> Self {
todo!()
}
/// Creates a mask for the specified priority.
#[doc(alias("LOG_MASK"))]
pub fn of_priority(priority: Severity) -> Self {
todo!()
}
/// Returns if the mask for the specified `priority` is set.
pub fn contains(&self, priority: Severity) -> bool {
todo!()
}
}
impl std::ops::BitOr for LogMask {
type Output = Self;
fn bitor(self, rhs: Self) -> Self::Output {
Self(self.0 | rhs.0)
}
} Though I think the C macros |
Yes. Let's review this PR as is now. @SteveLauC Thanks for your following commits! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, thanks for the PR, let's merge it! 🚀
This refers to #413.
Hello world works locally:
I'd like to send this patch early for any necessary alignments.