免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6755 | 回复: 11

python多线程无法写入日志 [复制链接]

论坛徽章:
0
发表于 2014-08-29 17:24 |显示全部楼层
一个简单的测试,两个线程,在线程中打印日志,日志打印到文件中,发现多线程无法打印日志。
thread1.py代码如下:
  1. import logger.log
  2. import threading
  3. import t

  4. log = logger.log.Logger.getLogger(__name__)

  5. def thread1():
  6.     t.test('1')

  7. def thread2():
  8.     t.test('2')


  9. if __name__ == '__main__':
  10.     log.debug('start main')
  11.     t1 = threading.Timer(10.0, thread1)
  12.     t1.start()
  13.     t2 = threading.Timer(10.0, thread2)
  14.     t2.start()

  15.     t1.join()
  16.     t2.join()
复制代码
t.py代码如下:
  1. import logging
  2. import logging.config

  3. logging.config.fileConfig('../conf/log.conf')
  4. log = logging.getLogger(__name__)

  5. def test(name):
  6.     log.debug( 'thread' + name)
复制代码
日志配置文件如下:
  1. # logger configure file

  2. [loggers]
  3. keys=root,example

  4. [handlers]
  5. keys=consoleHandler,rotateFileHandler

  6. [formatters]
  7. keys=simpleFormatter

  8. [formatter_simpleFormatter]
  9. format=[%(asctime)s][%(levelname)s][%(name)s][%(filename)s:%(lineno)s]:%(message)s

  10. [logger_root]
  11. level=DEBUG
  12. handlers=consoleHandler,rotateFileHandler

  13. [logger_example]
  14. level=DEBUG
  15. handlers=consoleHandler,rotateFileHandler
  16. qualname=example
  17. propagate=0

  18. [handler_consoleHandler]
  19. class=StreamHandler
  20. level=DEBUG
  21. formatter=simpleFormatter
  22. args=(sys.stdout,)

  23. [handler_rotateFileHandler]
  24. class=handlers.RotatingFileHandler
  25. level=DEBUG
  26. formatter=simpleFormatter
  27. args=('hcagent.log', 'a', 200000, 10)
复制代码
结果打印的日志如下:
  1. [2014-08-29 16:48:16,132][DEBUG][__main__][thread1.py:17]:start main
  2. [2014-08-29 17:14:59,849][DEBUG][__main__][thread1.py:17]:start main
  3. [2014-08-29 17:15:59,180][DEBUG][__main__][thread1.py:17]:start main
  4. [2014-08-29 17:16:40,759][DEBUG][__main__][thread1.py:17]:start main
  5. [2014-08-29 17:20:26,417][DEBUG][__main__][thread1.py:17]:start main
复制代码
问题:按理说在t.py里边打印的日志,应该能够打到hcagent.log里边?可是为什么没有呢?多线程需要做什么特殊处理?
恳请各位大神赐招

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2014-08-29 19:33 |显示全部楼层
据说python多线程无法使用多core,与单线程性能一样?楼主正好测试下,看网上传言是否属实。

论坛徽章:
0
发表于 2014-08-29 21:21 |显示全部楼层
本帖最后由 whitelotus19 于 2014-08-30 09:58 编辑

..........

论坛徽章:
0
发表于 2014-08-30 08:46 |显示全部楼层
没太看懂什么意思?能给点提示吗?
我t.py也有自己的日志设置的呀

回复 3# whitelotus19


   

论坛徽章:
0
发表于 2014-08-30 10:19 |显示全部楼层
我在3楼的回复没注意看你的代码,只是大概看了下你的描述,一下理解错了。

我没有用过日志配置文件的方式,我这样试了下好像可以的吧:

thread1.py内容:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. import logging
  4. import logging.handlers
  5. #import logger.log
  6. import threading
  7. import t

  8. #log = logger.log.Logger.getLogger(__name__)
  9. log = logging.getLogger(__name__)
  10. log.setLevel(logging.DEBUG)
  11. logfn='e:/temp/python/test/main.log'
  12. hd = logging.handlers.RotatingFileHandler(logfn,maxBytes=10000000,backupCount=5)
  13. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s :: %(message)s')
  14. hd.setFormatter(formatter)
  15. log.addHandler(hd)


  16. def thread1():
  17.     t.test('1')

  18. def thread2():
  19.     t.test('2')


  20. if __name__ == '__main__':
  21.     log.debug('start main')
  22.     t1 = threading.Timer(10.0, thread1)
  23.     t1.start()
  24.     t2 = threading.Timer(10.0, thread2)
  25.     t2.start()

  26.     t1.join()
  27.     t2.join()
复制代码
t.py内容:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. import logging
  4. import logging.config

  5. #logging.config.fileConfig('./log.conf')
  6. log = logging.getLogger(__name__)
  7. log.setLevel(logging.DEBUG)
  8. logfn='e:/temp/python/test/thread.log'
  9. hd = logging.handlers.RotatingFileHandler(logfn,maxBytes=10000000,backupCount=5)
  10. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s :: %(message)s')
  11. hd.setFormatter(formatter)
  12. log.addHandler(hd)

  13. def test(name):
  14.     log.debug( 'thread' + name)
复制代码
运行thread1.py后,看到的日志文件内容如下:
main.log里的:
2014-08-30 10:12:20,157 - __main__ - DEBUG :: start main

thread.log里的:
2014-08-30 10:12:30,157 - t - DEBUG :: thread2
2014-08-30 10:12:30,157 - t - DEBUG :: thread1

不知道是不是这个意思?

论坛徽章:
0
发表于 2014-08-30 14:39 |显示全部楼层
这样可以了,但是有一个问题,我把程序封装成一个Windows服务程序后,又不能打印了。不知道为什么。
回复 5# whitelotus19


   

论坛徽章:
0
发表于 2014-08-30 21:14 来自手机 |显示全部楼层
我看了下以前写的程序,应该可以的阿,逻辑结构大体跟你的程序相同,只是我是用的我前面贴的代码的那种写日志的方式,没有用配置文件的方式。

论坛徽章:
0
发表于 2014-08-31 15:25 |显示全部楼层
本帖最后由 whitelotus19 于 2015-03-14 16:19 编辑

我写了个demo
http://lotus.pixub.com/?p=438
如果有不对的地方欢迎指正

论坛徽章:
0
发表于 2014-09-18 12:32 |显示全部楼层
whitelotus19 发表于 2014-08-31 15:25
我写了个demo
如果有不对的地方欢迎指正


非常感谢,这样就可以了。

还有个问题,请问你知道linux 的服务程序怎么写吗??我不太会

论坛徽章:
0
发表于 2014-09-26 20:31 |显示全部楼层
whitelotus19 发表于 2014-08-31 15:25
我写了个demo
如果有不对的地方欢迎指正



一下是从你demo里边摘下来的日志,有个问题,想问一下,为什么这些日志都是打印的两行呢???
2014-08-31 15:08:07,545 – thread – INFO :: thread1: 0 info
2014-08-31 15:08:07,545 – thread – INFO :: thread2: 0 info
2014-08-31 15:08:07,561 – thread – INFO :: thread2: 1 info
2014-08-31 15:08:07,561 – thread – INFO :: thread1: 1 info
2014-08-31 15:08:07,576 – thread – INFO :: thread2: 2 info
2014-08-31 15:08:07,576 – thread – INFO :: thread1: 2 info
2014-08-31 15:08:07,592 – thread – INFO :: thread1: 3 info
2014-08-31 15:08:07,592 – thread – INFO :: thread2: 3 info
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP