【Free Style】华为云之Python实践(四)

举报
yd_79585289 发表于 2017/11/24 07:49:22 2017/11/24
【摘要】 使用 JSON 或者 YAML 记录配置虽然你可以在 python 代码中配置你的日志系统,但是这样并不够灵活。最好的方法是使用一个配置文件来配置。在 Python2.7 及之后的版本中,你可以从字典中加载 logging 配置。这也就意味着你可以从 JSON 或者 YAML 文件中加载日志的配置。尽管你还能用原来 .ini 文件来配置,但是它既很难读也很难写。下面我给你们看一个用 JSON 和

使用 JSON 或者 YAML 记录配置

虽然你可以在 python 代码中配置你的日志系统,但是这样并不够灵活。最好的方法是使用一个配置文件来配置。在 Python2.7 及之后的版本中,你可以从字典中加载 logging 配置。这也就意味着你可以从 JSON 或者 YAML 文件中加载日志的配置。尽管你还能用原来 .ini 文件来配置,但是它既很难读也很难写。下面我给你们看一个用 JSON 和 YAML 文件配置的例子:

logging.json

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

{

    "version": 1,

    "disable_existing_loggers": false,

    "formatters": {

        "simple": {

            "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

        }

    },

 

    "handlers": {

        "console": {

            "class": "logging.StreamHandler",

            "level": "DEBUG",

            "formatter": "simple",

            "stream": "ext://sys.stdout"

        },

 

        "info_file_handler": {

            "class": "logging.handlers.RotatingFileHandler",

            "level": "INFO",

            "formatter": "simple",

            "filename": "info.log",

            "maxBytes": 10485760,

            "backupCount": 20,

            "encoding": "utf8"

        },

 

        "error_file_handler": {

            "class": "logging.handlers.RotatingFileHandler",

            "level": "ERROR",

            "formatter": "simple",

            "filename": "errors.log",

            "maxBytes": 10485760,

            "backupCount": 20,

            "encoding": "utf8"

        }

    },

 

    "loggers": {

        "my_module": {

            "level": "ERROR",

            "handlers": ["console"],

            "propagate": "no"

        }

    },

 

    "root": {

        "level": "INFO",

        "handlers": ["console", "info_file_handler", "error_file_handler"]

    }

}

logging.yaml

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

---

 

version: 1

 

disable_existing_loggers: False

 

formatters:

 

    simple:

 

        format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

 

handlers:

 

    console:

 

        class: logging.StreamHandler

 

        level: DEBUG

 

        formatter: simple

 

        stream: ext://sys.stdout

 

    info_file_handler:

 

        class: logging.handlers.RotatingFileHandler

 

        level: INFO            

 

        formatter: simple

 

        filename: info.log

 

        maxBytes: 10485760 # 10MB

 

        backupCount: 20

 

        encoding: utf8

 

    error_file_handler:

 

        class: logging.handlers.RotatingFileHandler

 

        level: ERROR            

 

        formatter: simple

 

        filename: errors.log

 

        maxBytes: 10485760 # 10MB

 

        backupCount: 20

 

        encoding: utf8

 

loggers:

 

    my_module:

 

        level: ERROR

 

        handlers: [console]

 

        propagate: no

 

root:

 

    level: INFO

 

    handlers: [console, info_file_handler, error_file_handler]

 

...

接下来将展示怎样从 JSON 文件中读入日志的配置信息:

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

import json

import logging.config

 

def setup_logging(

    default_path='logging.json',

    default_level=logging.INFO,

    env_key='LOG_CFG'

):

    """Setup logging configuration

 

    """

    path = default_path

    value = os.getenv(env_key, None)

    if value:

        path = value

    if os.path.exists(path):

        with open(path, 'rt') as f:

            config = json.load(f)

        logging.config.dictConfig(config)

    else:

        logging.basicConfig(level=default_level)

使用 JSON 的一个优点就是 json是一个标准库,你不需要额外安装它。但是从我个人来说,我比较喜欢 YAML 一些。它无论是读起来还是写起来都比较容易。你也可以使用下面的方法来加载一个 YAML 配置文件:

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

import os

import logging.config

 

import yaml

 

def setup_logging(

    default_path='logging.yaml',

    default_level=logging.INFO,

    env_key='LOG_CFG'

):

    """Setup logging configuration

 

    """

    path = default_path

    value = os.getenv(env_key, None)

    if value:

        path = value

    if os.path.exists(path):

        with open(path, 'rt') as f:

            config = yaml.load(f.read())

        logging.config.dictConfig(config)

    else:

        lo

接下来,你就可以在运行程序的时候调用 setup_logging 来启动日志记录了。它默认会读取 logging.json 或 logging.yaml 文件 。你也可以设置环境变量 LOG_CCFG 从指定路径加载日志配置。例如:

Python

1

LOG_CFG=my_logging.json python my_server.py

如果你喜欢 YAML:

Python

1

LOG_CFG=my_logging.yaml python my_server.py


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。