面试宝典_Python.运维开发.0004.用Python实现tail实时输出新增日志?

面试题目:

1. 用PYTHON实现tail -f功能,默认显示最后15行,实时输出新增行?

解题思路:

1. 此需求在很多场景中都有遇到,而且在各大群中也被讨论过,虽然有现成的模版如pyinotify等模块实现,但面试更想通过你的解题思路来判断这场面试,具体到tail需要实现2个功能,一个实时输出新增内容,一个默认输出前15行,前者直接循环打开文件读取,全局变量中记录上次读取的位置,下一次循环seek到上次的位置读取即可,而对于默认显示前15行的做法是假设一行1000个字节,循环读取,当文件总长度小于1000时则从开头开始读取分割行取出后10行即可,即使不够10行也没关系,当文件总长度大于等于1000时,如果分割后大于10行,则读取分割行取出后10行即可,如果小于10行则继续向前1000个读取,以此类推~

具体实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# 51CTOBG: http://xmdevops.blog.51cto.com/
# Purpose:
#
"""
from __future__ import absolute_import
# 说明: 导入公共模块
import os 
import sys
import time
import chardet
# 说明: 导入其它模块
# 

if __name__ == ‘__main__‘:
    seekps = 0;
    target = ‘data.txt‘;

    try:
        # 指针跳到最后作为起读位置
        with open(target, ‘r+b‘) as f:
            f.seek(0, os.SEEK_END)
            seekps = f.tell()
            print ‘notice: file length is‘, seekps
            rest_lines = []
            # 默认读取15行
            line_reads = 15
            # 假设默认每行1000字节
            line_bytes = 1000
            ‘‘‘
            1. 当f_length < line_bytes,就seek到0开始读取,读完break
            2. 当f_length > line_bytes,换行符数n表示n+1行
               => 当n+1 >= line_reads,取出其中前line_reads个元素
               => 当n+1 <  line_reads,继续向前seek到count*line_reads位置读取
            ‘‘‘
            count = 1
            while True:
                if seekps <= line_bytes*count:
                    f.seek(0)
                    rest_lines = f.read().split(os.linesep)[-line_reads:]
                    break
                f.seek(-1*line_bytes*count, 2)
                rest_lines = f.read().split(os.linesep)
                if len(rest_lines)>=line_reads:
                    rest_lines = rest_lines[-line_reads:]
                    break
                else:
                    count += 1

            for line in rest_lines:
                code = chardet.detect(line).get(‘encoding‘)
                line = line.decode(code).encode(sys.stdout.encoding)
                sys.stdout.write(‘‘.join([line.strip(), os.linesep]))
                sys.stdout.flush()

    except Exception, e:
        print ‘notice: open file with error({0})‘.format(e)
        exit()

    print ‘notice: start position is‘, seekps
    while True:
        try:
            with open(target, ‘r+b‘) as f:
                f.seek(0, os.SEEK_END)
                # 防止数据被意外截断
                if f.tell()<seekps:
                    f.seek(f.tell())
                else:
                    f.seek(seekps)

                while True:
                    line = f.readline()
                    if not line.strip():
                        break
                    code = chardet.detect(line).get(‘encoding‘)
                    line = line.decode(code).encode(sys.stdout.encoding)
                    sys.stdout.write(‘‘.join([line.strip(), os.linesep]))
                    sys.stdout.flush()
                seekps = f.tell()
        except Exception, e:
            print ‘notice: open file with error({0})‘.format(e)
            break
        time.sleep(0.1)

有图有像:

时间: 2024-10-25 00:12:48

面试宝典_Python.运维开发.0004.用Python实现tail实时输出新增日志?的相关文章

基础入门_Python-模块和包.运维开发中日志模块logging的最佳实践?

简单介绍: 说明: 此模块儿提供了文件,HTTP GET/POST,SMTP,SOCKET等方式实现日志记录,甚至可以自动实现具体的日志记录方式 快速安装: pip install --upgrade logging 处理流程: 日志级别: 属性名称 属性说明 logging.NOTSET 默认为0 logging.DEBUG 调试为10 logging.INFO 一般为20 logging.WARN 警告为30 logging.ERROR 错误为40 logging.CRITICAL 严重为5

办公管理支撑流程能力PaaS平台运维开发软件需求设计方案

1.概述 办公管理支撑流程能力PaaS平台(以下文中简称"能力平台")运维开发是指基于Cordys BOP 4 PaaS平台,通过二次开发,为运维开发人员提供快速支撑办公管理流程开发.实施.再造的能力,也为管理流程全生命周期管理提供数据支撑能力.管理目标及软件需求如下: (1)开发/运维人员 开发/运维人员是指系统平台管理人员.运维人员,例如:省公司与地市公司信息化系统管理员.开发/运维人员为专业信息化管理员,都是受过专业计算机教育,懂计算机软件维护.开发,但是,不是专业程序员,也就是

运维和运维开发

国内做运维的人,很多觉得开发很神秘很难 国内做开发的人,很多觉得运维就是搬机器收报警,脏活累活7*24随时等待召唤 相互都把对方理解错了. 以我多年的经验来看,国内的运维的确存在很多问题.比如,开发人员被宠的太厉害,运维人员话语权少.由于人力便宜,在自动化运维方面重视不够.等等. 这样造成一个印象,运维围着开发转,运维只能干累活脏活,待遇还比开发低. 国外反过来.最突出的一个方向,dev-ops,运维开发.要求又有系统管理经验,又懂底层又懂运维,又会开发. 这种人比普通开发的收入还高. 简单来说

python运维开发笔记4

1.函数如何被调用,通过return返回值来调用 2.生成器和return区别 yield 生成器返回对象,可以迭代 可以执行 glob模块 类似shell中的正则匹配 shlex模块  Popen 将命令参数直接分词 cmd = "ps ax -o pid,ppid,cmd" shlex.split(cmd) ['ps','ax','-o','pid,ppid,cmd'] ['mysql','-u','root','-p123','-e','show processlist'] p

python运维开发笔记5

diff -Nur Diff和patch是Linux标配的工具.在Windows上,也有移植的版本可以使用. 使用中注意: 1.保证文件名完全相同,避免只有大小写不同的文件存在. 2.Diff只能比较文本文件,二进制文件只能判断是否相同,不能记录差异.Diff根据文件的前几个字节判断文件是不是文本文件. 使用方法: 可以对单个文件或者整个目录树进行处理. 以最实用的方式举例: diff –Nur dir_old dir_new > dir.patch patch –p0 < dir.patch

老男孩python高级运维开发课程

L老男孩培训-python培训二期lesson01(11节)01-第一天内容介绍及课前思想02-python介绍及发展03-python 发展04-python安装05-python编程风格06-raw_input用户交互07-用户交互及格式化输出08-python流程控制if_for_while09-python练习程序_员工信息表10-python练习程序_员工信息表_基本实现11-员工信息表_脚本bug处理 L老男孩培训-python培训二期lesson02(9节)01-学生作业讲解展示0

Python自动化运维开发活动沙龙(2015-07-11周六)

Python自动化运维开发活动沙龙 2015-07-11(周六) 场地限制,最多仅限50人参加,报名从速! 亲,已是2015年了,做为运维工程师的你还在手动装机器.配服务.看监控.帮开发人肉上线么?还在发愁如何把每天重复的工作自动化起来么?还在想对开源软件进行二次开发定制却无能为力么?还在对开发人员提出的各种无理需求想进行反驳却因为自己不懂开发却被人鄙视么?还在为自己天天努力工作.到处救火却每月只能挣个十来K而感到不爽么? Maybe yes,maybe no! 但是不要不爽了,你的工资不高是因

Python运维开发基础

Python基础知识分为以下几块 1.Python概述 2.基础语法 3.数据结构 4.Python进阶 5.实训案例 一.Python概述 1.Python简介 2.Hello World 3.搭建开发环境 4.习题 Python简介 尽管我是学计算机出身的,但是我对Python的认识是在毕业后.Python是我喜欢的语言,简洁,优美,容易使用.重要的一点是他是开源的项目. 官方网站 https://www.python.org 学习网站 http://www.okpython.com 对于简

老男孩运维开发最新毕业项目邀你来战

一不小心,老男孩Python运维开发6期班即将毕业了,大家都知道,每期毕业时都有一个做运维平台的大项目,老男孩PY课程经过2年共6期的演变,课程内容不断的更新和完善,总课程时长由最初的10天扩展至如今的16-18天,并且第6期的毕业项目内容做了很多的更新和优化,使之更符合企业的实际需求.为了让之前几期的童鞋也享受到课程更新带来的好处,本校决定,6期的毕业项目对前几期所有老男孩PY项目学员免费开放,欢迎大家来参加面授课程,课程内容如下: 项目内容: 1.   开发CMDB资产数据库,实现资产数据的