django中由类实例引起的小坑
自己封装了一个logging在django中使用,结果发现输出的时候总是重复输出,比如:
DEBUG---- 2014/03/31 10:38:13:
!!
DEBUG---- 2014/03/31 10:38:13:
!!
DEBUG---- 2014/03/31 10:38:13:
!!
DEBUG---- 2014/03/31 10:38:13:
!!
DEBUG---- 2014/03/31 10:38:13:
140091903388560
DEBUG---- 2014/03/31 10:38:13:
140091903388560
DEBUG---- 2014/03/31 10:38:13:
140091903388560
DEBUG---- 2014/03/31 10:38:13:
140091903388560
可以看出,id都是一样的。而且我查了一下,正好4个地方引入了mylog。mylog的完整代码见以前日志,这里给出导致错误的原因:
self.logger = logging.getLogger(__name__)
简单测试:
mlog = MyLog()
print id(mlog)
print id(mlog.logger)
xmlog = MyLog()
print id(xmlog)
print id(xmlog.logger)
结果如下:
123456666
123456789
123457777
123456789
可以看出虽然类id不同,不过核心的logger却是一个。因为我们执行runserver后,__name__
就确定为mylog了,所以不管我们引用的时候如何写,__name__
不变则都指向了同一个logger。更简单的例子如下:
In [1]: x = 1
In [2]: y = 1
In [3]: id(x)
Out[3]: 11279464
In [4]: id(y)
Out[4]: 11279464
更细节的原因可以看《python源码分析》。
改起来就让__name__
不一样就解决了。比如:
self.logger = logging.getLogger(str(uuid.uuid4()))