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 IDE PyCharm的基本快捷键和配置简介
Nov 04 Python
Python优先队列实现方法示例
Sep 21 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
python+selenium实现QQ邮箱自动发送功能
Jan 23 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 Python
Win10 安装PyCharm2019.1.1(图文教程)
Sep 29 Python
关于Tensorflow分布式并行策略
Feb 03 Python
Django项目创建及管理实现流程详解
Oct 13 Python
python中turtle库的简单使用教程
Nov 11 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 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
杏林同学录(一)
2006/10/09 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
ExtJS判断IE浏览器类型的方法
2014/02/10 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
layui分页效果实现代码
2017/05/19 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
2017/06/29 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
举例详解Python中的split()函数的使用方法
2015/04/07 Python
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
Python调用C语言的实现
2019/07/26 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
PHP如何与mysql建立链接
2013/05/05 面试题
新教师培训心得体会
2014/09/02 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
合同纠纷调解书
2015/05/20 职场文书
单位车辆管理制度
2015/08/05 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
对Keras自带Loss Function的深入研究
2021/05/25 Python