【问题标题】:Why rsyslog logs the same log multiple times为什么 rsyslog 多次记录同一个日志
【发布时间】:2017-03-11 18:21:25
【问题描述】:

已解决:将 c == accept(... 更改为 c = accept(... 当 == 使用不当时,应该使用 -Wall 来查看警告。

我配置 syslog 连接打开

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 记录了多次。

您能否建议如何修复该“错误”?

【问题讨论】:

    标签: c server daemon rsyslog


    【解决方案1】:

    这是一个错误:

    if ((c == accept(s, (struct sockaddr *)&sa, &b)) == -1) {
    

    其中c 永远不会等于-1。应该是

    if ((c = accept(s, (struct sockaddr *)&sa, &b)) == -1) {
    

    编辑

    这将对使用c的后续代码产生连锁反应,其值只能是01

    handle_client(c);
    

    close(c);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2014-12-24
      • 1970-01-01
      相关资源
      最近更新 更多