C代码中的syslog命令

use*_*517 8 c syslog

#include<syslog.h>
syslog(LOG_INFO, "Start logging");
Run Code Online (Sandbox Code Playgroud)

以上syslog命令未登录syslog.所以我试过,

openlog("Logs", "", LOG_USER);
syslog(LOG_INFO, "Start logging");
closelog();
Run Code Online (Sandbox Code Playgroud)

这无法记录任何内容,我收到以下错误:

syslog: unknown facility/priority: 8049584
Run Code Online (Sandbox Code Playgroud)

sar*_*old 17

这条线错了:

openlog("vyatta-conntrack", "", LOG_USER);
Run Code Online (Sandbox Code Playgroud)

"" 应该是一个整数:

void openlog(const char *ident, int option, int facility);
Run Code Online (Sandbox Code Playgroud)

整数应该是这些常数中的任何一个ORed在一起:

   LOG_CONS       Write directly to system console if there is
                  an error while sending to system logger.

   LOG_NDELAY     Open the connection immediately (normally, the
                  connection is opened when the first message is
                  logged).

   LOG_NOWAIT     Don't wait for child processes that may have
                  been created while logging the message.  (The
                  GNU C library does not create a child process,
                  so this option has no effect on Linux.)

   LOG_ODELAY     The converse of LOG_NDELAY; opening of the
                  connection is delayed until syslog() is
                  called.  (This is the default, and need not be
                  specified.)

   LOG_PERROR     (Not in POSIX.1-2001.)  Print to stderr as
                  well.

   LOG_PID        Include PID with each message.
Run Code Online (Sandbox Code Playgroud)

再试一次更像:

openlog("vyatta-conntrack", LOG_PID, LOG_USER);
Run Code Online (Sandbox Code Playgroud)

请注意,您的syslogd配置可能未设置为保留日志级别的消息LOG_INFO.尝试LOG_ALERT或者某些东西来调试这个问题 - 如果它有效,那么请回退LOG_INFO并配置你syslogd以保留你想要保留的日志消息.添加如下行:

*.* /var/log/all_messages.log
Run Code Online (Sandbox Code Playgroud)

会做的rsyslogd(8).rsyslog.conf(5)如果您的系统使用,请务必阅读联机帮助页rsyslogd(8).如果您的系统使用不同的syslog守护程序,请检查系统的联机帮助页以获取详细信息.


Bas*_*tch 7

你真的应该编译所有启用和调试的警告,即gcc -Wall -g.

再次阅读openlog手册页.它被声明为:

 void openlog(const char *ident, int option, int facility);
Run Code Online (Sandbox Code Playgroud)

所以传递""第二个参数是错误的(并且编译器确实警告过你).它应该是例如LOG_PERROR|LOG_PID或其他一些标志.