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中的递归函数
Apr 27 Python
在Linux中通过Python脚本访问mdb数据库的方法
May 06 Python
Python中取整的几种方法小结
Jan 06 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
Jul 08 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
详解如何为eclipse安装合适版本的python插件pydev
Nov 04 Python
python快排算法详解
Mar 04 Python
如何爬取通过ajax加载数据的网站
Aug 15 Python
python函数的作用域及关键字详解
Aug 20 Python
Python通过Tesseract库实现文字识别
Mar 05 Python
Python flask框架实现查询数据库并显示数据
Jun 04 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 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
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
四个PHP非常实用的功能
2015/09/29 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
jQuery get和post 方法传值注意事项
2009/11/03 Javascript
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
Nodejs实现多人同时在线移动鼠标的小游戏分享
2014/12/06 NodeJs
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
JS实现双击内容变为可编辑状态
2017/03/03 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
js代码实现轮播图
2020/05/04 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
Python 文件重命名工具代码
2009/07/26 Python
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
谈谈Python中的while循环语句
2019/03/10 Python
python 字典套字典或列表的示例
2019/12/16 Python
Python request中文乱码问题解决方案
2020/09/17 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
简单叙述一下MYSQL的优化
2016/05/09 面试题
《灯光》教学反思
2014/02/08 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
党支部四风整改方案
2014/10/25 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python
vue判断按钮是否可以点击
2022/04/09 Vue.js