一个可以直接使用的用于python日志记录的类

2023-05-16

一个用于Python3程序的日志记录类,使用的时候,将该类import进去后,按照这里面的最后两行的测试程序使用即可。程序贴在这里,省的以后造轮子。

Github:https://github.com/tomeasure/Logger-py/tree/master

更新:使用了一个自定义的FileHandler类。
功能说明
根据指定的文件名,创建一个符号链接,指向当前时间的日志文件。
举例来说

  • 假设当前时间是2019年6月6日10时36分23秒,在创建日志类的时候指定文件名是test_log.log,则程序将创建一个符号链接test_log.log,其指向当前的日志文件test_log.log.2019060610
    当程序不中断,且时间来到2019年6月6日11时0分0秒的时候,程序将创建新的日志文件test_log.log.2019060611,并将修改符号链接test_log.log指向这个新文件,而日志也将在新文件中得到保存。
    详细的变化,可以参考https://github.com/tomeasure/Logger-py/commit/243605919eceec25dc0f6f6a39760771a1fce90f#diff-3000fb145a56b8b3c44b6da2269d8c23
$ ls log/
test_log.log -> test_log.log.2019060611
test_log.log.2019060610
test_log.log.2019060611
  • 代码:
#! encoding=utf-8

import logging
import time
import os

class MyFileHandler(logging.FileHandler):
    def __init__(self, filename, mode='a', encoding=None, delay=0):
        #self.__timeformat__ = "%Y%m%d%H%M"
        self.__timeformat__ = "%Y%m%d%H"
        self.rawFilename = filename
        self.latestTime = time.strftime(self.__timeformat__, time.localtime())
        self.filename = "%s.%s" % ( filename, self.latestTime )
        self.mode = mode
        self.encoding = encoding
        self.delay = delay
        self.baseFilename = os.path.abspath(self.filename)
        self.__createFile()
        super(MyFileHandler, self).__init__(self.rawFilename, mode, encoding, delay)
    def close(self):
        logging.FileHandler.close(self)
    def _open(self):
        return logging.FileHandler._open(self)
    def emit(self, record):
        currentTime = time.strftime(self.__timeformat__, time.localtime())
        if currentTime != self.latestTime:
            self.latestTime = currentTime
            self.filename = "%s.%s" % (self.rawFilename, self.latestTime)
            self.__createFile()
        logging.FileHandler.emit(self, record)
    def __createFile(self):
        if not os.path.exists(self.filename):
            with open(self.filename, "w") as fout:
                pass
        self.baseFilename = os.path.abspath(self.filename)
        if not os.path.exists(self.rawFilename):
            os.symlink(self.baseFilename, self.rawFilename)
        elif not os.path.islink(self.rawFilename):
            os.remove(self.rawFilename)
            os.symlink(self.baseFilename, self.rawFilename)
        elif os.path.realpath(self.rawFilename).split(".")[0] != self.filename.split(".")[0]:
            os.remove(self.rawFilename)
            os.symlink(self.baseFilename, self.rawFilename)
            self.stream = super(MyFileHandler, self)._open()

class Logger():
    def __init__(self, logname):
        '''
           指定保存日志的文件
           将日志存入到该文件中
        '''
        # 创建一个logger
        self.logger = logging.getLogger()
        self.logger.setLevel(logging.DEBUG)
        # 创建一个handler,用于写入日志文件
        #fh = logging.FileHandler(logname)
        fh = MyFileHandler(logname)
        fh.setLevel(logging.DEBUG)
        # 定义handler的输出格式
        string = '[%(levelname)s %(asctime)s %(process)d %(pathname)s:%(lineno)d %(funcName)s] %(message)s'
        formatter = logging.Formatter(string)
        fh.setFormatter(formatter)
        # 给logger添加handler
        self.logger.addHandler(fh)
    def createLogger(self):
        return self.logger

def getLogger(logname):
    logger = Logger(logname)
    return logger.createLogger()

def testLogger1():
    logger.warning("ceshi")

def testLogger2():
    logger.warning("这是一个简单的测试")
    logger.warning("这是一个简单的测试")


if __name__ == "__main__":
    # 程序将会被记录在文件 testfile.log 中
    #logger = Logger(logname='testfile.log').createLogger()
    logger = getLogger("log/testfile.log")
    for i in range(180):
        testLogger1()
        testLogger2()
        time.sleep(1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个可以直接使用的用于python日志记录的类 的相关文章

  • 使用 MongoDB 作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

    我们目前正在为一家专业公司内部实施类似 CRM 的解决方案 由于存储信息的性质以及信息的不同值和键 我们决定使用文档存储数据库 因为它完全适合目的 在本例中我们选择 MongoDB 作为此 CRM 解决方案的一部分 我们希望存储实体之间的关
  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 带有 LSTM 的 GridSearchCV/RandomizedSearchCV

    我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数 我的代码如下 X train X train reshape X train shape 0 1 X train shape 1 X test X test
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • 如何在 Flask 中的视图函数/会话之间传递复杂对象

    我正在编写一个 Web 应用程序 当 且仅当 用户登录时 该应用程序从第三方服务器接收大量数据 这些数据被解析为自定义对象并存储在list 现在 用户在应用程序中使用这些数据 调用不同的视图 例如发送不同的请求 我不确定什么是最好的模式在视
  • python 对浮点数进行不正确的舍入

    gt gt gt a 0 3135 gt gt gt print 3f a 0 314 gt gt gt a 0 3125 gt gt gt print 3f a 0 312 gt gt gt 我期待 0 313 而不是 0 312 有没有
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • RGB 透明度 对应代码

    透明度具体对应百分比 xff1a 100 FF 95 F2 90 E6 85 D9 80 CC 75 BF 70 B3 65 A6 60 99 55 8C 50 80 45 73 40 66 35 59 30 4D 25 40 20 33
  • adb shell查看顶部的activity

    adb shell dumpsys activity top dumpsys activity activities 该指令用来查看堆栈也是极好的 xff0c 这样就很清晰的分析出当前页面的跳转和创建的情况 xff0c 方便查找问题的出错点
  • html布局(Layout)

    一列布局 1 页面内容区域有一个固定宽度 2 页面内容区域在浏览器窗口中自动适应居中 实现方式 xff1a box widht 自定义 xff1b margin 0 auto 固定宽度设置 1 以主流的分辨率来判断 二列布局 xff08 1
  • C# Button 按钮控件

    目录 1 工具箱添加按钮 2 代码添加按钮 2 1 方法一 xff1a 绑定事件 xff08 43 61 new EventHandler xff08 xff09 xff09 2 2 使用lamada表达式添加 1 工具箱添加按钮 xff0
  • 制作U盘启动盘变成两个盘符怎么办

    很多朋友在给电脑重装系统时都是通过U盘制作启动盘来操作的 xff0c 不知道大家有没有遇到过在制作启动盘时 xff0c 盘符变成两个的情况呢 xff1f 这里就和大家分享一下如何解决这个问题吧 更多重装系统教程尽在小白系统重装官网 系统 x
  • Maven连接MySQL数据库

    配置Maven 1 官网下载maven包 xff0c 解压到英文路径下 xff0c 找到conf文件夹中的settings xml文件 xff0c 打开后添加本地仓库的路径 xff1a 再添加阿里maven的镜像网址 xff1a 配置完成后
  • 任务栏图标消失怎么办?三种方法教你快速恢复

    最近许多小伙伴在更新了操作系统之后 xff0c 发现自己的电脑任务栏图标全部都消失了 xff0c 不知道怎么显示出来 xff0c 非常的影响使用 更多电脑教程在这里 方法一 xff1a 1 首先按下快捷键 ctrl 43 shift 43
  • Win10怎么搜索文件内容?Win10通过文件内容查找文件的方法

    Win10怎么搜索文件内容 xff1f 有些朋友电脑里的文件很多 xff0c 想要找到某个文件 xff0c 但是不记得文件名 xff0c 只知道里面是有关什么的内容 xff0c 想要通过搜索里面的文字内容来找到具体的文件 xff0c 今天介
  • vista系统重装下载安装教程

    平常我们使用的电脑操作系统基本都是windows系统 xff0c win7 10 11甚至是xp都是较为常用的操作系统 xff0c 而其它的心态比如说vista系统也是有用户在使用的 xff0c 那么该如何安装这个系统呢 xff1f 下面给
  • 电脑重装系统后找不到硬盘怎么办

    有网友的win10系统电脑出了系统故障进行了重装 xff0c 但是又发现了重装系统后找不到硬盘的新问题 xff0c 那么重装系统后找不到硬盘怎么办呢 工具 原料 xff1a 系统版本 xff1a win10专业版 品牌型号 xff1a 戴尔
  • Linux客户端挂载nas存储

    在Linux操作系统中 xff0c 可以使用NFS xff08 Network File System xff09 协议将NAS设备的共享文件系统挂载到本地计算机上 以下是使用NFS挂载NAS设备的步骤 xff1a 确认NAS设备已经正确配
  • 合理使用CSDN-markdown编辑器进行转载

    转载自 xff1a https blog csdn net My daily life article details 108773671 前言 作为DSCN博客用户小萌新 xff0c 有可能自己写的博客还不够好 xff0c 或者当看到别人
  • python中break和continue的区别

    python中break和continue的区别 break 应用在循环中 xff0c 结束当前循环 continue 应用在循环中 xff0c 结束当前正在执行的循环 xff0c 继续下一次循环 实例 xff1a 统计100 200之间的
  • Ubantu基础指令大集合

    Ubantu基础指令大集合 1 打开ubantu终端 Ctrl 43 alt 43 T 2 定位到需要操作的文件夹cd cd home drl document 3 查询同级目录下其他文件夹tab 按下tab 4 查看该文件夹下有什么文件l
  • Shell脚本代码编写规则

    Shell脚本代码编写规则 Shell解释器 解释器 xff08 例如 xff1a bin bash xff09 2 Shell的变量类型 环境变量 Shell环境下已经存在的一些系统变量 xff0c eg PWD UID PATH 自定义
  • HTML基本表格的使用

    基本表格的使用 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt 基本表格 lt title gt lt head
  • 华为私有云平台FusionCompute搭建

    一 FusionCompute架构 架构CNA作为虚拟化操作系统 xff0c VRM作为虚拟化管理平台 正常主机都安装CNA xff0c 单独建立VRM集群作为管理集群 xff0c 我测试环境就一台主机 xff0c 所以CNA和VRM装在同
  • HTML中的表格合并

    HTML中的表格合并 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt lt title gt lt head gt
  • vba 正则表达式

    群友分享的 xff0c 内容解释非常清楚 Sub RegTest Dim oRegExp As Object 39 定义正则表达式对象 Dim oMatches As Object 39 定义匹配字符串集合对象 Dim str As Str
  • 一个可以直接使用的用于python日志记录的类

    一个用于Python3程序的日志记录类 xff0c 使用的时候 xff0c 将该类import进去后 xff0c 按照这里面的最后两行的测试程序使用即可 程序贴在这里 xff0c 省的以后造轮子 Github xff1a https git