python logging通過(guò)json文件配置的步驟
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)
調(diào)用
config_path = sys.path[0] + '/logconfig.json'
log_utility.setup_logging(config_path)
補(bǔ)充知識(shí):python logging定制logstash的json日志格式
最近一直在折騰日志的收集,現(xiàn)在算是收尾了。 寫一篇算python優(yōu)化logstash的方案。
其實(shí)大家都知道logstash調(diào)用grok來(lái)解析日志的話,是要消耗cpu的成本的,畢竟是需要正則的匹配的。
根據(jù)logstash調(diào)優(yōu)的方案,咱們可以預(yù)先生成json的格式。 我這邊基本是python的程序,怎么搞尼 ?
有兩種方法,第一種方法是生成json后,直接打入logstash的端口。 還有一種是生成json寫入文件,讓logstash做tail操作的時(shí)候,把一行的日志數(shù)據(jù)直接載入json就可以了。
python下的日志調(diào)試用得時(shí)logging,改成json也是很好改得。 另外不少老外已經(jīng)考慮到這樣的需求,已經(jīng)做了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')
不管怎么說(shuō),最后生成的格式是這樣就可以了。
{
"@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"
}
我這里簡(jiǎn)單提一下,這個(gè)模塊用的不是很滿意,我在python下把日志打成了json字符串,我原本以為會(huì)像grok那樣,在Es里面,我的這條日志是個(gè)字段的結(jié)構(gòu),而不是這個(gè)日志都在message里面…. 我想大家應(yīng)該明白了我的意思,這樣很是不容易在kibana的搜索…
在kibana搜索,我經(jīng)常上 source:xxx AND level:INFO 結(jié)果正像上面描述的那樣,整條日志,都在@message里面。
以上這篇python logging通過(guò)json文件配置的步驟就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python使用ctypes調(diào)用第三方庫(kù)時(shí)出現(xiàn)undefined?symbol錯(cuò)誤詳解
python中時(shí)間的庫(kù)有time和datetime,pandas也有提供相應(yīng)的時(shí)間處理函數(shù),下面這篇文章主要給大家介紹了關(guān)于python使用ctypes調(diào)用第三方庫(kù)時(shí)出現(xiàn)undefined?symbol錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2023-02-02
Python摳圖教程之使用OpenCV實(shí)現(xiàn)背景去除
這篇文章主要給大家介紹了關(guān)于Python摳圖教程之使用OpenCV實(shí)現(xiàn)背景去除的相關(guān)資料,背景去除是在很多視覺(jué)應(yīng)用里的主要預(yù)處理步驟,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
利用Python中的內(nèi)置open函數(shù)讀取二進(jìn)制文件
這篇文章主要介紹了利用Python實(shí)現(xiàn)讀取二進(jìn)制文件,文章嘗試使用Python中的內(nèi)置open函數(shù)使用默認(rèn)讀取模式讀取zip文件,下文詳細(xì)介紹,需要的小伙伴可以參考一下2022-05-05
python測(cè)試開(kāi)發(fā)django之使用supervisord?后臺(tái)啟動(dòng)celery?服務(wù)(worker/beat)
Supervisor是用Python開(kāi)發(fā)的一個(gè)client/server服務(wù),是Linux/Unix系統(tǒng)下的一個(gè)進(jìn)程管理工具,不支持Windows系統(tǒng),這篇文章主要介紹了python測(cè)試開(kāi)發(fā)django之使用supervisord?后臺(tái)啟動(dòng)celery?服務(wù)(worker/beat),需要的朋友可以參考下2022-07-07
python3 traceback模塊來(lái)追蹤和打印異常信息
本文主要介紹了python3 traceback模塊來(lái)追蹤和打印異常信息,這個(gè)模塊提供了許多函數(shù)來(lái)處理異常,并且能夠輸出異常的堆棧信息,感興趣的可以了解一下2024-02-02
Centos7 Python3下安裝scrapy的詳細(xì)步驟
這篇文章主要介紹了Centos7 Python3下安裝scrapy的詳細(xì)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03

