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中函数的调用与定义
Mar 14 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python正则表达式面试题解答
Apr 28 Python
python实现比较文件内容异同
Jun 22 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
python内打印变量之%和f的实例
Feb 19 Python
Django 设置多环境配置文件载入问题
Feb 25 Python
python3 使用traceback定位异常实例
Mar 09 Python
python list等分并从等分的子集中随机选取一个数
Nov 16 Python
Python闭包的定义和使用方法
Apr 11 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 什么是PEAR?(第二篇)
2009/03/19 PHP
一个简单的网页密码登陆php代码
2012/07/17 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
2013/09/21 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
jQuery+ajax实现动态执行脚本的方法
2015/01/27 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
使用PDB简单调试Python程序简明指南
2015/04/25 Python
python中logging库的使用总结
2017/10/18 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
Django中使用Celery的教程详解
2018/08/24 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
jupyter 导入csv文件方式
2020/04/21 Python
python字典key不能是可以是啥类型
2020/08/04 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
用python批量下载apk
2020/12/29 Python
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
高中生自我评价个人范文
2013/11/09 职场文书
运动会口号16字
2014/06/07 职场文书
新文化运动的基本口号
2014/06/21 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS