自己封装了一个logging在django中使用,结果发现输出的时候总是重复输出,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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__)

简单测试:

1
2
3
4
5
6
mlog = MyLog()
print id(mlog)
print id(mlog.logger)
xmlog = MyLog()
print id(xmlog)
print id(xmlog.logger)

结果如下:

1
2
3
4
123456666
123456789
123457777
123456789

可以看出虽然类id不同,不过核心的logger却是一个。因为我们执行runserver后,__name__就确定为mylog了,所以不管我们引用的时候如何写,__name__不变则都指向了同一个logger。更简单的例子如下:

1
2
3
4
5
6
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()))