【问题标题】:Python logging with rsyslog使用 rsyslog 进行 Python 日志记录
【发布时间】:2014-11-06 13:25:27
【问题描述】:

我继承了以下 python 文件:

import logging
from logging.handlers import SysLogHandler

class Logger(object):

  # Return a logging instance used throughout the library
  def __init__(self):
    self.logger = logging.getLogger('my_daemon')

  # Log an info message
  def info(self, message, *args, **kwargs):
    self.__log(logging.INFO, message, *args, **kwargs)

  # Configure the logger to log to syslog
  def log_to_syslog(self):
    formatter = logging.Formatter('my_daemon: [%(levelname)s] %(message)s')

    handler = SysLogHandler(address='/dev/log', facility=SysLogHandler.LOG_DAEMON)
    handler.setFormatter(formatter)

    self.logger.addHandler(handler)
    self.logger.setLevel(logging.INFO)

我看到 init 方法查找名为 my_daemon 的记录器,但我在系统上的任何地方都找不到该记录器。我必须手动创建文件吗?如果需要,我应该把它放在哪里?

另外,log_to_syslog 似乎在监听套接字 /dev/log,当我运行 sudo lsof /dev/log 时,我得到以下信息:

[vagrant@server]$ sudo lsof /dev/log
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
rsyslogd 989 root    0u  unix 0xffff880037a880c0      0t0 8099 /dev/log

当我查看/etc/rsyslog.conf 时,我看到以下内容:

# rsyslog v5 configuration file

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

所以我在这里有点迷路了。我的 init 函数似乎在指示 python 使用名为 my_daemon 的日志文件,我在任何地方都找不到它,而 /etc/rsyslog.conf 似乎在告诉机器使用 /var/log/消息,其中不包含来自我的应用程序的任何日志。

更新:这是我尝试记录消息的方式

import os
from logger import Logger

class Server(object):

  def __init__(self, options):
    self.logger = Logger()

  def write(self, data):
    self.logger.info('Received new data from controller, applying')
    print 'hello'

server.py 中的 write 方法确实在屏幕上打印了“hello”,所以我知道我们已经接近了,只是记录器没有按照我的预期进行

【问题讨论】:

  • rsyslog.conf 中的 cmets 指定,仅记录优先级为 info 或更高的消息。您的程序是否记录此类消息?
  • 是的,我有 self.logger.setLevel(logging.INFO)
  • 哦,我没注意到。但是,我的评论仍然成立。 logger.setLevel 设置记录器的阈值,但仍然可以尝试记录不太严重的消息(例如,通过logger.debug),尽管它们被忽略了。您能否附上您希望在日志中找到的消息的实际记录尝试示例?
  • 当然,我添加了更多代码,并且我在 Logger 类中插入了一个方法。
  • 您的 init 函数并未指示将其保存在文件中,而是为您的日志注册表提供“名称”。您应该检查 rsyslog 的文件 (/var/log/messages)。

标签: python logging python-2.6 rsyslog


【解决方案1】:

my_daemon 不是日志文件 - 它只是开发人员指定的名称,表示应用程序中的“区域”。有关什么是记录器,请参阅 this 信息。

log_to_syslog 没有在套接字上侦听 - rsyslog 守护进程正在这样做。另外,我看不到log_to_syslog 的名称在哪里——是吗?如果不调用它,就可以解释为什么在 syslog 中看不到任何消息。

【讨论】:

  • 谢谢,我现在明白了,谢谢你的链接
猜你喜欢
  • 2014-12-24
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2018-11-19
  • 1970-01-01
  • 2016-01-07
相关资源
最近更新 更多