C对日志文件的多次写访问(linux env)
Posted
技术标签:
【中文标题】C对日志文件的多次写访问(linux env)【英文标题】:C multiple write access to a log file (linux env) 【发布时间】:2018-04-16 15:24:06 【问题描述】:我有一组用 C 语言编写的独立程序。我希望他们都将他们的日志写入同一个文件。显然是控制访问的问题。他们中的两个或更多最终可能会同时写入。
实现这一目标最务实的方法是什么?
我遇到了使用 pthread/mutexes/etc 的解决方案,但这样的实现听起来有点矫枉过正。
我也在查看系统日志,但想知道这是否真的是为了我需要做的事情?
我觉得我需要一个守护程序服务来接收消息并在写入时进行控制。我想知道它是否已经存在。
【问题讨论】:
“我觉得我需要一个守护程序服务来接收消息并在写入时进行控制。我想知道这是否已经存在。”是的,那是系统日志。 这有点宽泛...请指定其他约束,最好提供一些示例代码。syslog
是一种选择,但它基本上需要 root 访问权限才能配置日志记录。
如果您以O_APPEND
模式打开日志文件,并使用单个write()
调用编写每条消息,我想您一定会得到您想要的。
我对史蒂夫的评论很感兴趣,因为这在短期内可能是一个不错的选择。使用 O_APPEND 模式如果一个人在另一个人已经在写的时候尝试写会发生什么。这会阻止第二个的写作过程吗?我会以这种方式进行挖掘和测试。这是在openwrt上运行的。 syslog 在那里被称为 logd/logread 但我应该能够处理它。
@Noel 因为我们在这里讨论的是系统调用,所以问“如果一个人试图写而另一个人已经在写会发生什么”几乎没有任何意义。如果操作系统内核是单线程的,那么单个系统调用本质上是原子的。而O_APPEND
的定义是,它将每个write()
调用都变成了一个原子的seek-to-end-then-write 操作。我不确定在多处理器或其他多线程操作系统上会发生什么,但我很确定操作系统内核会为您处理任何独占锁定。
【参考方案1】:
我也在查看 syslog,但想知道这是否真的是为了我需要做的事情?
是的
我觉得我需要一个守护程序服务来接收消息并在写入时进行控制。我想知道它是否已经存在。
它存在于 Unix 衍生产品(包括 Linux)中,被称为...syslogd
更严重的是,syslog
函数旨在将消息传递给 syslogd
守护程序,该守护程序将根据其配置文件对其进行路由。最常见的用途包括将其写入文件或系统控制台(特别是当没有人可以确定文件系统是否仍然可以访问时出现恐慌级别的消息)。 syslog 系统可能具有比您所要求的更多的功能,但它是一个非常强大且经过广泛测试的软件。此外,它肯定已经在您的系统上处于活动状态,因此您应该有充分的理由自己滚动而不是使用它。
【讨论】:
值得明确指出 syslog 不仅仅用于系统日志消息。任何应用程序进程都可以使用它来编写自己的、特定于应用程序的日志消息,这些消息可以路由到自己的、特定于应用程序的日志文件。【参考方案2】:你有两种方法:
首先:使用已经存在的东西。 对于日志记录部分,syslog(和 syslog-ng)广为人知且被广泛使用。
从那时起,您可以对 syslog-ng 进行参数化以侦听 ip 连接,并扫描目录以查找新文件。
您的程序可以在需要记录时直接连接到 syslogng 并发送日志,如果连接失败,则在 syslogng 监视的目录中写入一个新文件。 允许不丢失日志的是 syslog-ng 由于某种原因而中断。
第二:开发一些非常类似于 syslog-ng 的东西。 在这种情况下,由您决定。
【讨论】:
以上是关于C对日志文件的多次写访问(linux env)的主要内容,如果未能解决你的问题,请参考以下文章