日志输出和配置文件的使用

 logging模块日志级别

1、DEBUG:输出详细的运行情况,主要用于调试

2、INFO:确认一切按预期运行,一般用于输出重要运行情况

3、WARNING:一些意想不到的事情发生了(如:"内存空间不足"),但是这个软件还能按预期工作,在不久的将来会出问题

4、ERROR:发生了错误,软件没能执行一些功能,还可以继续执行

5、CRITICAL:一个严重的错误,表明程序本身可能无法继续运行```python

#创建日志收集器
logging.getLogger()
#创建日志收集器的时候不传name参数,返回的是默认的收集器,传name参数则会创建一个新的日志收集器
```

StreamHandler():输出到控制台

```python
import logging
#创建一个收集器
log = logging.getLogger('duanxc')
#收集info及以上的日志
log.setLevel('INFO')

#创建一个日志输出器(输出到控制台)
sh=logging.StreamHandler()
#输入debug及以上的输出器
sh.setLevel('DEBUG')
#收集器和输出器绑定
log.addHandler(sh)

log.debug('这是一条debug的日志')
log.info('这是一条info的日志')
log.warning('这是一条warning的日志')
log.error('这是一条error的日志')
log.critical('这是一条critical的日志')

```

FileHandler():输出到文件```python

import logging
#创建一个收集器
log = logging.getLogger('duanxc')
#收集info及以上的日志
log.setLevel('INFO')

#创建一个日志输出器,输出到文件
fh=logging.FileHandler('duanxc.log',encoding='utf-8')
#输入debug及以上的输出器
fh.setLevel('DEBUG')
#收集器和输出器绑定
log.addHandler(fh)

log.debug('这是一条debug的日志')
log.info('这是一条info的日志')
log.warning('这是一条warning的日志')
log.error('这是一条error的日志')
log.critical('这是一条critical的日志')

```

同时输出文件和控制台```python

import logging
#创建一个收集器
log = logging.getLogger('duanxc')
#收集info及以上的日志
log.setLevel('DEBUG')

#创建一个日志输出器,输出到文件
fh=logging.FileHandler('duanxc.txt',encoding='utf-8')
#输入debug及以上的输出器
fh.setLevel('DEBUG')
#收集器和输出器绑定
log.addHandler(fh)

#创建一个日志输出器,输出到控制台
sh=logging.StreamHandler()
#输入debug及以上的输出器
sh.setLevel('DEBUG')
#收集器和输出器绑定
log.addHandler(sh)

log.debug('这是一条debug的日志')
log.info('这是一条info的日志')
log.warning('这是一条warning的日志')
log.error('这是一条error的日志')
log.critical('这是一条critical的日志')

```

设置日志输出的等级:logging.Formatter()```python

import logging

# 创建一个收集器
log = logging.getLogger('duanxc')
# 收集info及以上的日志
log.setLevel('DEBUG')

# 创建一个日志输出器,输出到文件
fh = logging.FileHandler('duanxc.txt', encoding='utf-8')
# 输入debug及以上的输出器
fh.setLevel('DEBUG')
# 收集器和输出器绑定
log.addHandler(fh)

# 创建一个日志输出器,输出到文件
sh = logging.StreamHandler()
# 输入debug及以上的输出器
sh.setLevel('DEBUG')
# 收集器和输出器绑定
log.addHandler(sh)

formatter = '%(asctime)s - [%(filename)s --> line:%(lineno)d] - %(levelname)s:%(message)s'
# 设置日志输出的等级
log_format = logging.Formatter(formatter)
# 设置输出到控制台的格式
sh.setFormatter(log_format)
# 设置输出到文件的格式
fh.setFormatter(log_format)

log.debug('这是一条debug的日志')
log.info('这是一条info的日志')
log.warning('这是一条warning的日志')
log.error('这是一条error的日志')
log.critical('这是一条critical的日志')

```

日志处理的封装```python

import logging


def log_handler(name='log_handler',level='DEBUG',shlevel='DEBUG',filename='log.txt',fhlevel='DEBUG',):
    # 创建一个日志收集器
    log = logging.getLogger(name)
    # 设置日志收集等级
    log.setLevel(level)

    # 设置日志输出等级,输出渠道
    # 输出到控制台
    sh = logging.StreamHandler()
    # 设置输出到控制台的等级
    sh.setLevel(shlevel)
    # 收集器与输出器绑定
    log.addHandler(sh)

    # 输出到文件
    fh = logging.FileHandler(filename=filename, encoding='utf-8')
    # 设置输出到文件的等级
    fh.setLevel(fhlevel)
    # 收集器与输出器绑定
    log.addHandler(fh)

    # 设置日志输出格式
    formatter = '%(asctime)s - [%(filename)s --> line:%(lineno)d] - %(levelname)s:%(message)s'
    formats = logging.Formatter(formatter)
    # 输出到控制台
    sh.setFormatter(formats)
    # 输出到文件
    fh.setFormatter(formats)

    return log

```

读取ini配置文件

```ini

[log]
name = log_handler
level = DEBUG
shlevel = DEBUG
filename = log.txt
fhlevel = DEBUG

``````python

#导入读取配置文件模块
from configparser import ConfigParser
#创建一个配置文件解析器对象
conf=ConfigParser()
#读取配置文件中的内容到配置文件解析器中
conf.read('duanxc.ini')
#读取配置文件内容

#1、使用get方法,读取出来的内容为字符串格式
res=conf.get('log','level')
print(res)
res1=conf.get('log','shuzi')
print(res1,type(res1))

#2、使用getint方法,读取出来的内容为数值类型的数据
res2=conf.getint('log','shuzi')
print(res1,type(res2))

#3、使用getboolean方法,读取出来的为布尔值
res3=conf.getboolean('log','zj')
print(res3,type(res3))

```

写入ini配置文件```python

#导入读取配置文件模块
from configparser import ConfigParser
#创建一个配置文件解析器对象
conf=ConfigParser()
#读取配置文件中的内容到配置文件解析器中
conf.read('duanxc.ini')

#写入配置文件
res=conf.set('log','name','duanxc')
conf.write(fp=open('duanxc.ini','w',encoding='utf-8'))

``````python

#导入读取配置文件模块
from configparser import ConfigParser
#创建一个配置文件解析器对象
conf=ConfigParser()
#读取配置文件中的内容到配置文件解析器中
conf.read('duanxc.ini')

#写入配置文件
res=conf.set('log','name','duanxc')
# conf.write(fp=open('duanxc.ini','w',encoding='utf-8'))
#第二种写法
with open('duanxc.ini','w',encoding='utf-8') as f:
    conf.write(fp=f)

```

读取yaml文件

```yaml

log:
    duanxc:
        123
    duanxcc:
        234
logg:
    duanxc:
        123
    duanxcc:
        234

``````python

import yaml

with open('duanxc.yaml', 'r', encoding='utf-8') as f:
    res = yaml.load(stream=f, Loader=yaml.Loader)

print(res)

```

1、yaml文件的字典形式取值,

2、 yaml列表形式以索引取值

```yaml

log:
    duanxc:
        123
    duanxcc:
        234
logg:
    duanxc:
        123
    duanxcc:
        234

``````python

import yaml

with open('duanxc.yaml', 'r', encoding='utf-8') as f:
    res = yaml.load(stream=f, Loader=yaml.Loader)

print(res)
a=res['logg']['daunxcc']
print(a)

```

json中的的字符串都要用双引号

```json

{
  "data":{
    "success": 11,
    "all": 14,
    "fail": 3,
    "skip": 0,
    "error": 0,
    "runtime": "0.19 S",
    "begin_time": "2022-02-28 19:27:26",
    "pass_rate": "78.57"
  }
}

``````python

import json

with open('duanxc.json', 'r', encoding='utf-8') as f:
    #读取文件中的json数据并自动转换为对象的py数据类型
    res = json.load(f)

print(res)

```

1、python中的字典----->json中的对象

2、python中的列表----->json中的数组

3、python中的None----->json中的null

4、python中的True----->json中的true

5、python中的False----->json中的false

1、python转json```python

import json

dic = {'a': True, "b": None, "c": False}
#将python中的数据转换为json数据
res = json.dumps(dic)
print(res)

```

2、json转python```python

import json

lis = '{"a": true, "b": null, "c": false}'
#将python中的数据转换为json数据
res = json.loads(lis)
print(res)

```