syslog-ng安装及通过python写入syslog

安装部分:

先安装eventlog

在~/.bash_profile里配置 export PKG_CONFIG_PATH=/usr/local/eventlog/lib/pkgconfig

然后安装jdk(你也可以使用自带的openjdk)

在~/.bash_profile里配置 export LD_LIBRARY_PATH=/usr/local/jdk/jre/lib/amd64/server:$LD_LIBRARY_PATH

然后安装syslog-ng

启动的时候依然会报错:

什么“template function ”啥 "format-json"什么东西,这个不知道怎么解决,不过我选择了躲避。。。打开/usr/local/syslog-ng/share/syslog-ng/include/scl/cim/template.conf,注释掉“template-function "format-cim" "$(format-json --pair @timestamp='${R_ISODATE}' --pair @message='${MSG}' --key .cim.* --shift 5 --key _* --key .* --replace-prefix .=_ --key *.*)\n";”

再启动就不会报错了。

安装完毕。

遇到syslog-ng启动报错,还好说,顺着错误修正。

如果syslog-ng接收不到日志,不产生日志,那么就需要以debug mode启动(./syslog-ng -d),这可能需要在源码安装的时候加一个参数 --enable-debug=yes。

python写syslog-ng:

python本身有一个logging模块,用来写日志的。

官方文档里说,python有一个handler,专门连接syslog-ng的:https://docs.python.org/2/library/logging.handlers.html#sysloghandler

这个handler叫SysLogHandler 有三个参数address=('localhost', SYSLOG_UDP_PORT)、facility=LOG_USER和socktype=socket.SOCK_DGRAM,需要注意的是,第三个参数socktype是python2.7之后才“出台”的,所以要注意要一下自己的python版本。因为centos默认的python的版本是2.6,所以会报错。

先贴syslog-ng.conf(我的syslog-ng是3.8版本)的配置:

source s_tcp {
    tcp(
        ip(0.0.0.0)
        port(2999)
        log-msg-size(81920)
        log-fetch-limit(100)
        max-connections(100)
        log_iw_size(10001)
        so_keepalive(yes)
    );
};

filter f_tcp{ facility(local6)};

destination d_tcp {
        file("/data/log/syslog-ng/info.log");
};

log {
        source(s_tcp);
        filter(f_tcp);
        destination(d_tcp);
        flags(flow-control);
};

贴python代码:

#coding=utf8
import logging
import logging.handlers
import socket

logger = logging.getLogger('myLogger')
logger.setLevel(logging.INFO)

#add handler to the logger
#handler = logging.handlers.SysLogHandler(address='/dev/log', facility=logging.handlers.SysLogHandler.LOG_LOCAL6, socktype=socket.SOCK_DGRAM)
SYSLOG_PORT = 2999
handler = logging.handlers.SysLogHandler(address=('localhost', SYSLOG_PORT), facility=logging.handlers.SysLogHandler.LOG_LOCAL6, socktype=socket.SOCK_STREAM)
#add formatter to the handler
formatter = logging.Formatter('Python: { "loggerName":"%(name)s", "asciTime":"%(asctime)s", "pathName":"%(pathname)s", "logRecordCreationTime":"%(created)f", "functionName":"%(funcName)s", "levelNo":"%(levelno)s", "lineNo":"%(lineno)d", "time":"%(msecs)d", "levelName":"%(levelname)s", "message":"%(message)s"}')

handler.formatter = formatter
logger.addHandler(handler)

logger.info("Test Message")
#import syslog
#syslog.syslog("test")

代码是别人的代码基础上改的,主要就是handler那块。

最下面注释的两行也可以写syslog,只不过是以

handler = logging.handlers.SysLogHandler(address='/dev/log')

的形式写的。

它会被

source {
    system();
    internal();
};

拦截到。


我是通过tcp方式来写入syslog的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值