# -*- coding:utf-8 -*-
import logging
import os
import time
import wx
class TextHandler(logging.Handler):
def __init__(self):
logging.Handler.__init__(self)
self.ctrl = None
def set_ctrl(self, ctrl):
self.ctrl = ctrl
def emit(self, record):
if not self.ctrl == None:
wx.CallAfter(self.ctrl.write, self.format(record) + "\n")
class LogUtils(object):
log = None
@staticmethod
def sharedInstance(task_id):
if LogUtils.log == None:
LogUtils.log = LogUtils(task_id)
return LogUtils.log
def __init__(self, task_id):
self.logger = logging.getLogger(task_id)
self.level = logging.INFO
self.fm = logging.Formatter('%(asctime)s - %(filename)s - [line:%(lineno)-d] - %(levelname)s - %(message)s')
self.text_ctrl = None
self.text_handler = TextHandler()
def set_logger(self, taskid, workpath, logName=''):
# 工作目录
logs = os.path.join(workpath, 'Logs')
if not os.path.exists(logs):
os.makedirs(logs)
if logName == '':
logName = '%s_%s' % (taskid, int(time.time()))
logs_path = logs + '\\' + logName + ".log"
# 文件对象
fh = logging.FileHandler(logs_path)
# 设置格式
fh.setFormatter(self.fm)
# logger添加文件输出流
self.logger.addHandler(fh)
# 输出到控制台
sh = logging.StreamHandler()
# 设置格式
sh.setFormatter(self.fm)
# logger添加标准输出流
self.logger.addHandler(sh)
self.logger.addHandler(self.text_handler)
# 设置从那个等级开始提示
self.logger.setLevel(logging.INFO)
self.logger.info(u'开始写入日志...\n')
def info(self, s):
self.logger.info(s)
def set_ctrl_to_logging(self, text_ctrl):
self.text_ctrl = text_ctrl
if not self.text_handler == None:
self.text_handler.set_ctrl(self.text_ctrl)
调用方法logger.info()
# 日志输出模块
self.LogSizer = wx.BoxSizer()
self.LogText = wx.TextCtrl(self.Panel_Bottom, -1, u'', style=wx.TE_MULTILINE)
# 设置字体风格大小
self.font = wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, False, 'Consolas')
self.LogText.SetFont(self.font)
self.LogSizer.Add(self.LogText, proportion=1, flag=wx.EXPAND | wx.ALL, border=15)
self.Panel_Bottom.SetSizer(self.LogSizer)
self.logger = LogUtils.sharedInstance('1')
LogUtils.sharedInstance('Game').set_ctrl_to_logging(self.LogText)
self.logger.set_logger('Game', 'LogDir',)
效果: