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通过getopt模块如何获取执行的命令参数详解
Dec 29 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
DataFrame中的object转换成float的方法
Apr 10 Python
详解python做UI界面的方法
Feb 27 Python
Python整数对象实现原理详解
Jul 01 Python
python3.7简单的爬虫实例详解
Jul 08 Python
python tornado使用流生成图片的例子
Nov 18 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
python的列表List求均值和中位数实例
Mar 03 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
浅析Python 责任链设计模式
Sep 11 Python
python中count函数知识点浅析
Dec 17 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脚本的10个技巧(6)
2006/10/09 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
python数据类型_字符串常用操作(详解)
2017/05/30 Python
django实现用户登陆功能详解
2017/12/11 Python
Python测试人员需要掌握的知识
2018/02/08 Python
Linux下多个Python版本安装教程
2018/08/15 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
Python中return函数返回值实例用法
2020/11/19 Python
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
老海军美国官网:Old Navy
2016/09/05 全球购物
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
汽车车尾标语大全
2015/08/11 职场文书
教师节主题班会方案
2015/08/17 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
Python绘画好看的星空图
2022/03/17 Python