首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

有个坑不知道怎么绕,求方法(关于把 print 输出记录到.log 里)

  •  
  •   qazwsxkevin · 32 天前 · 1054 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1、我是用这个函数把 String 变量写入到文件的( String 主要是 html 网页代码,需要把内容转成 UTF-8,所以根据网上的例子,做了 sys.stdout,不过这个函数保存其它文本也有用到,反正是一直以来都没啥问题)

    #String 写入到 file
    def saveStrtoFiles(ffname,ffpath,tmpStr):
        fullpath = ffpath + ffname
        sys.stdout = sys.__stdout__ = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8', line_buffering=True)
        with codecs.open(fullpath, 'a+', encoding='utf-8') as f:
            f.write(tmpStr + '\r\n')
        return fullpath
    

    2、最近需要把 print 输出的内容写入到一个.log 文件里,我用了这个函数来完成

    #记录控制台内容的函数
    def consoleLog(logfilespath):
        class Logger(object):
            def __init__(self, filename="Default.log"):
                self.terminal = sys.stdout
                self.log = open(filename, "a")
    
            def write(self, message):
                self.terminal.write(message)
                self.log.write(message)
    
            def flush(self):
                pass
        sys.stdout = Logger(logfilespath)
        pass
    

    3、最近起用了上面第 2 点的记录日志函数,以前做好的 saveStrtoFiles 函数就有方法错误,提示 io 的问题:

        #建立输出日志
        SomeFunc.consoleLog((os.path.join(tarPath + ID+ '/') + ID + '.log'))
    
      File "D:\Test\SomeFunc.py", line 154, in saveStrtoFiles
        sys.stdout = sys.__stdout__ = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8', line_buffering=True)
    AttributeError: 'Logger' object has no attribute 'detach'
    

    4、请问大家,我应该如何绕开这个坑呢? 首要保证 saveStrtoFiles 存 UTF-8 的方式不变以免造成影响,print 输出记录到文件方法怎么变都可以。。。能达到目的就可以了。。,谢谢大家热心解答!

    6 回复  |  直到 2019-09-18 13:59:31 +08:00
        1
    conn4575   31 天前
    你要了解一下 logging 模块的用法,里面的 LoggerHandler 就是控制日志输出位置的组件,里面的 BasicHandler 和 FileHandler 就是你想要的
        2
    izoabr   31 天前
    威什么不直接用 logging 模块?
        3
    qsnow6   31 天前
    所以说,要熟读官方的文档,python 早期非常受欢迎的一大原因,就是它自带的 battery 非常好用
        4
    loryyang   31 天前
    重复造轮子了?
        5
    xiaofengchen   31 天前
    def log(*args, **kwargs):
    with open('a.log', 'a', encoding='utf-8') as f:
    print(*args, file=f, **kwargs)
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2208 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 10:22 · PVG 18:22 · LAX 03:22 · JFK 06:22
    ♥ Do have faith in what you're doing.