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的更多相关文章

  1. Java Se: Logging 框架说明

    Java Logging 用惯了log4j等日志工具,竟然不知Java还自带了个log工具.今天有空了就来了解一下. 先来看一个简单的例子: public class SystemTest { pri ...

  2. Java日志工具之java.util.logging.Logger

    今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...

  3. Java数据持久层框架 MyBatis之API学习十(Logging详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  4. java.util.logging

    我们目前记录日志用的最多的就是Apache的log4j,其实java.util本身也提供日志记录功能,即java.util.logging,值得关注的就是它的等级与log4j的等级有所不同: 首先我们 ...

  5. 【java】java自带的java.util.logging.Logger日志功能

    偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...

  6. MyBatis基础入门--知识点总结

    对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...

  7. MyBatis日志配置

    关于MyBatis的日志,其实MyBatis已经弄得很好了,你甚至都不用配置,只要导入了jar包,MyBatis就会自动寻找. 具体步骤 1.导入jar包,就是把下载MyBatis时,lib里的包复制 ...

  8. java 持久框架mybatis的初步学习

    什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...

  9. MyBatis入门基础(一)

    一:对原生态JDBC问题的总结 新项目要使用mybatis作为持久层框架,由于本人之前一直使用的Hibernate,对mybatis的用法实在欠缺,最近几天计划把mybatis学习一哈,特将学习笔记记 ...

随机推荐

  1. 那晚征服的一道js经典的面试题

    今天朋友共享了一道js中经典的面试题,需求是这样的 给定你任意一个字符串,让你写出一个算法,求算出该字符串中出现次数最多的一个字符,并将其结果输出 刚拿到这道题的第一感觉便是定义一个count计时器, ...

  2. EasyUI个人项目晒图(续)

    晒自己做的一个管理系统(清新风格)EasyUI 这是自己上一次的文章了,只是给大家看一下自己的美观度是不是还是停留在新手的阶段!反正我自己认为我已经不是一个新手了吧!虽然技术永远学不完,我可以说,我和 ...

  3. sql 添加修改说明

    --为字段a2添加描述信息 EXECUTE sp_addextendedproperty N'MS_Description', '性别', N'user', N'dbo', N'table', N'表 ...

  4. 线段树——Ultra-QuickSort

    题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109331#problem/A Description In this prob ...

  5. 泛函编程(6)-数据结构-List基础

    List是一种最普通的泛函数据结构,比较直观,有良好的示范基础.List就像一个管子,里面可以装载一长条任何类型的东西.如需要对管子里的东西进行处理,则必须在管子内按直线顺序一个一个的来,这符合泛函编 ...

  6. [python学习笔记]Day3

    函数 如: def is_leapyear(year): if (year%4 == 0 and year%100 != 0) or (year%400 == 0): return True else ...

  7. mysql innodb表 utf8 gbk占用空间相同,毁三观

    昨天因为发生字符集转换相关错误,今天想验证下utf8和gbk中英文下各自空间的差距.这一测试,绝对毁三观,无论中文还是中文+英文,gbk和utf8占用的实际物理大小完全相同,根本不是理论上所述的“UT ...

  8. 单例(Singleton pattern)模式的七种写法

    转载请注明出处:http://www.cnblogs.com/smbk/ One: public class Singleton { private static Singleton instance ...

  9. elasticsearch分词插件的安装

    IK简介 IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Luen ...

  10. Java中字节流和字符流的比较(转)

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...