python logging通过json文件配置的步骤

作者:m笑忘书 时间:2022-06-04 22:30:19 

logconfig.json


{
"version":1,
"disable_existing_loggers":false,
"formatters":{
"simple":{
 "format":"[%(asctime)s - %(levelname)s - line(%(lineno)d) - %(filename)s]: %(message)s",
 "datefmt":"%Y-%m-%d %H:%M:%S"
}
},
"handlers":{
"console":{
 "class":"logging.StreamHandler",
 "level":"DEBUG",
 "formatter":"simple",
 "stream":"ext://sys.stdout"
},
"info_file_handler":{
 "class":"logging.handlers.TimedRotatingFileHandler",
 "level":"INFO",
 "formatter":"simple",
 "filename":"../log/info.log",
 "when":"H",
 "interval":1,
 "backupCount":50,
 "encoding":"utf8"
},
"error_file_handler":{
 "class":"logging.handlers.TimedRotatingFileHandler",
 "level":"ERROR",
 "formatter":"simple",
 "filename":"../log/errors.log",
 "when":"H",
 "interval":1,
 "backupCount":50,
 "encoding":"utf8"
}
},
"loggers":{
"my_module":{
 "level":"ERROR",
 "handlers":["info_file_handler"],
 "propagate":"no"
}
},
"root":{
"level":"INFO",
"handlers":["console","info_file_handler","error_file_handler"]
}
}

log_utility.py


import os
import json
import logging
import logging.config

def setup_logging(default_path="logconfig.json",default_level=logging.DEBUG):
path = default_path
if os.path.exists(path):
with open(path,"r") as f:
 config = json.load(f)
 logging.config.dictConfig(config)
else:
logging.basicConfig(level=default_level)

调用

config_path = sys.path[0] + '/logconfig.json'
log_utility.setup_logging(config_path)

补充知识:python logging定制logstash的json日志格式

最近一直在折腾日志的收集,现在算是收尾了。 写一篇算python优化logstash的方案。

其实大家都知道logstash调用grok来解析日志的话,是要消耗cpu的成本的,毕竟是需要正则的匹配的。

根据logstash调优的方案,咱们可以预先生成json的格式。 我这边基本是python的程序,怎么搞尼 ?

有两种方法,第一种方法是生成json后,直接打入logstash的端口。 还有一种是生成json写入文件,让logstash做tail操作的时候,把一行的日志数据直接载入json就可以了。

python下的日志调试用得时logging,改成json也是很好改得。 另外不少老外已经考虑到这样的需求,已经做了python logstash的模块。


import logging
import logstash
import sys

host = 'localhost'

test_logger = logging.getLogger('python-logstash-logger')
test_logger.setLevel(logging.INFO)
test_logger.addHandler(logstash.LogstashHandler(host, 5959, version=1))
# test_logger.addHandler(logstash.TCPLogstashHandler(host, 5959, version=1))

test_logger.error('python-logstash: test logstash error message.')
test_logger.info('python-logstash: test logstash info message.')
test_logger.warning('python-logstash: test logstash warning message.')

# add extra field to logstash message
extra = {
'test_string': 'python version: ' + repr(sys.version_info),
'test_boolean': True,
'test_dict': {'a': 1, 'b': 'c'},
'test_float': 1.23,
'test_integer': 123,
'test_list': [1, 2, '3'],
}

test_logger.info('python-logstash: test extra fields', extra=extra)

python-logstash自带了amqp的方案


import logging
import logstash

# AMQP parameters
host = 'localhost'
username = 'guest'
password= 'guest'
exchange = 'logstash.py'

# get a logger and set logging level
test_logger = logging.getLogger('python-logstash-logger')
test_logger.setLevel(logging.INFO)

# add the handler
test_logger.addHandler(logstash.AMQPLogstashHandler(version=1,
      host=host,
      durable=True,
      username=username,
      password=password,
      exchange=exchange))

# log
test_logger.error('python-logstash: test logstash error message.')
test_logger.info('python-logstash: test logstash info message.')
test_logger.warning('python-logstash: test logstash warning message.')

try:
1/0
except:
test_logger.exception('python-logstash: test logstash exception with stack trace')

不管怎么说,最后生成的格式是这样就可以了。


{
"@source"=>"unknown",
"@type"=>"nginx",
"@tags"=>[],
"@fields"=>{
"remote_addr"=>"192.168.0.1",
"remote_user"=>"-",
"body_bytes_sent"=>"13988",
"request_time"=>"0.122",
"status"=>"200",
"request"=>"GET /some/url HTTP/1.1",
"request_method"=>"GET",
"http_referrer"=>"http://www.example.org/some/url",
"http_user_agent"=>"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1"
},
"@timestamp"=>"2012-08-23T10:49:14+02:00"
}

我这里简单提一下,这个模块用的不是很满意,我在python下把日志打成了json字符串,我原本以为会像grok那样,在Es里面,我的这条日志是个字段的结构,而不是这个日志都在message里面…. 我想大家应该明白了我的意思,这样很是不容易在kibana的搜索…

在kibana搜索,我经常上 source:xxx AND level:INFO 结果正像上面描述的那样,整条日志,都在@message里面。

来源:https://blog.csdn.net/qq_24822271/article/details/94457614

标签:python,logging,json
0
投稿

猜你喜欢

  • 记录一篇关于redux-saga的基本使用过程

    2023-07-15 16:43:19
  • CSS经验:因为编码差异 导致IE6不能正常解析CSS文件

    2010-06-06 13:55:00
  • python爬虫框架Scrapy基本应用学习教程

    2021-04-05 13:09:44
  • python实现学生管理系统源码

    2023-05-29 22:05:16
  • 简述php环境搭建与配置

    2023-11-15 09:08:28
  • python opencv实现目标区域裁剪功能

    2022-07-15 19:17:56
  • PHP的mysqli_set_charset()函数讲解

    2023-07-11 06:22:17
  • pyqt5对用qt designer设计的窗体实现弹出子窗口的示例

    2023-01-28 12:58:07
  • python绘图库Matplotlib的安装

    2023-09-26 19:32:22
  • Python脚本实现网卡流量监控

    2022-11-27 11:36:51
  • PyQt5每天必学之单行文本框

    2022-09-12 06:29:35
  • MySQL中delimiter的作用

    2010-10-25 20:26:00
  • python目标检测给图画框,bbox画到图上并保存案例

    2023-03-07 07:47:52
  • Python函数默认参数常见问题及解决方案

    2023-04-03 15:42:42
  • Python中常用的os操作汇总

    2022-12-13 08:30:16
  • 解析smarty模板中类似for的功能实现

    2023-11-15 12:53:40
  • Python 相对路径报错:"No such file or directory"'原因及解决方法

    2021-08-12 05:34:00
  • CSS教程:简单理解em

    2008-07-03 12:44:00
  • 使用python实现个性化词云的方法

    2021-08-27 03:46:59
  • Python实现的文本简单可逆加密算法示例

    2023-06-05 07:35:11
  • asp之家 网络编程 m.aspxhome.com