V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
qazwsxkevin
V2EX  ›  Python

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

  •  
  •   qazwsxkevin · 2019-09-17 18:15:51 +08:00 · 2633 次点击
    这是一个创建于 1926 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    conn4575
        1
    conn4575  
       2019-09-17 18:35:10 +08:00
    你要了解一下 logging 模块的用法,里面的 LoggerHandler 就是控制日志输出位置的组件,里面的 BasicHandler 和 FileHandler 就是你想要的
    izoabr
        2
    izoabr  
       2019-09-17 18:35:15 +08:00
    威什么不直接用 logging 模块?
    qsnow6
        3
    qsnow6  
       2019-09-17 18:55:05 +08:00
    所以说,要熟读官方的文档,python 早期非常受欢迎的一大原因,就是它自带的 battery 非常好用
    loryyang
        4
    loryyang  
       2019-09-17 19:02:00 +08:00
    重复造轮子了?
    xiaofengchen
        5
    xiaofengchen  
       2019-09-18 08:51:21 +08:00
    def log(*args, **kwargs):
    with open('a.log', 'a', encoding='utf-8') as f:
    print(*args, file=f, **kwargs)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6017 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:55 · PVG 09:55 · LAX 17:55 · JFK 20:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.