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


Posted in Python onApril 27, 2020

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里面。

以上这篇python logging通过json文件配置的步骤就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
Python中的类与对象之描述符详解
Mar 27 Python
Python中的浮点数原理与运算分析
Oct 12 Python
tensorflow实现softma识别MNIST
Mar 12 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
对python 匹配字符串开头和结尾的方法详解
Oct 27 Python
python pytest进阶之fixture详解
Jun 27 Python
在Python中实现函数重载的示例代码
Dec 12 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 Python
python中数组和列表的简单实例
Mar 25 Python
Python垃圾回收机制三种实现方法
Apr 27 #Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 #Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 #Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 #Python
python读取yaml文件后修改写入本地实例
Apr 27 #Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 #Python
Python判断字符串是否为空和null方法实例
Apr 26 #Python
You might like
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
常用简易JavaScript函数
2009/04/09 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
python逐行读取文件内容的三种方法
2014/01/20 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
详解python函数传参是传值还是传引用
2018/01/16 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
tensorflow 查看梯度方式
2020/02/04 Python
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
师范生实习自我鉴定
2013/11/01 职场文书
优秀的计算机专业求职信范文
2013/12/27 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
早安问候语大全
2015/11/10 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
MySQL中utf8mb4排序规则示例
2021/08/02 MySQL
vue elementUI批量上传文件
2022/04/26 Vue.js