python之包和日志(python写日志文件)

发布时间:2022-11-14

本文目录一览:

  1. python处理日志的包有哪些
  2. 在 python 项目中如何记录日志
  3. 怎样调试 日志 python 代码
  4. python之配置日志的几种方式
  5. Python日志—Python日志模块logging介绍
  6. python日志模块记录三_日志命名_日志轮转

python处理日志的包有哪些

#coding:utf-8
#file: FileSplit.py
import os,os.path,time
def FileSplit(sourceFile, targetFolder):
    sFile = open(sourceFile, 'r')
    number = 100000 #每个小文件中保存100000条数据
    dataLine = sFile.readline()
    tempData = [] #缓存列表
    fileNum = 1
    if not os.path.isdir(targetFolder): #如果目标目录不存在,则创建
        os.mkdir(targetFolder)
    while dataLine: #有数据
        for row in range(number):
            tempData.append(dataLine) #将一行数据添加到列表中
            dataLine = sFile.readline()
            if not dataLine :
                break
        tFilename = os.path.join(targetFolder,os.path.split(sourceFile)[1] + str(fileNum) + ".txt")
        tFile = open(tFilename, 'a+') #创建小文件
        tFile.writelines(tempData) #将列表保存到文件中
        tFile.close()
        tempData = [] #清空缓存列表
        print(tFilename + " 创建于: " + str(time.ctime()))
        fileNum += 1 #文件编号
    sFile.close()
if __name__ == "__main__" :
    FileSplit("access.log","access")
#coding:utf-8
#file: Map.py
import os,os.path,re
def Map(sourceFile, targetFolder):
    sFile = open(sourceFile, 'r')
    dataLine = sFile.readline()
    tempData = {} #缓存列表
    if not os.path.isdir(targetFolder): #如果目标目录不存在,则创建
        os.mkdir(targetFolder)
    while dataLine: #有数据
        p_re = re.compile(r'(GET|POST)\s(.*?)\sHTTP/1.[01]',re.IGNORECASE) #用正则表达式解析数据
        match = p_re.findall(dataLine)
        if match:
            visitUrl = match[0][1]
            if visitUrl in tempData:
                tempData[visitUrl] += 1
            else:
                tempData[visitUrl] = 1
        dataLine = sFile.readline() #读入下一行数据
    sFile.close()
    tList = []
    for key,value in sorted(tempData.items(),key = lambda k:k[1],reverse = True):
        tList.append(key + " " + str(value) + '\n')
    tFilename = os.path.join(targetFolder,os.path.split(sourceFile)[1] + "_map.txt")
    tFile = open(tFilename, 'a+') #创建小文件
    tFile.writelines(tList) #将列表保存到文件中
    tFile.close()
if __name__ == "__main__" :
    Map("access\\access.log1.txt","access")
    Map("access\\access.log2.txt","access")
    Map("access\\access.log3.txt","access")
#coding:utf-8
#file: Reduce.py
import os,os.path,re
def Reduce(sourceFolder, targetFile):
    tempData = {} #缓存列表
    p_re = re.compile(r'(.*?)(\d{1,}$)',re.IGNORECASE) #用正则表达式解析数据
    for root,dirs,files in os.walk(sourceFolder):
        for fil in files:
            if fil.endswith('_map.txt'): #是reduce文件
                sFile = open(os.path.abspath(os.path.join(root,fil)), 'r')
                dataLine = sFile.readline()
                while dataLine: #有数据
                    subdata = p_re.findall(dataLine) #用空格分割数据
                    #print(subdata[0][0]," ",subdata[0][1])
                    if subdata[0][0] in tempData:
                        tempData[subdata[0][0]] += int(subdata[0][1])
                    else:
                        tempData[subdata[0][0]] = int(subdata[0][1])
                    dataLine = sFile.readline() #读入下一行数据
                sFile.close()
    tList = []
    for key,value in sorted(tempData.items(),key = lambda k:k[1],reverse = True):
        tList.append(key + " " + str(value) + '\n')
    tFilename = os.path.join(sourceFolder,targetFile + "_reduce.txt")
    tFile = open(tFilename, 'a+') #创建小文件
    tFile.writelines(tList) #将列表保存到文件中
    tFile.close()
if __name__ == "__main__" :
    Reduce("access","access")

在 python 项目中如何记录日志

写本文的目的是我在写 python 项目的时候需要记录日志,我忘记怎么处理了,每次都需要去网上查一遍, 好记性不如烂笔头 , 这里把查阅的内容记录下来,方便以后查找。 python 项目中记录日志,可以使用 logging 模块,logging 模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统。logging 模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日志记录功能。所以,你的应用日志可以将你自己的日志信息与来自第三方模块的信息整合起来。 在 __init__.py 文件中做如下配置: 控制台输出日志如下: 参考文档

怎样调试 日志 python 代码

使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令,详情见表 1。

表 1. pdb 常用命令

命令 解释
break 或 b 设置断点
continue 或 c 继续执行程序
list 或 l 查看当前行的代码段
step 或 s 进入函数
return 或 r 执行代码直到从当前函数返回
exit 或 q 中止并退出
next 或 n 执行下一行
pp 打印变量的值
help 帮助
下面结合具体的实例讲述如何使用 pdb 进行调试。

清单 1. 测试代码示例

import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final

开始调试:直接运行脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。

清单 2. 利用 pdb 调试

[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
- b = "bbb"
(Pdb) n
/root/epdb1.py(5)?()
- c = "ccc"
(Pdb)

退出 debug

使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。

清单 3. 退出 debug

[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
- b = "bbb"
(Pdb) n
/root/epdb1.py(5)?()
- c = "ccc"
(Pdb) q
Traceback (most recent call last):
File "epdb1.py", line 5, in ?
c = "ccc"
File "epdb1.py", line 5, in ?
c = "ccc"
File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch
return self.dispatch_line(frame)
File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line
if self.quitting: raise BdbQuit
bdb.BdbQuit

打印变量的值

如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: exceptions.NameError 错误。

清单 4. debug 过程中打印变量

[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
- b = "bbb"
(Pdb) n
/root/epdb1.py(5)?()
- c = "ccc"
(Pdb) p b
'bbb'
(Pdb) n
/root/epdb1.py(6)?()
- final = a + b + c
(Pdb) p c
'ccc'
(Pdb) p final
*** NameError: exceptions.NameError instance at 0x1551b710
(Pdb) n
/root/epdb1.py(7)?()
- print final
(Pdb) p final
'aaabbbccc'
(Pdb)

使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。

清单 5. 停止 debug 继续执行程序

[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
- b = "bbb"
(Pdb) n
/root/epdb1.py(5)?()
- c = "ccc"
(Pdb) c
aaabbbccc

显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 - 指向当前 debug 的语句。

清单 6. debug 过程中显示代码

[root@rcc-pok-idg-2255 ~]# python epdb1.py
/root/epdb1.py(4)?()
- b = "bbb"
(Pdb) list
1 import pdb
2 a = "aaa"
3 pdb.set_trace()
4 - b = "bbb"
5 c = "ccc"
6 final = a + b + c
7 pdb.set_trace()
8 print final
[EOF]
(Pdb) c
/root/epdb1.py(8)?()
- print final
(Pdb) list
3 pdb.set_trace()
4 b = "bbb"
5 c = "ccc"
6 final = a + b + c
7 pdb.set_trace()
8 - print final
[EOF]
(Pdb)

在使用函数的情况下进行 debug

清单 7. 使用函数的例子

import pdb
def combine(s1,s2): # define subroutine combine, which...
    s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...
    s3 = '"' + s3 +'"' # encloses it in double quotes,...
    return s3 # and returns it.
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = combine(a,b)
print final

如果直接使用 n 进行 debug 则到 final=combine(a,b) 这句的时候会将其当做普通的赋值语句处理,进入到 print final。如果想要对函数进行 debug 如何处理呢?可以直接使用 s 进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。

清单 8. 对函数进行 debug

[root@rcc-pok-idg-2255 ~]# python epdb2.py
/root/epdb2.py(10)?()
- b = "bbb"
(Pdb) n
/root/epdb2.py(11)?()
- c = "ccc"
(Pdb) n
/root/epdb2.py(12)?()
- final = combine(a,b)
(Pdb) s
--Call--
/root/epdb2.py(3)combine()
- def combine(s1,s2): # define subroutine combine, which...
(Pdb) n
/root/epdb2.py(4)combine()
- s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...
(Pdb) list
1 import pdb
2
3 def combine(s1,s2): # define subroutine combine, which...
4 - s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...
5 s3 = '"' + s3 +'"' # encloses it in double quotes,...
6 return s3 # and returns it.
7
8 a = "aaa"
9 pdb.set_trace()
10 b = "bbb"
11 c = "ccc"
(Pdb) n
/root/epdb2.py(5)combine()
- s3 = '"' + s3 +'"' # encloses it in double quotes,...
(Pdb) n
/root/epdb2.py(6)combine()
- return s3 # and returns it.
(Pdb) n
--Return--
/root/epdb2.py(6)combine()-'"aaabbbaaa"'
- return s3 # and returns it.
(Pdb) n
/root/epdb2.py(13)?()
- print final
(Pdb)

在调试的时候动态改变值

在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用! B。

清单 9. 在调试的时候动态改变值

[root@rcc-pok-idg-2255 ~]# python epdb2.py
/root/epdb2.py(10)?()
- b = "bbb"
(Pdb) var = "1234"
(Pdb) b = "avfe"
*** The specified object '= "avfe"' is not a function
or was not found along sys.path.
(Pdb) !b="afdfd"
(Pdb)

pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。接下来将介绍 PyCharm IDE 的调试方法。

python之配置日志的几种方式

  1. 使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数;
  2. 创建一个日志配置文件,然后使用fileConfig()函数来读取该文件的内容;
  3. 创建一个包含配置信息的dict,然后把它传递个dictConfig()函数;

Python日志—Python日志模块logging介绍

从事与软件相关工作的人,应该都听过“日志”一词。 日志就是跟踪软件运行时事件的方法,为了能够在程序运行过程中记录错误。 通过日志记录程序的运行,方便我们查询信息,以便追踪问题、进行维护和调试、还是数据分析。 并且各编程语言都形成了各自的日志体系和相应的框架。 日志的作用总结: 首先我们要树立一个观点,那就是“不是为了记录日志而记录日志,日志也不是随意记的”。要实现能够只通过日志文件还原整个程序执行的过程,达到能透明地看到程序里执行情况,每个线程每个过程到底执行结果的目的。日志就像飞机的黑匣子一样,应当能够复原异常的整个现场乃至细节。 在项目中,日志这个功能非常重要,我们要重视起来。 在Python中,使用logging模块来进行日志的处理。 logging是Python的内置模块,主要用于将日志信息进行格式化内容输出,可将格式化内容输出到文件,也可输出到屏幕。 我们在开发过程中,常用print()函数来进行调试,但是在实际应用的部署时,我们要将日志信息输出到文件中,方便后续查找以及备份。 在我们使用日志管理时,我们也可以将日志格式化成Json对象转存到ELK中方便图形化查看及管理。 logging模块将日志系统从高向低依次定义了四个类,分别是logger(日志器)、handler(处理器)、filter(过滤器)和formatter(格式器)。其中由日志器生成的实例将接管原本日志记录函数logging.log的功能。 说明: 我们先来思考下下面的两个问题: 在软件开发阶段或部署开发环境时,为了尽可能详细的查看应用程序的运行状态来保证上线后的稳定性,我们可能需要把该应用程序所有的运行日志全部记录下来进行分析,这是非常耗费机器性能的。 当应用程序正式发布或在生产环境部署应用程序时,我们通常只需要记录应用程序的异常信息、错误信息等,这样既可以减小服务器的I/O压力,也可以避免我们在排查故障时被淹没在日志的海洋里。 那么怎样才能在不改动应用程序代码的情况下,根据事件的重要性或者称之为等级,实现在不同的环境中,记录不同详细程度的日志呢? 这就是日志等级的作用了,我们通过配置文件指定我们需要的日志等级就可以了。 说明: 总结: 开发应用程序时或部署开发环境时,可以使用DEBUG或INFO级别的日志获取尽可能详细的日志信息,可以方便进行开发或部署调试。 应用上线或部署生产环境时,应用使用WARNING或ERROR或CRITICAL级别的日志,来降低机器的I/O压力和提高获取错误日志信息的效率。 日志级别的指定通常都是在应用程序的配置文件中进行指定的。 不同的应用程序所定义的日志等级会有所差别,根据实际需求来决定。

python日志模块记录三_日志命名_日志轮转

在日志记录中,我们往往要能看到是什么哪里出错了。可以通过日志名字记录哪里出错了。而日志也需要轮转,一个日志文件不能无限大,也需要备份。所以有了通过日志名的灵活配置,和通过设置handler文件输出调用 logging.handlers.RotatingFileHandler 方法来实现轮转和备份。 my_logging文件如下配置