A class for global logging
Some time we need to record the logging information in multiple module, however if we use the follows logging configuration would lead the log cannot write to the same file for the file stream would be lock in multiple process.
import logging
#setting the the logging configuration
logging.basicConfig(level=logging.DEBUG,
filename='/home/ronglian/project/ebscn/log/fastlogin.log',
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filemode='w')
The follows logging class would avoid the multiple process problem.
import logging
#from cloghandler import ConcurrentRotatingFileHandler class NullHandler(logging.Handler):
def emit(self,record):
pass
class GlobalLogging:
log = None
@staticmethod
#def getInstance():
def getLog():
if GlobalLogging.log == None:
GlobalLogging.log = GlobalLogging()
return GlobalLogging.log def __init__(self):
self.logger = None
self.handler = None
self.level = logging.DEBUG
self.logger = logging.getLogger("GlobalLogging")
self.formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
h = NullHandler()
self.logger.addHandler(h)
self.logger.setLevel(self.level) #fixme
self.setLoggingToFile("/home/ronglian/project/taskschedule/logs/taskschedule.log") def setLoggingToFile(self,file):
#fh = ConcurrentRotatingFileHandler(file,"a", 512*1024, 5)
fh = logging.FileHandler(file)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh) def setLoggingToConsole(self) :
ch = logging.StreamHandler()
ch.setFormatter(self.formatter)
self.logger.addHandler(ch) def setLoggingToHandler(self,handler):
self.handler = handler def setLoggingLevel(self,level):
self.level = level
self.logger.setLevel(level) def debug(self,s):
self.logger.debug(s)
if not self.handler == None and self.level <= logging.DEBUG :
self.handler('-DEBUG-:' + s)
def info(self,s): self.logger.info(s)
if not self.handler == None and self.level <= logging.INFO:
self.handler('-INFO-:' + s)
def warn(self,s):
self.logger.warn(s)
if not self.handler == None and self.level <= logging.WARNING:
self.handler('-WARN-:' + s)
def error(self,s): self.logger.error(s)
if not self.handler == None and self.level <= logging.ERROR:
print 'enter error'
self.handler('-ERROR-:' + s)
def critical(self,s):
self.logger.critical(s)
if not self.handler == None and self.level <= logging.CRITICAL:
self.handler('-CRITICAL-:' + s)
Sometimes, we need to generate the logs depend on the different time frequency, so we can use the rotate handler, such as the follows:
import logging
import datetime
from logging.handlers import TimedRotatingFileHandler
from logging.handlers import RotatingFileHandler
#from cloghandler import ConcurrentRotatingFileHandler
'''
CRITICAL 50,ERROR 40,WARNING 30,INFO 20,DEBUG 10,NOTSET 0
'''
import os
import sys
Basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) class NullHandler(logging.Handler): def emit(self, record):
pass class GlobalLogging:
log = None @staticmethod
# def getInstance():
def getLog():
if GlobalLogging.log == None:
GlobalLogging.log = GlobalLogging()
return GlobalLogging.log def __init__(self):
self.logger = None
self.handler = None
self.level = logging.INFO
self.logger = logging.getLogger("GlobalLogging")
self.formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") self.logger.setLevel(self.level) # fixme
date = datetime.datetime.now().strftime("%Y-%m-%d-%M")
fname = str(Basedir) + '/logs/taskschedule.log'
# if not os.path.exists(fname+'.'+date):
# os.mknod(fname)
# os.system('chmod 777 ' + fname)
h = TimedRotatingFileHandler(fname,
when="midnight",
interval=1,
backupCount=100)
# h= RotatingFileHandler(fname,
# mode='a',
# backupCount=20)
h.setFormatter(self.formatter)
self.logger.addHandler(h)
# print fname #self.setLoggingToFile(fname) def setLoggingToFile(self, file):
#fh = ConcurrentRotatingFileHandler(file,"a", 512*1024, 5)
fh = logging.FileHandler(file)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh) def setLoggingToConsole(self):
ch = logging.StreamHandler()
ch.setFormatter(self.formatter)
self.logger.addHandler(ch) def setLoggingToHandler(self, handler):
self.handler = handler def setLoggingLevel(self, level):
self.level = level
self.logger.setLevel(level) def debug(self, s):
self.logger.debug(s)
if not self.handler == None and self.level <= logging.DEBUG:
self.handler('-DEBUG-:' + s) def info(self, s): self.logger.info(s)
print self.handler,self.level
if not self.handler == None and self.level <= logging.INFO:
self.handler('-INFO-:' + s) def warn(self, s):
self.logger.warn(s)
if not self.handler == None and self.level <= logging.WARNING:
self.handler('-WARN-:' + s) def error(self, s): self.logger.error(s)
if not self.handler == None and self.level <= logging.ERROR:
print 'enter error'
self.handler('-ERROR-:' + s) def critical(self, s):
self.logger.critical(s)
if not self.handler == None and self.level <= logging.CRITICAL:
self.handler('-CRITICAL-:' + s)
A class for global logging的更多相关文章
- Java Se: Logging 框架说明
Java Logging 用惯了log4j等日志工具,竟然不知Java还自带了个log工具.今天有空了就来了解一下. 先来看一个简单的例子: public class SystemTest { pri ...
- Java日志工具之java.util.logging.Logger
今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...
- Java数据持久层框架 MyBatis之API学习十(Logging详解)
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- java.util.logging
我们目前记录日志用的最多的就是Apache的log4j,其实java.util本身也提供日志记录功能,即java.util.logging,值得关注的就是它的等级与log4j的等级有所不同: 首先我们 ...
- 【java】java自带的java.util.logging.Logger日志功能
偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...
- MyBatis基础入门--知识点总结
对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...
- MyBatis日志配置
关于MyBatis的日志,其实MyBatis已经弄得很好了,你甚至都不用配置,只要导入了jar包,MyBatis就会自动寻找. 具体步骤 1.导入jar包,就是把下载MyBatis时,lib里的包复制 ...
- java 持久框架mybatis的初步学习
什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...
- MyBatis入门基础(一)
一:对原生态JDBC问题的总结 新项目要使用mybatis作为持久层框架,由于本人之前一直使用的Hibernate,对mybatis的用法实在欠缺,最近几天计划把mybatis学习一哈,特将学习笔记记 ...
随机推荐
- Winform开发框架的业务对象统一调用方式
在这个纷繁的社会里面,统一性的特点能够带来很多高效的产出.牢固的记忆,这种特征无论对于企业.个人的开发工作,知识的传承都有着非常重要的作用,Winfrom框架本身就是基于这个理念而生,从统一的数据库设 ...
- 随心所欲导出你的 UI 界面到 PDF 文件
使用 C1PDF 控件可以导出文件到 PDF 文件,结合 .NET 平台特性你可以在任何客户端生成自定义报表.你可以打印任何 UI 界面,例如 DataGrid 导出到 PDF. 在本篇文章中我们将阐 ...
- 自己动手搞定支付宝手机网站支付接口 FOR ECShop
支付宝WAP网站版本的支付接口网上整合的比较少,看到很多网站在卖,顿觉无语. 主要是得自己查看支付宝官方提供的SDK中的开发文档. 支付宝sdk下载地址:https://doc.open.alipay ...
- 亲们! 首次见面! 带来不适!多多见谅!--------->>Bank系统
亲们!您们好! 讲一下Bank系统的做法: 01.首先创建一个Card类 using System; using System.Collections.Generic; using System.Li ...
- [.NET] SQL数据分页查询
[.NET] SQL数据分页查询 程序下载 范例下载:点此下载 原始码下载:点此下载 NuGet封装:点此下载 数据查询 开发系统时,使用C#执行SQL查询指令,就可以从SQL数据库里查询所需数据. ...
- 简洁侧边wordpress博客模板
模板描述:商务领航,尽现成熟稳重的个人小站风格 响应式Web设计,自适应电脑.平板电脑.移动设备 图标字体库,自适应各种终端设备,保证图形图标清晰无锯齿,支持Retina(视网膜屏幕) ...
- ArcEngine 0x8004023C
在进行缓冲区查询时,查询的并是不要素本身的范围,而是缓冲一定半径,所以用到了ITopologicalOperator接口,主要是利用其buffer方法,代码如下: IFeatureClass pFea ...
- SAP SD 需求类别确定
分别按如下优先级确定 1.先从物料主数据中取MRP组对应的策略组. 在物料的MRP1视图中可以得到MRP组, 通过OPPR事务,查找策略组 根据策略组找到对应的策略 img-->生产---> ...
- 在SharePoint中无代码开发InfoPath应用: 获取当前用户信息
很多种不同的场景下,会需要得到当前的用户信息,例如需要根据当前用户判断组,进而控制权限. 首先InfoPath提供了一个userName方法,来实现这个目的,不过这个方法的问题是只能获得不包含域名的用 ...
- 详解Paint的各种set方法
一.前言 我们用set方法来设置画笔的样式,类似于我们挑选画笔画画的过程.由于上面有些方法不支持硬件加速,所以在高版本系统中可能会没有效果.因此,我们首先来看看官方废弃的方法. 下图来自:https: ...