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解释器理解Python中的字节码
Apr 01 Python
python的多重继承的理解
Aug 06 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
使用C++扩展Python的功能详解
Jan 12 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
Jan 17 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
Matplotlib配色之Colormap详解
Jan 05 Python
Python创建自己的加密货币的示例
Mar 01 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编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
Python使用OpenCV进行标定
2018/05/08 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
python asyncio 协程库的使用
2021/01/21 Python
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
医学生自荐信
2013/12/03 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
德育标兵事迹材料
2014/08/24 职场文书
营销经理工作检讨书
2014/11/03 职场文书
2016新年晚会开场白
2015/12/03 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
使用Python开发冰球小游戏
2022/04/30 Python