1
iyaozhen 2016-11-08 11:00:34 +08:00 via Android
这就是两种打日志的风格了。
一种是 access.log 一种是 access.log.2016110810 看日志框架的类型了,一般都支持自己滚动日志。 不过一般第一种用的多, op 会自己配置日志切分程序,先 mv 重命名日志,然后再给写日志的进程发一个啥信号,然后程序会自动在原来的位置再起一个新文件打日志。 |
2
knightdf 2016-11-08 11:08:58 +08:00
python 自带的 TimedRotatingFileHandler 本来就在多进程下有 bug,会误删日志.得自己重写 doRollover 函数
|
3
doer233 2016-11-08 11:10:26 +08:00 via Android
python 新手请教个问题,生产项目的 log 代码直接写在生产代码里面吗?
|
4
lostarray 2016-11-08 12:48:36 +08:00 via iPhone 2
如果是在 Linux 下,可以考虑用 syslog 和 logrotate
|
5
onlyice 2016-11-08 12:50:14 +08:00
Python 的官方文档有提到这个问题: https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes
QueueHandler 可以解决这个问题。它是在 Python 3 中加入的; Python 2 中没有,但是也可以搜到类似代码。 |
6
yanchao7511461 2016-11-08 13:13:15 +08:00
借楼问个问题
一般 python 的 traceback 是出错定位的重要信息。但是一个程序里面 我又不想用 try... 能不能想办法把这个错误信息保存下来。看到具体哪行出错。 是不是除了 2 >&1 没办法了? |
7
onlyice 2016-11-08 15:16:17 +08:00 via Android
@yanchao7511461 logging 里面的 logger.exception 函数
|
8
yanchao7511461 2016-11-08 19:32:10 +08:00
@onlyice 不太明白怎么用...我用 logger 一般都是 try 。。。。 excetion logger.error(" xxx error !!").都是通过 try 然后输出信息的... 所以一旦我的程序后台运行的,某一个我没想到的位置崩溃了。我就看不到 traceback 了.... 能给个例子 说一下 logger.exception 怎么用么
|
9
onlyice 2016-11-08 19:39:54 +08:00 1
@yanchao7511461 啊,我读题没读仔细。。
logger.exception 函数可以把 traceback 也打印下来。 但是对于未捕获的异常,你可以修改 sys.excepthook 来自定义行为: https://docs.python.org/2/library/sys.html#sys.excepthook 但是我不确定是不是好的实践。。感觉可以看看 Sentry 怎么做 |
10
kier OP @knightdf 嗯,如果按照我帖子里描述的方法,多进程也是没有问题的,只是我在网上居然没有发现有哪怕一个人是用这种方式的,所以觉得很诧异!因为我的理解,对于中小型项目,这种方法的开发运维成本是最低的!
|
11
kier OP @yanchao7511461 @onlyice 无法预知的 exception 没有必要自己去 try catch ,就让它落到 stderr 就 ok 了,而对于服务端程序这类需要常驻运行的,一般在最外层会捕获异常,并输出的
|
12
onlyice 2016-11-08 21:34:18 +08:00
@kier 嗯是的,只是 @yanchao7511461 的场景是他不想去 try catch ,所以可能 sys.excepthook 有作用
|
13
fengclient 2016-11-08 22:35:09 +08:00 via iPhone
同意上面说的 syslog/rsyslog ,可以很好解决多点写入的问题,这也是大型系统的标准操作吧。
|
15
ericls 2016-11-09 01:44:35 +08:00
用个 queue 来专门写日志
|
16
restran 2016-11-09 08:39:17 +08:00
试一下 ConcurrentLogHandler
http://www.restran.net/2015/08/19/python-concurrent-logging/ |
18
zjq426 2016-11-09 16:03:25 +08:00
@kier https://github.com/zhujiaqi/pycrabapi/tree/master/miscs/logger
我前前东家的项目里面刚好也有这个东西,在前前同事们的授意下我给他开源了 |
19
heqingpan 2016-11-09 20:13:13 +08:00
@kier
http://www.cnblogs.com/shizioo/p/python_logging_handler_custom.html --- import logging import os,os.path import datetime _filefmt=os.path.join("logs","%Y-%m-%d","%H.log") class MyLoggerHandler(logging.Handler): def __init__(self,filefmt=None): self.filefmt=filefmt if filefmt is None: self.filefmt=_filefmt logging.Handler.__init__(self) def emit(self,record): msg=self.format(record) _filePath=datetime.datetime.now().strftime(self.filefmt) _dir=os.path.dirname(_filePath) try: if os.path.exists(_dir) is False: os.makedirs(_dir) except Exception: print "can not make dirs" print "filepath is "+_filePath pass try: _fobj=open(_filePath,'a') _fobj.write(msg) _fobj.write("\n") _fobj.flush() _fobj.close() except Exception: print "can not write to file" print "filepath is "+_filePath |