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的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
python网络编程之文件下载实例分析
May 20 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
python中子类调用父类函数的方法示例
Aug 18 Python
简单了解Python生成器是什么
Jul 02 Python
用Python配平化学方程式的方法
Jul 20 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
python烟花效果的代码实例
Feb 25 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
Python 连接 MySQL 的几种方法
Sep 09 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 ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
PHP中几种常见的超时处理全面总结
2012/09/11 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
PHP实现简易计算器功能
2020/08/28 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
JavaScript作用域链使用介绍
2013/08/29 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
使用Python中的tkinter模块作图的方法
2017/02/07 Python
python基础教程项目二之画幅好画
2018/04/02 Python
python实现最大优先队列
2019/08/29 Python
python多维数组分位数的求取方式
2020/03/03 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
东方通信股份有限公司VC面试题
2014/08/27 面试题
最新大学生自我评价
2013/09/24 职场文书
写自荐信有哪些不宜?
2013/10/17 职场文书
离婚财产处理协议书
2014/09/30 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP
golang 语言中错误处理机制
2021/08/30 Golang
Nebula Graph解决风控业务实践
2022/03/31 MySQL
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS