为什么rsyslog会多次记录同一条日志
Why rsyslog logs the same log multiple times
已解决:将 c == accept(... 更改为 c = accept(...
当 == 使用不当时,应该使用 -Wall 来查看警告。
我配置系统日志连接打开
openlog("program", LOG_PID, LOG_USER);
服务器代码:
for (;;) {
syslog(LOG_NOTICE, "before accept");
if ((c == accept(s, (struct sockaddr *)&sa, &b)) == -1) {
syslog(LOG_ERR, "could not accept on socket");
exit(1);
}
syslog(LOG_NOTICE, "after accept");
pid = fork();
if (pid < 0) {
syslog(LOG_ERR, "could not fork to handle client session");
exit(1);
} else if (0 == pid) {
close(s);
handle_client(c);
exit(0);
syslog(LOG_ERR, "exit after");
} else
close(c);
}
然后我使用telnet连接
telnet localhost 2345
...
Connection closed by foreign host.
日志/var/log/user.log显示
...some_info...: client was handled
...some_info...: client was handled
...some_info...: before accept
...some_info...: after accept
...some_info...: before accept
...some_info...: after accept
...some_info...: client was handled
看起来 rsyslog 以随机顺序多次记录消息,
虽然我知道我只调用了一次 telnet。
我很清楚程序是如何执行的,但不明白为什么rsyslog会记录多次。
能否请您建议如何解决 "bug"?
这是一个错误:
if ((c == accept(s, (struct sockaddr *)&sa, &b)) == -1) {
其中 c
永远不会等于 -1
。应该是
if ((c = accept(s, (struct sockaddr *)&sa, &b)) == -1) {
编辑
这将对使用 c
的后续代码产生连锁反应,它只能具有值 0
或 1
.
handle_client(c);
和
close(c);
已解决:将 c == accept(... 更改为 c = accept(... 当 == 使用不当时,应该使用 -Wall 来查看警告。
我配置系统日志连接打开
openlog("program", LOG_PID, LOG_USER);
服务器代码:
for (;;) {
syslog(LOG_NOTICE, "before accept");
if ((c == accept(s, (struct sockaddr *)&sa, &b)) == -1) {
syslog(LOG_ERR, "could not accept on socket");
exit(1);
}
syslog(LOG_NOTICE, "after accept");
pid = fork();
if (pid < 0) {
syslog(LOG_ERR, "could not fork to handle client session");
exit(1);
} else if (0 == pid) {
close(s);
handle_client(c);
exit(0);
syslog(LOG_ERR, "exit after");
} else
close(c);
}
然后我使用telnet连接
telnet localhost 2345
...
Connection closed by foreign host.
日志/var/log/user.log显示
...some_info...: client was handled
...some_info...: client was handled
...some_info...: before accept
...some_info...: after accept
...some_info...: before accept
...some_info...: after accept
...some_info...: client was handled
看起来 rsyslog 以随机顺序多次记录消息, 虽然我知道我只调用了一次 telnet。 我很清楚程序是如何执行的,但不明白为什么rsyslog会记录多次。
能否请您建议如何解决 "bug"?
这是一个错误:
if ((c == accept(s, (struct sockaddr *)&sa, &b)) == -1) {
其中 c
永远不会等于 -1
。应该是
if ((c = accept(s, (struct sockaddr *)&sa, &b)) == -1) {
编辑
这将对使用 c
的后续代码产生连锁反应,它只能具有值 0
或 1
.
handle_client(c);
和
close(c);