安装部分:
先安装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的。