@@ -11,9 +11,10 @@ class Log:
1111 def __init__ (self ):
1212 self .log_level = logging .DEBUG
1313 self .log_format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'
14- self .log_datefmt = '%a, %d %b %Y %H:%M:%S'
14+ # self.log_date_fmt = '%a, %d %b %Y %H:%M:%S'
15+ self .log_date_fmt = '%Y-%m-%d %H:%M:%S'
1516 self .log_filename = 'myapp.log'
16- self .log_filemode = 'w'
17+ self .log_filemode = 'w' # 默认'a'
1718 self .memory_usage = '0.00M'
1819
1920 def log_config (self ):
@@ -23,7 +24,7 @@ def log_config(self):
2324 logging .basicConfig (
2425 level = self .log_level ,
2526 format = self .log_format ,
26- datefmt = self .log_datefmt ,
27+ datefmt = self .log_date_fmt ,
2728 filename = self .log_filename ,
2829 filemode = self .log_filemode
2930 )
@@ -60,7 +61,79 @@ def warning(msg):
6061 logging .warning (msg )
6162
6263
63- if __name__ == '__main__' :
64+ class Logger :
65+ """
66+ 日志工具类
67+ 按照不同等级分别向终端显示和文件写入
68+ """
69+ def __init__ (self , logger_name , logger_filename ):
70+ self .logger_name = logger_name
71+ self .logger_filename = logger_filename
72+ self .logger_fmt = '%(asctime)s - %(name)s - %(filename)s - [line:%(lineno)d] - %(levelname)s - %(message)s'
73+ self .logger_date_fmt = '%Y-%m-%d %H:%M:%S'
74+ self .file_handler_level = logging .INFO
75+ self .stream_handler_level = logging .DEBUG
76+ self .memory_usage = '0.00M'
77+ self .logger = logging .getLogger (self .logger_name )
78+ self .set_logger ()
79+
80+ def set_logger (self ):
81+ """
82+ 配置logger
83+ """
84+ # 给logger设置相对较低的日志等级(否则小于logger的默认WARNING级别的信息将被忽略,可能会使handler设置无效)
85+ self .logger .setLevel (logging .DEBUG ) # 这里输出所有信息,将日志等级控制权限交给handler
86+ # 分别创建两个handler,用于写入日志文件和输出到控制台
87+ file_handler = logging .FileHandler (self .logger_filename )
88+ stream_handler = logging .StreamHandler ()
89+ # 给handler设置日志等级
90+ file_handler .setLevel (self .file_handler_level )
91+ stream_handler .setLevel (self .stream_handler_level )
92+ # 定义handler的输出格式formatter
93+ formatter = logging .Formatter (self .logger_fmt , self .logger_date_fmt )
94+ # 设置日志输出格式
95+ file_handler .setFormatter (formatter )
96+ stream_handler .setFormatter (formatter )
97+ # 给logger添加handler
98+ self .logger .addHandler (file_handler )
99+ self .logger .addHandler (stream_handler )
100+
101+ def get_memory_usage (self ):
102+ """
103+ 获取当前进程内存使用情况(单位M)
104+ """
105+ import os
106+ # 获取当前脚本的进程ID
107+ pid = os .getpid ()
108+ # 获取当前脚本占用的内存
109+ cmd = 'ps -p %s -o rss=' % pid
110+ output = os .popen (cmd )
111+ result = output .read ()
112+ if result == '' :
113+ memory_usage_value = 0
114+ else :
115+ memory_usage_value = int (result .strip ())
116+ memory_usage_format = memory_usage_value / 1024.0
117+ print '内存使用%.2fM' % memory_usage_format
118+ self .memory_usage = '%.2fM' % memory_usage_format
119+
120+ def critical (self , msg ):
121+ self .logger .critical (msg )
122+
123+ def error (self , msg ):
124+ self .logger .error (msg )
125+
126+ def warning (self , msg ):
127+ self .logger .warning (msg )
128+
129+ def info (self , msg ):
130+ self .logger .info (msg )
131+
132+ def debug (self , msg ):
133+ self .logger .debug (msg )
134+
135+
136+ def test_log ():
64137 # 实例化,修改日志文件名称,加载新配置
65138 xxx = Log ()
66139 xxx .log_filename = 'myapp2.log'
@@ -70,7 +143,28 @@ def warning(msg):
70143 xxx .info ('This is info message' )
71144 xxx .warning ('This is warning message' )
72145
146+
147+ def test_logger ():
148+ """
149+ 测试Logger工具类
150+ """
151+ logger = Logger ('my_logger' , 'my_app.log' )
152+ logger .debug ('debug message' )
153+ logger .info ('info message' )
154+ logger .warning ('warning message' )
155+ logger .error ('error message' )
156+ logger .critical ('critical message' )
157+ logger .get_memory_usage ()
158+
159+
160+ if __name__ == '__main__' :
161+ test_logger ()
162+
163+
73164'''
165+ 默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
166+ 日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
167+
74168logging.basicConfig函数各参数:
75169filename: 指定日志文件名
76170filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
0 commit comments