todd7zhang 最近的时间轴更新
todd7zhang

todd7zhang

V2EX 第 423229 号会员,加入于 2019-06-20 09:27:42 +08:00
todd7zhang 最近回复了
@f1ynnv2 看完你的回复之后,我感觉你对 python 的 logger 理解有误。
每个 py 文件都应该有自己 logger, 每个 logger 不需要自己来输出到文件,你不需要也不应该从其他模块导入一个的 logger, 它最后都会把 log record propagate 到 root logger
你只要对 root logger 配置 handler 和 formatter 就行。
然后,我的代码是给每个子进程配置了他们 root logger ,file1.pyfile2.py 并没有额外指定日志输出文件。
我认为,日志滚动不应该让 python 来做,python 就直接 logging 到 stdout 。
外面用 supervisor 来守护,同时 supervisor 来收集日志到文件,最后由 logrotate 做每天的日志滚动。
```python
# example.py
import logging
import multiprocessing
import os

_logger = logging.getLogger(__name__)

def init_logging():
# create logger
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)

# create file handler
log_file = 'my_log_{}.log'.format(os.getpid())
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(process)d - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# add file handler to logger
root_logger.addHandler(file_handler)



def start():
init_logging()
from . import file1, file2
file1.say_hello()
file2.say_hello()


def main():
processes = []
for i in range(4):
p = multiprocessing.Process(target=start)
processes.append(p)
p.start()

for p in processes:
p.join()

if __name__ == '__main__':
main()


# file1.py
import logging
_logger = logging.getLogger(__name__)

def say_hello():
_logger.info("this is hello message from file1.py")


# file2.py
import logging
_logger = logging.getLogger(__name__)

def say_hello():
_logger.info("this is hello message from file2.py")

```
子进程启动的地方,先 init_logger(), 这里面只需要设置 root logger 的 file handler 。然后其他地方使用各自 py 文件下的 logger 啊
2021-12-15 13:56:08 +08:00
回复了 IurNusRay 创建的主题 Python sqlalchemy 事务中出错没有进行回滚?
看样子是我狭隘了,一直没了解过这个。这种情况下居然不支持回滚...
2021-09-14 11:49:26 +08:00
回复了 shiyuu 创建的主题 Python 求助线程进程问题, IPy 处理 IP 网段
如果你看下这个的实现 IP('192.168.1.12') in IP('192.168.1.0/24')
就会发现实际上执行和 '192.168.1.12' in ['192.168.1.0', '192.168.1.1', ..., '192.168.1.254', '192.168.1.255'] 没区别
那这个实际执行次数就是 10w * 400 * 255

所以你可以先处理 IP 段 每一行 变成一个 set(str(i) for i in IP('192.168.1.0/24'))
然后再 '192.168.1.12' in set

实测 1000 * 400 : IP('192.168.1.12') in IP('192.168.1.0/24') 3.92s
1000* 400: '192.168.1.12' in set 18.1ms
2021-08-31 09:03:31 +08:00
回复了 admin7785 创建的主题 上海 2 号线沿线 求租房
自己往川沙找吧,看看有没有单间。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5381 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 16ms · UTC 08:46 · PVG 16:46 · LAX 01:46 · JFK 04:46
Developed with CodeLauncher
♥ Do have faith in what you're doing.