Python日志无延迟实时写入的示例


Posted in Python onJuly 11, 2019

我在用python生成日志时,发现无论怎么flush(),文件内容总是不能实时写入,导致程序意外中断时一无所获。

以下是查到的解决方案(亲测可行):

open 函数中有一个bufferin的参数,默认是-1,如果设置为0是,就是无缓冲模式。 
但是用二进制模式打开这个文件,并且把要写入的信息转换byte -like如下。
 
with open("test.txt",'wb',buffering=0) as f:
#wb是写模式加二进制模式
  f.write(b"hello!")在字符串前加b,转换成二进制
 
如果没用二进制打开文件会提示ValueEorror:
 
没把字符串转成二进制会提示:TypeError: a bytes-like object is required, not ‘str'

测试:

class Logger(object):
  def __init__(self, log_path="default.log"):
    self.terminal = sys.stdout
    # self.log = open(log_path, "w+")
    self.log = open(log_path, "wb", buffering=0)
 
  def print(self, message):
    self.terminal.write(message + "\n")
    self.log.write(message.encode('utf-8') + b"\n")
 
  def flush(self):
    self.terminal.flush()
    self.log.flush()
 
  def close(self):
    self.log.close()

报错1:TypeError: can't concat str to bytes

报错2:write需要str对象,无法写入bytes对象(大意)

这是因为:

(1)log.write需要写入bytes对象,这里没问题。但是encode返回的是bytes型的数据,不可以和str相加,需要将‘\n'前加b。

(2)terminal.write函数参数需要为str类型,转化为str。

改为:

def print(self, message):
    self.terminal.write(message + "\n")
    self.log.write(message.encode('utf-8') + b"\n")

运行成功!

以上这篇Python日志无延迟实时写入的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中请使用isinstance()判断变量类型
Aug 25 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
浅析python中的迭代与迭代对象
Oct 08 Python
pyshp创建shp点文件的方法
Dec 31 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
浅析Python 条件控制语句
Jul 15 Python
python regex库实例用法总结
Jan 03 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
深入了解Python iter() 方法的用法
Jul 11 #Python
用python给自己做一款小说阅读器过程详解
Jul 11 #Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 #Python
ML神器:sklearn的快速使用及入门
Jul 11 #Python
python 随机森林算法及其优化详解
Jul 11 #Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 #Python
python常用库之NumPy和sklearn入门
Jul 11 #Python
You might like
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
React实现全局组件的Toast轻提示效果
2018/09/21 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
JS实现小星星特效
2019/12/24 Javascript
Python采用raw_input读取输入值的方法
2014/08/18 Python
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
详解python时间模块中的datetime模块
2016/01/13 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
django基于restframework的CBV封装详解
2019/08/08 Python
Python restful框架接口开发实现
2020/04/13 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
Pamela Love官网:纽约设计师Pamela Love的精美、时尚和穿孔珠宝
2020/10/19 全球购物
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
大学学习个人的自我评价
2014/02/18 职场文书
投资合作协议书范本
2014/04/17 职场文书
Python竟然能剪辑视频
2021/05/25 Python