将rsyslogd输出转储到某个文件

时间:2015-02-27 08:11:10

标签: c linux rsyslog

我希望将rsyslog(service)的输出转储到选定的某个文件中 位置。
以下是我的尝试:
1.对/etc/rsyslog.conf进行了更改

#################
#### MODULES ####
#################
$ModLoad imfile

$ModLoad omprog   <----- NEWLY ADDED ------>

$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog   # provides kernel logging support
#$ModLoad immark  # provides --MARK-- message capability

###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat   

$ActionOMProgBinary /home/test/dmsg <----- NEWLY ADDED ------>  

# Filter duplicated messages    

dmsg:是一个从stdin读取行并将其写入
的C程序       文件(/ home / test / log_syslog_file)

我希望将输出转储到/ home / test / log_syslog_file
但没有任何反应。

dmsg(dmsg.c)::

的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
int main(){
char* lineptr;
size_t size = 0;   
int fd = open("log_syslog_file", O_CREAT| O_WRONLY);
        while(getline(&lineptr, &size, stdin)>0){
                if(write(fd, lineptr, strlen(lineptr))<0){
                        fprintf(stderr, "write failure");
                        break;
                }
        }
        free(lineptr);
        close(fd);
return 0;
}

我正在使用Ubuntu 14.04

--------编辑--------- 启动rsyslog服务后,
我发出以下命令:

rsyslogd -c5 -d -n 

当我使用以下内容时,它可以正常工作:

cat /var/log/syslog | ./dmsg

感谢。

2 个答案:

答案 0 :(得分:0)

您的代码中至少有一个主要错误:

char* lineptr;
...
while(getline(&lineptr, &size, stdin)>0)

您永远不会为*lineptr中存储的字符串分配内存,但您也不会告诉getline()为您分配内存。产生的缓冲区溢出可能导致在不可避免的崩溃之前出现各种令人兴奋的错误(例如,在我的测试运行中,log_syslog_file获得了权限---x--x--T)。

答案 1 :(得分:0)

首先是@Mark所说的。除此之外,请确保 你有像

这样的东西
*.* :omprog:
在你的rsyslog.conf中

。 这会将所有消息重定向到您的程序。