是否应该将Python记录器作为参数传递?

时间:2013-08-05 07:31:58

标签: python logging

我们正在开发的Python应用程序需要一个记录器。同事认为应该在每个使用它的班级中创建和配置记录器。我的意见是它应该在应用程序启动时创建和配置,并作为构造函数参数传递。

两种变体都有其优点,我们不确定最佳做法是什么。

3 个答案:

答案 0 :(得分:1)

我认为将logger作为参数传递并不是一个好主意。您应该将全局记录器视为自己的模块,这将是最好的主意。例如:
logger.py

import logging
log = logging.getLogger('')

classFoo.py

form logger import log
log.debug('debug message')

classBar.py

form logger import log
log.warn('warn!')

答案 1 :(得分:0)

也许这可以帮助您获得一个想法?当然你可以做得更好,从配置文件中读取设置或其他什么,但这是一个快速的例子。

用于配置日志记录的单独模块:mylogmod.py

import logging

FILENAME = "mylog.log" # Your logfile
LOGFORMAT = "%(message)s" # Your format
DEFAULT_LEVEL = "info" # Your default level, usually set to warning or error for production
LEVELS = {
    'debug':logging.DEBUG,
    'info':logging.INFO,
    'warning':logging.WARNING,
    'error':logging.ERROR,
    'critical':logging.CRITICAL}

def startlogging(filename=FILENAME, level=DEFAULT_LEVEL):
    logging.basicConfig(filename=filename, level=LEVELS[level], format=LOGFORMAT)

main.py

import logging
from mylogmod import startlogging
from myclass import MyClass

startlogging()

logging.info("Program started...")
mc = MyClass()

来自具有自检的模块的类myclass.py。您可以在单元测试中执行类似的操作:(请注意,您不需要在单元测试中导入日志记录模块,只需startlogging函数即可。这样您就可以将默认级别设置为警告或错误,单元测试和自测试调试)

import logging

class MyClass(object):
    def __init__(self):
        logging.info("Initialze MyClass instance...")

if __name__ == "__main__":
    from mylogmod import startlogging
    startlogging(level="debug")
    logging.debug("Test MyClass...")
    #... rest of test code...

答案 2 :(得分:0)

通常不会;它通常不打算作为参数传递。

惯例是在每个模块的顶部使用public class CanvasView extends View{ Paint paint = new Paint(); static int l = 500; public CanvasView (Context context, AttributeSet attrs) { super(context); paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.GREEN); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeWidth(10); } @Override public void onDraw(final Canvas canvas) { canvas.drawLine(100,100,l,100,paint); } } 。每个模块的log = logging.getLogger(__name__)值都不同。然后,__name__的结果值可以反映在每条日志消息中。