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 def函数的定义、使用及参数传递实现代码
Aug 10 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
Python与Java间Socket通信实例代码
Mar 06 Python
python实现聚类算法原理
Feb 12 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
python实现猜数字游戏
Mar 25 Python
python实现批量处理将图片粘贴到另一张图片上并保存
Dec 12 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 Python
浅谈Python里面None True False之间的区别
Jul 09 Python
详解python对象之间的交互
Sep 29 Python
Python之基础函数案例详解
Aug 30 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
PHPMailer安装方法及简单实例
2008/11/25 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
Python 正则表达式操作指南
2009/05/04 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
使用Tkinter制作信息提示框
2020/02/18 Python
如何写python的配置文件
2020/06/07 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
元旦晚会感言
2014/03/12 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
新手上路标语
2014/06/20 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
家庭贫困证明
2014/09/23 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
HDFS免重启挂载新磁盘
2022/04/06 Servers