python:继承日志模块生成自定义日志

1 继承日志模块生成自定义日志

from __future__ import absolute_importimport os
import sys
import time
import datetime
import logging
import logging.handlers
import tempfileDATE_FORMAT = '%Y-%m-%d %H:%M:%S'def create_logfile():if 'SYAPI_LOG_TEST' in os.environ:value = tempfile.mkdtemp()elif 'SYAPI_LOG' in os.environ:value = os.environ['SYAPI_LOG']else:value = os.path.join('/var/log','syapi')try:value = os.path.abspath(value)if os.path.exists(value):if not os.path.isdir(value):raise IOError('No such directory: "%s"' % value)if not os.access(value, os.W_OK):raise IOError('Permission denied: "%s"' % value)if not os.path.exists(value):os.makedirs(value)except:print('"%s" is not a valid value for syapi_log.' % value)print('Set the envvar SYAPI_LOG to fix your configuration.')raisereturn valueclass JobIdLogger(logging.Logger):def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None):"""Customizing it to set a default value for extra['job_id']"""rv = logging.LogRecord(name, level, fn, lno, msg, args, exc_info, func)if extra is not None:for key in extra:if (key in ["message", "asctime"]) or (key in rv.__dict__):raise KeyError("Attempt to overwrite %r in LogRecord" % key)rv.__dict__[key] = extra[key]if 'job_id' not in rv.__dict__:rv.__dict__['job_id'] = ''return rvclass JobIdLoggerAdapter(logging.LoggerAdapter):"""Accepts an optional keyword argument: 'job_id'You can use this in 2 ways:1. On class initializationadapter = JobIdLoggerAdapter(logger, {'job_id': job_id})adapter.debug(msg)2. On method invocationadapter = JobIdLoggerAdapter(logger, {})adapter.debug(msg, job_id=id)"""def process(self, msg, kwargs):if 'job_id' in kwargs:if 'extra' not in kwargs:kwargs['extra'] = {}kwargs['extra']['job_id'] = ' [%s]' % kwargs['job_id']del kwargs['job_id']elif 'job_id' in self.extra:if 'extra' not in kwargs:kwargs['extra'] = {}kwargs['extra']['job_id'] = ' [%s]' % self.extra['job_id']return msg, kwargsdef setup_logging(flag,job_id):# Set custom logger
    logging.setLoggerClass(JobIdLogger)formatter = logging.Formatter(fmt="%(asctime)s%(job_id)s [%(levelname)-5s] %(message)s",datefmt=DATE_FORMAT,)sh_logger = logging.getLogger('sy_stream')sh_logger.setLevel(logging.DEBUG)sh = logging.StreamHandler(sys.stdout)sh.setFormatter(formatter)sh.setLevel(logging.DEBUG)sh_logger.addHandler(sh)log_dir = create_logfile()log_name = str(flag)+"-"+ str(job_id) + ".log"log_path = os.path.join(log_dir, log_name)if log_path is not None:file_logger = logging.getLogger('sy_file')file_logger.setLevel(logging.DEBUG)fh = logging.FileHandler(log_path, "w")fh.setFormatter(formatter)fh.setLevel(logging.DEBUG)file_logger.addHandler(fh)# Useful shortcut for the webapp, which may set job_idreturn JobIdLoggerAdapter(file_logger,{'job_id':job_id})else:print('WARNING: log_file config option not found - no log file is being saved')return JobIdLoggerAdapter(sh_logger, {'job_id':job_id})def init_kubelog_logger(flag,job_id):logger = setup_logging(flag,job_id)return logger# job_id = '%s-%s' % (time.strftime('%Y%m%d-%H%M%S'), os.urandom(2).encode('hex'))
# log_obj = init_kubelog_logger("syapi",job_id)
log_obj = init_kubelog_logger("syapi","user001")log_obj.info("hello world log start")
# create_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# create_time_c = time.time()

 

转载于:https://www.cnblogs.com/adamans/articles/9101041.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用JDBC获取Oracle连接时报错

The Network Adapter could not establish the connection 网络适配器不能创建连接 作为初学者的来说,这个问题让我找了好多次,每次重新开启电脑时就可以正常获取连接,过了一会儿,自己不知道做了什么就会又报错,…

.Net CoreRabbitMQ消息转发可靠机制(上)

前言生产者发送消息到了队列,队列推送数据给了消费者,这里存在一些问题需要思考下生产者如何确保消息一定投递到了队列中RabbitMQ 丢失了消息(下文暂不涉及这块)队列如何确保消费者收到了消息呢生产者可靠发送执行流程当生产者将消息发送出去后&#xff…

堆栈的理解

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后&am…

MySQL安装时出现的问题

mysql正常安装结束之后需要连接你所安装的数据库的时候出现下面的错误: Client does not support authentication protocol requested by server;consider upgrading mysql client 解决方法:启动:mysql 8.0 command line client 之后输入下面的代码即可。use mysql;ALTER USER…

一个java文件中可包含多个main方法

java中的main方法是java应用程序的入口,java程序在运行时,首先调用执行main方法。但并不是说java中只能有一个main方法,不同类中都可以包含main方法。当JVM进行编译时,会提示选择其中一个main方法作为编译的入口。 转载于:https:/…

linux java性能监控工具_Linux实时监控工具Nmon使用

官网:http://nmon.sourceforge.net/pmwiki.php?nMain.H网络解压:#chmod ux nmon_x86_64_sles11#chmod 777 nmon_x86_64_sles11版本不同,对应文件也不同启动:# ./nmon_x86_64_sles11按C显示CPU信息,再按一次C关闭按M显…

【SRM-05 B】无题?

Description 有一个拥有n个城市的国家。这个国家由n-1条边连接起来。有一天国家发生叛乱。叛军已占领了一些城市。如果叛军占领的城市中,存在两个城市之间有边直接相连,则称这种情况是坏的。现在并不知道叛军占领了那些城市,问有多少种情况是…

MapReduce 2 中一些基础数据类型

1. LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类,这些类实现了WritableComparable接口,都能够被串行化从而便于在分布式环境中进行数据交换,以及进行大小比较。你可以将它们分别视为long,int,String 的替…

分享一些 Java 后端的个人干货

学习 Java 也有了不少时间,入 Java 后台的坑也有了一段时日。这段时间里,听过许多前辈的经验与分享,也看过许多大佬的文章和作品。找了个时间整理和总结了一下我个人到目前为止一路以来的听到看到或者自己感悟到的干货。 这篇文章可能更多的是…

.NET MAUI实战 Routing

1.详情本章继续分享.NET MAUI中的路由,这个概念依旧是在Prism里存在过的概念。如果使用过Prism框架的小伙伴使用该机制上手速度是非常快的。接下来一起来看看什么是路由。.NET 多平台应用 UI (.NET MAUI) Shell 包含基于 URI 的导航体验,该体验使用路由导…

分享Web应用运行的细节问题:预编译提高网站性能、跟踪用户习惯和解决线程同步...

在这个文章里,我将分享一下在iOpenWorks.com这个网站试运行中碰到的若干问题和解决方案,这些问题包含了:(1)如何通过ASP.NET MVC预编译提高性能;(2)如何知道网站在运行中&#xff0c…

mondrain配置mysql_mondrian 4.7 源码部署(示例代码)

mondrian是一个开源的数据分析工程, 网上有关mondrian3.X的源码部署比较多, 有关4.X的部署较少. 目前官方推荐使用的时mondrian3.7的修订版, 可以再github上下载到最近更新维护的mondrian-master, 下载下来后基本上只需要按部就班的使用maven build一下就可以正常使用了, 如有问…

腾讯云DevOps技术揭秘:新时代运维重器Tencent Hub最佳实践

随着云计算和容器技术的发展以及微服务架构的兴起,服务能够实现细粒度的部署,维护和伸缩。在使开发人员能快速开发的同时,这些技术也给系统和应用的运维带来了更大的挑战。DevOps理念也应运而生,强调研发和运维的流程及工具的自动…

关于内存的划分和传引用传参数的区别

1.堆 2.栈 空间较小 3.全局 4.代码段 要搞懂每个区域放什么东西 堆 复杂类型栈 变量静 代复杂类型对象没有指针指的时候,堆中的内容垃圾回收1函数传对象的时候,其实是首先在堆里面开一个内存放对象属性内容,在栈里面开一个内存放一个变量&…

.Net CoreRabbitMQ消息存储可靠机制(下)

前言上篇讨论过消息投递和消息消费过程中如何确保可靠传输,也提及到消息到达RabbitMQ中到被消费前也需要可靠的留存,可因许多的不确定因素会影响着消息的存在与否。消息中转点生产者发送消息到RabbitMQ中,如果交换机根据自身类型和RoutingKey…

nginx安装及负载均衡配置

Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发…

java怎么获取该项目系统的参数_Java 获取系统参数

Java 获取系统参数2014/5/22 12:57:44 a920829018 程序员俱乐部 我要评论(0)摘要:通过System.getProperties()获取系统参数PropertiespropsSystem.getProperties();//系统属性System.out.println("Java的运行环境版本:"props.getProperty(&…

智能停车O2O 独角兽初现:“ETCP停车”获5000万美金A轮融资

日前,国内第一智能停车平台“ETCP停车”宣布完毕A轮融资,由源代码资本、SIG、易车网、经纬中国和商企界知名人士联合投资超过5000万美金。同一时候获悉,ETCP作为中国智能停车行业龙头老大,不仅是该行业的创建者和领军品牌&#xf…

没有人会觉得正则表达式难写

1. RegExp对象 JavaScript有两种方式实例化RegExp对象 字面量构造函数字面量 const reg /all/; console.log(reg); // /all/ This is all I have..replace(reg, ALL); // This is ALL I have. 复制代码构造函数 const reg new RegExp(all); console.log(reg); // /all…

ASP.NET MVC使用Bootstrap系统(2)——使用Bootstrap CSS和HTML元素

阅读目录 Bootstrap 栅格(Grid)系统Bootstrap HTML元素Bootstrap 验证样式ASP.NET MVC创建包含Bootstrap样式编辑模板小结Bootstrap提供了一套丰富CSS设置、HTML元素以及高级的栅格系统来帮助开发人员快速布局网页。所有的CSS样式和HTML元素与移动设备优…