我无法理解Python的logging
模块.我的需求非常简单:我只想将所有内容记录到syslog中.阅读文档后,我想出了这个简单的测试脚本:
import logging
import logging.handlers
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler()
my_logger.addHandler(handler)
my_logger.debug('this is debug')
my_logger.critical('this is critical')
Run Code Online (Sandbox Code Playgroud)
但是此脚本不会在syslog中生成任何日志记录.怎么了?
在C中我们以这种方式记录:
syslog( LOG_INFO, "proxying %s", url );
Run Code Online (Sandbox Code Playgroud)
在Linux中我们如何检查日志?
这可能是一个非常简单的问题,我正在尝试调试一个生成以下段错误的应用程序 kern.log
kernel: myapp[15514]: segfault at 794ef0 ip 080513b sp 794ef0 error 6 in myapp[8048000+24000]
这是我的问题:
有没有关于segfault上的差异错误号的文档,在这个例子中它是错误6,但我看到错误4,5
这些信息的含义是at bf794ef0 ip 0805130b sp bf794ef0 and myapp[8048000+24000]
什么?
到目前为止,我能够使用符号进行编译,当我执行x 0x8048000+24000
它时返回一个符号,这是正确的方法吗?到目前为止,我的假设如下:
我有一个为linux编写的程序,我正在尝试在我的MacOS 10.5机器上构建和运行它.该程序构建和运行没有问题,但它会对syslog进行多次调用.我知道syslogd正在我的mac上运行,但我似乎无法找到我的syslog调用输出到的位置.
syslog调用的形式
syslog (LOG_WARNING, "Log message");
Run Code Online (Sandbox Code Playgroud)
知道我在哪里可以找到我的日志输出吗?
所以我已经配置我的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的消息限制为1KB.这是硬编码到Syslog协议中,还是可以为每个服务器设置的参数?
我希望我读过的文章已经过时了,所以如果您有任何信息请分享.
我在Unix上使用C++程序,将消息发送到syslog.
当前代码使用与printf类似的syslog系统调用.
现在我宁愿为此目的使用流,通常是内置的std :: clog.但是clog只是将输出重定向到stderr,而不是syslog,这对我来说没用,因为我还将stderr和stdout用于其他目的.
我在另一个答案 中看到,使用rdbuf()将它重定向到一个文件很容易,但我看不到应用该方法来调用syslog,因为openlog没有返回一个文件处理程序我可以用来绑定它的流.
有没有其他方法可以做到这一点?(看起来非常基本的unix编程)?
编辑:我正在寻找一个不使用外部库的解决方案.@Chris提出的建议可能是一个良好的开端,但仍然有点模糊,无法成为公认的答案.
编辑:使用Boost.IOStreams是好的,因为我的项目已经使用了Boost.
可以与外部库链接,但也是一个关注点,因为它是GPL代码.依赖性也是一种负担,因为它们可能与其他组件冲突,在我的Linux发行版上不可用,引入第三方错误等.如果这是唯一的解决方案,我可以考虑完全避免流......(遗憾).
我正在研究如何从我的Python应用程序中登录到syslog,我发现有两种方法可以:
哪个是最好的选择,每个的优点/缺点等等,因为我真的不知道应该使用哪一个.
任何人都可以推荐Windows的开源Syslog守护进程(特别是Windows 2008 64位).
谢谢
我没有运气找到有关使用Django 1.3字典配置设置syslog日志记录的任何信息.Django文档不包括syslog,python文档不够清晰,根本不包括字典配置.我从以下开始,但我仍然坚持如何配置SysLogHandler.
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'handlers': {
'syslog':{
'level':'DEBUG',
'class':'logging.handlers.SysLogHandler',
'formatter': 'verbose'
},
},
'loggers': {
'django': {
'handlers':['syslog'],
'propagate': True,
'level':'INFO',
},
'myapp': {
'handlers': ['syslog'],
'propagate': True,
'level': 'DEBUG',
},
},
}
Run Code Online (Sandbox Code Playgroud)