【问题标题】:How to write an C/C++ application that writes to a /var/log/myapp directory?如何编写写入 /var/log/myapp 目录的 C/C++ 应用程序?
【发布时间】:2013-05-23 21:39:58
【问题描述】:

背景

在 Linux 系统上,Application Logs 存在于 /var/log 的子目录中,该子目录归 root/root 所有,在我的系统上拥有 755 个权限。例如,我看到/var/log/mysql/var/log/samba

问题

如果我希望 myapp 能够写入 /var/log/myapp,那么在 C/C++ 中实现此目的的规范方法是什么?

想法

如果我不想sudo a_setup_script.sh,我是否必须做一些疯狂的事情,比如setuid root?请注意,我知道syslog 例程,但它们不足以满足我的需求(我需要记录更多信息,分成不同的文件,因此需要子目录)。

我是否需要查看 Ubuntu 打包(设置目录)和将文件 IO 定向到子目录(通过 myapp)的组合?

我想尽可能地遵循标准。

附录

我忘了提,myapp 实际上是一个守护进程(一个侦听客户端的服务器),所以拥有一个 myapp_user 实际上并不是那么糟糕运行/启动进程。

回答

对于 Ubuntu,最好的解决方案似乎是 rsyslog,它是 syslog 的强大现代替代品。它将根据需要生成文件/目录,它具有用于灵活路由syslog 条目的内置语言,并且它在C/C++ 级别使用简单、旧的syslog API。要存储路由信息,您可以在 C/C++ 中定义自己的文本消息编码,并结合适当的rsyslog.conf 来处理解码。

【问题讨论】:

    标签: c++ linux logging c++11 user-defined-literals


    【解决方案1】:

    不,不,不,不。这样的东西没有suid。这些日志由称为“syslog”的进程管理,并且有一个 API 可以将消息发送到此记录器:

       void openlog(const char *ident, int option, int facility);
       void syslog(int priority, const char *format, ...);
       void closelog(void);
    

    或者您可以在命令行中输入“man syslog”并获取所有信息 :-)

    更新:您将需要编辑 syslog 配置文件的权限才能将消息发送到单独的日志文件,否则它们将最终位于默认位置(可能是 /var/log/syslog)。

    【讨论】:

    • 您确定可以在子目录中使用它吗?仔细阅读我的 OP - 如果我将所有东西都转储到 /var/log/syslog,它会使该文件变得无用(有很多东西)。
    • @kfmfe04 是的。请检查更新。您需要配置 syslog 以将 your 消息发送到 your 文件。例如:news.crit /var/log/news/news.crit news.err /var/log/news/news.err
    • @kfmfe04 抱歉多次编辑。评论有点痛苦。 :(
    • +1 ty - 好的 - 我想我可以为此深入研究 API - 对于设置,是否有一个 API 也可以处理子目录的创建?查看标题,我看到了类似 LOG_LOCAL0 和 LOG_LOCAL1 的内容(可能用于用户定义的应用程序)。我会再用谷歌搜索一下......(但你的回答足以让我指出正确的方向 - ty)。
    • @kfmfe04 需要提前创建子目录。然后将配置添加到 syslog 的配置文件中,以便“本地”设施之一将输出发送到您选择的文件。排序local0.* /var/log/myapp/myapp.log,然后使用openlogLOG_LOCAL0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2012-08-21
    相关资源
    最近更新 更多