kfm*_*e04 8 c++ linux logging user-defined-literals c++11
背景
在Linux系统上,应用程序日志存在于子目录中/var/log,该目录由root/root我的系统拥有并具有755个权限.例如,我看到/var/log/mysql和/var/log/samba.
题
如果我想让myapp能够写入/var/log/myapp,那么在C/C++中实现这一目标的规范方法是什么?
思考
setuid root如果我不想,我是否必须做一些疯狂的事情sudo a_setup_script.sh?请注意,我知道这些syslog例程,但它们不足以满足我的需求(我需要记录更多信息,分成不同的文件,因此需要子目录).
我是否需要查看Ubuntu打包的组合(设置目录)并将文件IO直接导入子目录(通过myapp)?
我想尽可能地遵循标准.
附录
我忘了提一下,myapp实际上是一个守护程序进程(一个侦听客户端的服务器)所以拥有一个实际运行/启动进程的myapp_user并不是那么糟糕.
回答
对于Ubuntu来说,最好的解决方案似乎是rsyslog强大而现代的替代品syslog.它将根据需要生成文件/目录,它具有用于灵活路由syslog条目的内置语言,并且它使用syslogC/C++级别的简单旧API.要存储路由信息,您可以在C/C++中定义自己的文本消息编码,并结合适当rsyslog.conf的处理解码.
小智 8
不不不不.没有为这样的东西撒谎.这些日志由称为"syslog"的进程管理,并且有一个API用于向此记录器发送消息:
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
Run Code Online (Sandbox Code Playgroud)
或者您可以在命令行上键入"man syslog"并获取所有信息:-)
更新:您需要具有编辑syslog配置文件的权限才能将消息发送到单独的日志文件,否则它们将最终位于默认位置(可能是/ var/log/syslog).