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 Socket编程入门教程
Jul 11 Python
Python入门篇之函数
Oct 20 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
Sanic框架流式传输操作示例
Jul 18 Python
python利用tkinter实现屏保
Jul 30 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
Pycharm快捷键配置详细整理
Oct 13 Python
详解解Django 多对多表关系的三种创建方式
Aug 23 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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
PHP中实现Bloom Filter算法
2015/03/30 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
javascript适合移动端的日期时间拾取器
2015/11/10 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
python list 合并连接字符串的方法
2013/03/09 Python
详解Python的Django框架中的中间件
2015/07/24 Python
在Django中实现添加user到group并查看
2019/11/18 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
中间件的定义
2016/08/09 面试题
优秀毕业生求职推荐信范文
2013/11/21 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
python之json文件转xml文件案例讲解
2021/08/07 Python
MySQL数据库完全卸载的方法
2022/03/03 MySQL
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技