所以我已经配置我的Python应用程序使用Python的SysLogHandler登录到syslog,一切正常.除了多线处理.并不是说我需要如此糟糕地发出多行日志记录(我做了一点),但我需要能够阅读Python的异常.我正在使用Ubuntu和rsyslog 4.2.0.这就是我得到的:
Mar 28 20:11:59 telemachos root: ERROR 'EXCEPTION'#012Traceback (most recent call last):#012 File "./test.py", line 22, in <module>#012 foo()#012 File "./test.py", line 13, in foo#012 bar()#012 File "./test.py", line 16, in bar#012 bla()#012 File "./test.py", line 19, in bla#012 raise Exception("EXCEPTION!")#012Exception: EXCEPTION!
Run Code Online (Sandbox Code Playgroud)
测试代码,以备不时之需:
import logging
from logging.handlers import SysLogHandler
logger = logging.getLogger()
logger.setLevel(logging.INFO)
syslog = SysLogHandler(address='/dev/log', facility='local0')
formatter = logging.Formatter('%(name)s: %(levelname)s %(message)r')
syslog.setFormatter(formatter)
logger.addHandler(syslog)
def foo():
bar()
def bar():
bla()
def bla():
raise Exception("EXCEPTION!")
try:
foo()
except:
logger.exception("EXCEPTION")
Run Code Online (Sandbox Code Playgroud) 我对syslog消息格式有点困惑.我必须编写一个解析syslog消息的程序.当我读到我在syslog-ng实例中得到的内容时,我得到这样的消息:
Jan 12 06:30:00 1.2.3.4 apache_server: 1.2.3.4 - - [12/Jan/2011:06:29:59 +0100] "GET /foo/bar.html HTTP/1.1" 301 96 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729)" PID 18904 Time Taken 0
Run Code Online (Sandbox Code Playgroud)
我可以清楚地确定真实的消息(在这种情况下是Apache访问日志消息)其余的是关于系统日志消息本身的元数据.
但是,当我阅读RFC 5424时,消息示例如下所示:
没有结构化数据
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - BOM'su root' failed for lonvick on /dev/pts/8
Run Code Online (Sandbox Code Playgroud)
或结构化数据
<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] BOMAn application event log entry...
Run Code Online (Sandbox Code Playgroud)
我使用rsyslogd 5.8版.字符\n和\ r \n在日志文件中转储为#012和#015.
示例(输入命令:printf"example-test [\ r \n]"| logger):
<13> 2014-07-07T11:01:03.254 root: example-test[#015]
Run Code Online (Sandbox Code Playgroud)
我宁愿用十六进制转储它们:#0A和#0D(或其他更易读的格式).
我怎么能通过修改rsyslogd配置文件来做到这一点?
我正在研究从CentOs 6.x服务器集中日志文件聚合的解决方案.在安装Elasticsearch/Logstash/Kibana(ELK)堆栈之后,我遇到了一个Rsyslog omelasticsearch插件,该插件可以以logstash格式从Rsyslog向Elasticsearch发送消息,并开始问自己为什么需要Logstash.
Logstash有许多不同的输入插件,包括接受Rsyslog消息的插件.是否有理由将Logstash用于我需要从多个服务器收集日志文件内容的用例?此外,将消息从Rsyslog发送到Logstash是否有好处,而不是将它们直接发送到Elasticsearch?
我有一个应用程序myapp
应该日志文件发送只到/var/log/myapp.log
.myapp
是用C++编写的.以下示例代码仅将日志发送到/ var/log/syslog.我的操作系统是Linux - Ubuntu 12.04 - 具体而言.我还发现我的机器安装了rsyslog而不是syslog.
#include <stdio.h>
#include <unistd.h>
#include <syslog.h>
int main(void) {
openlog("myapp", LOG_PID|LOG_CONS, LOG_USER);
syslog(LOG_INFO, "abc 10");
closelog();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我使用弹性beanstalk为rails应用程序配置远程登录.我想从中获取日志,/var/log/puma/puma.log
但只获取一些内核和系统信息.这是我的配置.ebextensions/papertrail.config
packages:
yum:
rsyslog: []
rsyslog-gnutls: []
files:
"/etc/rsyslog.d/01-udp.conf":
mode: "000640"
owner: root
group: root
content: |
$ModLoad imudp
$UDPServerRun 514
"/etc/rsyslog.d/02-papertrail-tls.conf":
mode: "000640"
owner: root
group: root
content: |
$DefaultNetstreamDriverCAFile /etc/papertrail-bundle.pem # trust these CAs
$ActionSendStreamDriver gtls # use gtls netstream driver
$ActionSendStreamDriverMode 1 # require TLS
$ActionSendStreamDriverAuthMode x509/name # authenticate by hostname
$ActionSendStreamDriverPermittedPeer *.papertrailapp.com
"/etc/rsyslog.d/03-logfile-config.conf":
mode: "000640"
owner: root
group: root
content: |
$ModLoad imfile
$InputFileName /var/log/puma/puma.log
$InputFileTag api
$InputFileStateFile api-staging
$InputFileSeverity error
$InputFileFacility local3 …
Run Code Online (Sandbox Code Playgroud) 场景:在Ubuntu 12.4 lxc主机上运行debootstrapped Ubuntu 11.4 lxc guest虚拟机(均为64位)
在lxc guest中,rsyslogd经常与SIGABRT崩溃,说明:
libgcc_s.so.1 must be installed for pthread_cancel to work
0334.380551272:7f4128a84700:
Signal 6 (SIGABRT) occured, execution must be terminated.
Run Code Online (Sandbox Code Playgroud)
我不确定为什么找不到libgcc_s.so.1.如果我运行ldconfig -p:
$# ldconfig -p | grep libgcc
libgcc_s.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgcc_s.so.1
libgcc_s.so.1 (libc6) => /usr/lib32/libgcc_s.so.1
Run Code Online (Sandbox Code Playgroud)
它被列出.这两个链接都是有效的.
我该如何解决这个问题?
编辑:objdump -T输出请求:
/lib/x86_64-linux-gnu/libgcc_s.so.1: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
00000000000025d8 l d .init 0000000000000000 .init
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 memset
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 abort
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
0000000000000000 w D …
Run Code Online (Sandbox Code Playgroud) 我已修改配置rsyslogd
以禁用RSYSLOG_TraditionalFileFormat
.但是,apache日志仍然/var/log/apache/error.log
只显示第二个精确度.
还有其他需要配置的东西吗?
我在Ubuntu 12.04上配置了一个集中式系统日志.
我在两台服务器上设置了最大邮件大小
$MaxMessageSize 20k
Run Code Online (Sandbox Code Playgroud)
我有2种不同的比例:
我可以找到任何其他缓冲区大小的配置.
是rsyslog的限制还是配置问题?
谢谢你的帮助.
弗雷德
我无法将日志消息写入syslog.任何帮助都会很棒.这是我简单的log4j程序
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class log4jExample
{
/* Get actual class name to be printed on */
static Logger log = Logger.getLogger(log4jExample.class.getName());
public static void main(String[] args) throws IOException,SQLException
{
log.error("Hello this is an error message");
log.info("Hello this is an info message");
log.fatal("Fatal error message");
}
}
Run Code Online (Sandbox Code Playgroud)
我的syslog属性文件
# configure the root logger
log4j.rootLogger=INFO, SYSLOG
# configure Syslog facility LOCAL1 appender
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.threshold=WARN
log4j.appender.SYSLOG.syslogHost=localhost
log4j.appender.SYSLOG.facility=LOCAL4
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.conversionPattern=[%p] %c:%L - %m%n
Run Code Online (Sandbox Code Playgroud)