当前位置: 首页 > 编程日记 > 正文

add python3.7 to path是什么意思_一起读源码:为什么 loguru 的时间 rotation 不能只精确到天...

64b79daf883b073f829135d0c5cf472a.png

摄影:产品经理猪耳朵与鹌鹑蛋做的皮蛋

今天的问题来自未闻 Code 粉丝交流群:

loguru 每天自动生成的日志名字,可以只精确到日吗?

如下图所示:

bc363c561490205a395213df58fb79a5.png

这里的每天自动生成日志的名字是什么意思呢?实际上指的就是rotation。我不知道他的中文名叫什么,但rotation 表示一种按特定条件自动切分日志的方式。

如果我们把日志一直不停写入某个文件中,那么这个文件可能会有几十上百 GB,显然这样是没有办法查看和检索的。所以我们需要一些方式来切分日志。例如,每个日志文件只有1GB,超过1GB 后,自动生成新的日志;又或者每天0点自动生成新的日志。

今天的这个问题,实际上就是在日志按天切分的时候,自动生成的文件名太长,包含了时分秒。但是提问的同学只需要精确到天。

我们来做一个测试,安装 loguru 以后,大家编写如下代码:

import time
import datetime
from loguru import logger


logger.add('我是日志.log', rotation="18:16")

while True:
    logger.info(f'现在时间:{datetime.datetime.now()}')
    time.sleep(1)

这段代码每一秒中会写入一条日志。并且日志在18:16分的时候会进行一次切分。运行效果如下图所示:

ba4871acfe2b0be97ccef41061fb31bd.png

loguru 每次写入文件的时候,写入的都是我是日志.log。但是当 rotation 的时间到了以后,会先把之前的我是日志.log文件改名为我是日志.%Y-%m-%d_%H-%M-%S_%f.log。然后创建一个新的我是日志.log

提问题的同学想知道,由于他的日志是每天切换一次的,所以实际上时间没有必要精确到毫秒。是否能够只精确到天?

为了回答这个问题,我去看了 loguru 的官方文档,发现确实没有相关的内容提到日志被 rotation 以后,重命名的格式相关的设置。

既然文档没有提到,那么我们就寻求源代码的帮助。日志重命名时,新的文件名是由函数generate_rename_path()生成的。大家可以在 Github 中,loguru 的_file_sink.py文件中找到这个函数:https://github.com/Delgan/loguru/blob/master/loguru/_file_sink.py#L16 。

决定了文件名的代码如下图所示:

b779ed3788eecbc24687e9e42656f9d8.png

代码第17行,得到一个 datetime 对象creation_datetime。这个对象作为参数传入FileDateFormatter类,得到一个 date 对象。

接下来,在第20行,通过字符串的.format()方法,拼接出一个新的文件名。

这就是全部过程了。是不是讲的太快了,没有 get 到点?那我们从头开始。

这里我们来复习一下字符串的.format()方法:

a = '我是{}, 你是{}'
b = a.format('青南', 'pm')
print(b)

运行效果如下图所示:

685afbc814d0194b847c62c07288b07d.png

这三行代码特别简单,似乎一个不会 Python 的人,看到代码以后就能脱口而出:这不就是把 format 里面的参数,按顺序替换原来字符串中的大括号吗。

是的,要让它运行起来是特别简单。但是,如果 format 的括号里面,有一个参数是一个含有__format__()魔法方法的对象会怎么样?我们再来看一段代码:

class People:
    def __init__(self, name):
        self.name = name

    def __format__(self, spec):
        return '你好世界!'

a = '我是{}, 你是{}'
kingname = People('青南')
b = a.format(kingname, 'pm')
print(b)
e7a4365b2ebda386ca1bca143bd90daa.png

可以看到,__format__()方法返回的字符串,可以替换大括号里面的内容。此时,__format__()的能实现的效果,跟__str__()方法没有什么两样。

接下来,不一样的地方来了——在大括号里面,实际上还可以传递参数!只需要在大括号里面先加上一个英文冒号,再加上参数就可以了,我们来看看:

class People:
    def __init__(self, name):
        self.name = name

    def __format__(self, spec):
        if 'pm' in spec:
            return '产品经理到此一游'
        else:
            return '青南'

a = '我是{:kingnma}, 你是{:pm}'
people = People('随便谁')
b = a.format(people, people)
print(b)

运行效果如下图所示:

8a60aa4a2302b5044a05ec6ababfd1c4.png

可以看到,b = a.format(people, people)我们传入的是同一个对象,但是由于大括号里面,冒号后面的参数不同,于是最终生成的字符串也就不一样。

__format__()方法始终会接收一个spec参数,如果我们原字符串的大括号里面没有冒号,那么这个spec是空字符串。如果我们原字符串的大括号里面有冒号,那么冒号后面的内容就会作为 spec 参数传入__format__()方法中。

原理讲完了。我们回到loguru 的源代码中。可以看到,FileDateFormatter类的__format__()方法会做一个判断,如果 spec 参数为空,那么就会强制使用%Y-%m-%d_%H-%M-%S_%f这个格式的时间。

我们再来看generate_rename_path代码第20和25行,renamed_path = "{}.{}{}".format(root, date, ext)renamed_path = "{}.{}.{}{}".format(root, date, counter, ext),其中date对象作为format 的第二个参数传入第二个大括号。但是第二个大括号是空的,里面没有冒号,date对象的__format__()方法的 spec 参数始终为空。所以始终会使用%Y-%m-%d_%H-%M-%S_%f格式。无法人工自定义格式。

综上所述,对这位同学的回答是:无法自定义日志 rotation 时添加的时间格式。如果你想要强行修改的话,那么你只有修改 loguru 的源代码,例如:

ec3b921fe897828bb177b4562c365de5.png

ae5f321f4c08d6df9ba1f4dbc519b410.gif

相关文章:

hdu 4263(有限制的生成树)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4263 思路&#xff1a;将红边和蓝边单独求一次生成树&#xff0c;求的红边最多可以加入的边数cntr&#xff0c;蓝边最多可以加入的边数cntb&#xff0c;只要k满足条件k>(n-1-cntr)&&k<cntb&#…

Synchronized的两个用法

Synchronized的作用&#xff1a; 能够保证在同一时刻最多只有一个线程执行该段代码&#xff0c;以达到保证并发安全的效果 Synchronized的两个用法&#xff1a; 1&#xff09;对象锁 包括方法锁&#xff08;默认锁对象为this当前实例对象&#xff09;和同步代码块锁&#xff08…

h5引入不同的js文件怎样让第二个js使用第一个js文件中的函数_px2rem-loader使用及注意事项...

1.安装lib-flexible.js&#xff1b; //基于vue-cli配置手淘的lib-flexible rem&#xff0c;实现移动端自适应2.安装px2rem-loader&#xff1b;//使用 webpack 的 px2rem-loader,自动将px转换为rem3.在项目入口文件main.js中引入lib-flexible&#xff1b;//&#xff08;import …

C++中的explicitkeyword

在C程序中非常少有人去使用explicitkeyword&#xff0c;不可否认&#xff0c;在平时的实践中确实非常少能用的上。再说C的功能强大&#xff0c;往往一个问题能够利用好几种C特性去解决。但略微留心一下就会发现现有的MFC库或者C标准库中的相关类声明中explicit出现的频率是非常…

Entity Framework Code First在Oracle下的伪实现

为什么要说是伪实现&#xff0c;因为还做不到类似MsSql中那样完全的功能。Oralce中的数据库还是要我们自己手动去创建的。这里&#xff0c;我们舍掉了Model First中的EDMX文件&#xff0c;自己在代码里面写模型与映射关系&#xff0c;这又有点像是Code First模型了&#xff0c;…

leetcode-206 反转链表

描述如下&#xff1a; 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 方法一&#xff1a;原地反转 数据结构如下 struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}};ListN…

ios采用什么技术_在不锈钢技术成熟的今天,为什么汽车不采用呢?不仅仅是价格问题...

文/憨憨评车想必对于那些经常开车的人都会知道&#xff0c;我们的车子在行驶了几年之后&#xff0c;在性能方面必定是会有所下降的。然而还有一点也是非常让人头疼的&#xff0c;那就是车子的生锈问题。一旦车子的车身出现生锈情况的话&#xff0c;就会给人一种破破烂烂的感觉。…

Effective STL 为包含指针的关联容器指定比较类型

// 为包含指针的关联容器指定比较类型.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <set> #include <string> #include <iostream>using namespace std;struct StringPtrLess:public binary_function<const string*…

Android中处理崩溃异常

2019独角兽企业重金招聘Python工程师标准>>> 大家都知道&#xff0c;现在安装Android系统的手机版本和设备千差万别&#xff0c;在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象&#xff0c;开发者个人不可能购买所有设备逐个调试&#xff0c;所以…

python面试基本题(你需要的)

1、冒泡排序 lis [56,12,1,8,354,10,100,34,56,7,23,456,234,-58]def sortport():for i in range(len(lis)-1):for j in range(len(lis)-1-i):if lis[j] > lis[j1]:lis[j],lis[j1] lis[j1],lis[j]return lis 2、计算x的n次方的方法 def power(x, n):s 1while n > 0:n …

leetcode-92 反转链表II

题目描述如下&#xff1a; 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 示例: 输入: 1->2->3->4->5->NULL, m 2, n 4 输出: 1->4->3->2->5->NULL 很明显这个题目是206 反转链表的进阶版 需要记…

地铁框架保护的原理_地铁屏蔽门是如何保证通讯的稳定?

地铁作为人们出行首选交通方式&#xff0c;安全可靠尤为重要&#xff0c;在复杂的地铁控制系统中&#xff0c;如何保障通讯的稳定性呢&#xff1f;本篇文章将从地铁系统中通讯单元的简单拓扑谈谈通讯防护的方案。随着我国经济的快速发展&#xff0c;地铁工程项目建设也处在快速…

HDU1548:A strange lift(Dijkstra或BFS)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid1548 题意&#xff1a;电梯每层有一个数&#xff0c;例如第n层有个数k&#xff0c; 那么这一层只能上k层或下k层&#xff0c;但是不能低于一层或高于n层&#xff0c; 给定起点与终点&#xff0c;要求出最少要按几次键 我的…

(转)C语言位运算详解

地址&#xff1a;http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者&#xff1a;911说明&#xff1a;本文参考了http://www2.tsu.edu.cn/www/cjc/online/cyuyan/&#xff0c;算是对其的修正&#xff0c;在此将本文列为原创&#xff0c;实有抄袭…

[bzoj2300] [HAOI2011]防线修建

Description 近来A国和B国的矛盾激化&#xff0c;为了预防不测&#xff0c;A国准备修建一条长长的防线&#xff0c;当然修建防线的话&#xff0c;肯定要把需要保护的城市修在防线内部了。可是A国上层现在还犹豫不决&#xff0c;到底该把哪些城市作为保护对象呢&#xff1f;又由…

leetcode-142 环形链表II

给定一个链表&#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从 0 开始&#xff09;。 如果 pos 是 -1&#xff0c;则在该链表中没有…

1.低权限的程序向高权限的程序发消息 2.慎用setcurrentdirectory

1.低权限的程序向高权限的程序发消息 2.慎用setcurrentdirectory转载于:https://www.cnblogs.com/chunyou128/p/3921903.html

增加service_.NET Core + Kubernetes:Service

通过 .NET Core Kubernetes&#xff1a;Deployment 文章的介绍&#xff0c;我们可以通过 Deployment 控制器快速创建一组 Pod 来提供服务&#xff0c;每个 Pod 都会被分配一个集群内可见的虚拟 IP 地址&#xff0c;然后通过一个独立的 Endpoint(Pod IP ContainerPort)进行访问…

IIS配置相关问题:Framework 4.5 在IIS 7.5中运行

<system.webServer> <validation validateIntegratedModeConfiguration"false" /> <!--4.5 在IIS7.5中运行的时候--> <modules runAllManagedModulesForAllRequests"true" /> </system.webServer>转载于:https://…

[优先队列] 洛谷 P2085 最小函数值

题目描述 有n个函数&#xff0c;分别为F1,F2,...,Fn。定义Fi(x)Ai*x^2Bi*xCi (x∈N*)。给定这些Ai、Bi和Ci&#xff0c;请求出所有函数的所有函数值中最小的m个&#xff08;如有重复的要输出多个&#xff09;。 输入输出格式 输入格式&#xff1a; 输入数据&#xff1a;第一行输…

leetcode-86 分隔链表

给定一个链表和一个特定值 x&#xff0c;对链表进行分隔&#xff0c;使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: head 1->4->3->2->5->2, x 3 输出: 1->2->2->4->3->5 …

[WCF编程]1.WCF入门示例

一、WCF是什么&#xff1f; Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架&#xff0c;整合了原有的windows通讯的 .net Remoting&#xff0c;WebService&#xff0c;Socket的机制&#xff0c;并融合有Http和Ftp的相关技术&#xff0c…

ios 自动打包命令_iOS自动打包上传脚本

自从将swift2.2升级到swift3.0, 每次使用Xcode8编译都很慢&#xff0c;很是不爽&#xff0c;于是有了研究下xcodebuild命令行打包的想法&#xff0c;起初不知道用shell&#xff0c;还是用python, 在网上大概搜了一下&#xff0c;关于python的比较多点&#xff0c;于是就先学习p…

linux系统下添加新硬盘的方法详解

对于linux新手来说&#xff0c;在linux上添加新硬盘&#xff0c;是很有挑战性的一项工作。在Linux服务器上把硬盘接好&#xff0c;启动linux&#xff0c;以root登陆。 fdisk -l ## 这里是查看目前系统上有几块硬盘 Disk /dev/sda: 36.4 GB, 36401479680 bytes 255 heads, 63 s…

【CF EDU59 E】 Vasya and Binary String (DP)

题意 给一串01串&#xff0c;对该串进行若干次操作&#xff0c;直到串为空 操作为&#xff1a;选择一段连续的0或者1,删除它&#xff0c;拼接前后两部分成为新串&#xff0c;得到价值为a[删除的长度]&#xff08;a为给定的数组&#xff09; 思路 一个非常规的DP 考虑题目所给的…

leetcode-21 合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4 总体思路是&#xff1a; 比较两个链表头节点&#xff0c…

log4cxx第三篇----使用多个logger

使用多个logger时&#xff0c;所有logger的配置写在一个配置文件里面 两个例子&#xff1a; 1 一个继承的例子&#xff08;http://logging.apache.org/log4cxx/&#xff09; // file com/foo/bar.h #include "log4cxx/logger.h"namespace com {namespace foo {class…

authy不同账户间不同步_「第七期」shopify产品还能同步到微信小程序销售?看这里...

众所周知&#xff0c;微信坐拥12亿用户&#xff0c;已经是国民应用&#xff0c;而其中小程序依托于微信生态日活已经超过4亿&#xff0c;对于国内的一些商家来讲是不可错过的流量圣地&#xff0c;那么对于做跨境的朋友来讲怎么利用起来了&#xff1f;今天给大家介绍一款无缝对接…

Ubuntu环境变量

2019独角兽企业重金招聘Python工程师标准>>> Ubuntu 环境变量 环境变量配置文件 在Ubuntu中有如下几个文件可以设置环境变量 1、 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执…