gpt4 book ai didi

python 日志记录对象日志仅在 _init_ 方法内部起作用

转载 作者:太空宇宙 更新时间:2023-11-03 14:13:16 24 4
gpt4 key购买 nike

尝试在 python deamon 类中使用日志记录,这里是父 deamon 类和派生类

import sys, os, time, atexit, signal
import logging.handlers

logger = logging.getLogger(__name__)
fh = logging.handlers.RotatingFileHandler('./logs/application.log', maxBytes=10240, backupCount=5)
fh.setLevel(logging.INFO) # no matter what level I set here
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

class Deamon:
"""A generic daemon class.

Usage: subclass the daemon class and override the run() method."""

def __init__(self, pidfile):
self.pidfile = pidfile
logger.info('INFO')
logger.error('ERROR')
def daemonize(self):
"""Deamonize class. UNIX double fork mechanism."""
try:
pid = os.fork()
if pid > 0:
# exit first parent
sys.exit(0)
except OSError as err:
logger.error('We have a problem')
sys.stderr.write('fork #1 failed: {0}\n'.format(err))
sys.exit(1)

# decouple from parent environment
os.chdir('/')
os.setsid()
os.umask(0)

# do second fork
try:
pid = os.fork()
if pid > 0:
# exit from second parent
sys.exit(0)
except OSError as err:
sys.stderr.write('fork #2 failed: {0}\n'.format(err))
sys.exit(1)

# redirect standard file descriptors
sys.stdout.flush()
sys.stderr.flush()
si = open(os.devnull, 'r')
so = open(os.devnull, 'a+')
se = open(os.devnull, 'a+')

os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())

# write pidfile
atexit.register(self.delpid)

pid = str(os.getpid())
with open(self.pidfile, 'w+') as f:
f.write(pid + '\n')

def delpid(self):
os.remove(self.pidfile)

def start(self):
"""Start the daemon."""
logger.info('start the deamon')
# Check for a pidfile to see if the daemon already runs
try:
with open(self.pidfile, 'r') as pf:
pid = int(pf.read().strip())
except IOError:
pid = None

if pid:
message = "pidfile {0} already exist. " + \
"Daemon already running?\n"
sys.stderr.write(message.format(self.pidfile))
sys.exit(1)

# Start the daemon
self.daemonize()
self.run()

派生:

#!/usr/bin/env python

import sys, time
from Deamon import Deamon
import logging.handlers

logger = logging.getLogger(__name__)
fh = logging.handlers.RotatingFileHandler('./logs/application.log', maxBytes=10240, backupCount=5)
fh.setLevel(logging.INFO) # no matter what level I set here
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
class MyDaemon(Deamon):
def run(self):
while True:
time.sleep(1)
logger.info('Inside Running Method')

它只能在父类的init方法中工作我期望 tailf -f application.log 文件并查看日志消息。我怎样才能让它发挥作用?

我还想知道是否可以将记录器传递给派生,以便派生中不需要 redfine 日志记录对象我也在 pycharm 中调试它,没有异常(exception),它在 run 方法中循环但不记录日志。

最佳答案

您应该创建一个指向您的日志对象的局部变量。来自 logging docs :

Multiple calls to getLogger() with the same name will always return a reference to the same Logger object.

因此,首先设置了记录器对象,然后无论您想要在何处记录某些内容,都可以调用 getLogger()。在您的类(class)中,最好在 __init__ 中完成并创建一个实例属性,即:

self.log = logging.getLogger()

关于python 日志记录对象日志仅在 _init_ 方法内部起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48356422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com