系统日志不转发远程消息

时间:2017-05-17 06:15:43

标签: c++ c logging syslog yocto

我使用以下配置配置了/etc/syslog.conf

*.* @10.10.10.2:514
*.* @@10.10.10.2:514

并记录下面的代码

openlog("Test-Msg", LOG_PID, LOG_LOCAL0);
for (int i = 0; i <10; i++)
{
    syslog(LOG_ALERT, "My msg %d", i);
    std::cout<<"-------------Writing Syslog "<<i<<"\n";
}

closelog();

但它没有转发到远程服务器。而不是它创建一个文件“@ 10.10.10.2:514”&amp; “@@ 10.10.10.2:514”并记录所有信息。

使用wireshark测试,没有消息被转发到远程系统。

我正在使用yocto平台和busybox 1.22系统日志实现。

更新

在yocto中我看到另外一个配置文件/etc/syslog-startup.conf并在那里配置

DESTINATION=remote  # log destinations (buffer file remote)
REMOTE=10.10.10.2:514          # where to log (syslog remote)

现在它开始转发所有消息,但根据linux手册,syslog conf必须支持*.=alert @<host:port>过滤器。如果我必须使用上述配置,我该如何应用过滤器?

3 个答案:

答案 0 :(得分:1)

默认情况下,基于Yocto的系统使用Busybox提供许多基本工具的最小版本。 syslog是这些工具之一。这是Busybox文档的引用:

  

请注意,此版本的syslogd会忽略/etc/syslog.conf。

要获得完整的系统日志功能,您必须在图像上包含更完整的实现。 meta-openembedded中有几个选项,rsyslog in meta-oe可能是一个很好的默认选择。

答案 1 :(得分:0)

我首先使用logger(busybox中包含的工具)来确保您的syslog配置正确。 如果通过此方法很好地发送消息,那么我们可以调查代码。

import os
import xlrd
import sys
import unicodedata

workbook_path = "path/to/my/file.xlsx"
workbook = xlrd.open_workbook(workbook_path)
sheet = workbook.sheet_by_name("Sheet1")
csv_data = ""

def normalize(value):
     result = unicodedata.normalize("NFKD", unicode(value)).encode("ascii","ignore")
     return result

for rowx in range(sheet.nrows):
    coldata = sheet.row_values(rowx)
    # Append data to string that we are going to output
    # and add new line
    csv_data += ", ".join(normalize(x) for x in coldata) + "\n"

with open ("/path/log.txt","a") as results:
    results.write(csv_data)

答案 2 :(得分:0)

我也在调查这个问题。 busybox支持远程日志记录,但它似乎转发所有消息。不支持过滤与远程日志记录相结合。我在图像上安装了rsyslog来解决这个问题。

我还发现rsyslog不会立即旋转文件。 Logrotate作为依赖项安装,但没有运行cron守护程序。我必须安装cronie并配置cronie,logrotate和rsyslog。