我的日志代码:
import os
import logging
import logging.handlers
import sys
from logging import raiseExceptions
from logging import Logger
LOG_PATH = '/tmp/'
class AppLogger(Logger):
def __init__(self, name, level=logging.NOTSET):
super(AppLogger, self).__init__(name, level)
def callHandlers(self, record):
"""
Pass a record to all relevant handlers.
Loop through all handlers for this logger and its parents in the
logger hierarchy. If no handler was found, output a one-off error
message to sys.stderr. Stop searching up the hierarchy whenever a
logger with the "propagate" attribute set to zero is found - that
will be the last logger whose handlers are called.
"""
c = self
found = 0
while c:
for hdlr in c.handlers:
found = found + 1
if hdlr.name == 'console':
if record.levelno >= hdlr.level:
hdlr.handle(record)
else:
if record.levelno == hdlr.level:
hdlr.handle(record)
if not c.propagate:
c = None # break out
else:
c = c.parent
if (found == 0) and raiseExceptions and not self.manager.emittedNoHandlerWarning:
sys.stderr.write("No handlers could be found for logger"
" \"%s\"\n" % self.name)
self.manager.emittedNoHandlerWarning = 1
def get_logger(logfile_name=__name__, log_path=LOG_PATH):
'''save log to diffrent file by different log level into the log path
and print all log in console'''
logging.setLoggerClass(AppLogger)
formatter = logging.Formatter(
'%(asctime)s %(name)s %(levelname)s %(message)s',
'%Y-%m-%d %H:%M:%S')
log_files = {
logging.DEBUG: os.path.join(log_path, logfile_name + '-debug.log'),
logging.INFO: os.path.join(log_path, logfile_name + '-info.log'),
logging.WARNING: os.path.join(log_path, logfile_name + '-warning.log'),
logging.ERROR: os.path.join(log_path, logfile_name + '-error.log'),
logging.CRITICAL: os.path.join(log_path, logfile_name + '-critical.log')
}
logger = logging.getLogger()
logger.name = 'app'
logger.setLevel(logging.DEBUG)
for log_level, log_file in log_files.items():
file_handler = logging.handlers.TimedRotatingFileHandler(log_file, 'midnight')
file_handler.setLevel(log_level)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.name = "console"
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
return logger
logger = get_logger()
我的烧瓶代码:
from log import logger
from flask import Flask
app = Flask(__name__)
app.debug = True
@app.route("/")
def hello():
return "Hello World!"
logger.debug('----')
logger.info('----')
logger.error('----')
logger.warning('----')
app.run()
2017-11-08 20:07:31 app INFO ----
2017-11-08 20:07:31 app ERROR ----
2017-11-08 20:07:31 app WARNING ----
2017-11-08 20:07:31 werkzeug INFO * Restarting with stat
2017-11-08 20:07:31 app INFO ----
2017-11-08 20:07:31 app ERROR ----
2017-11-08 20:07:31 app WARNING ----
2017-11-08 20:07:31 werkzeug INFO * Debugger PIN: 971-444-041
2017-11-08 20:07:31 werkzeug INFO * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
warning.log
2017-11-08 20:07:31 app ERROR ----
2017-11-08 20:07:31 app WARNING ----
2017-11-08 20:07:31 app ERROR ----
2017-11-08 20:07:31 app WARNING ----
2017-11-08 20:07:31 werkzeug WARNING * Debugger is active!
您必须只为每个日志处理程序添加文件名,通过以下方法更改代码
import logging
class MultiFileHandler(logging.FileHandler):
def __init__(self, filename, mode, encoding=None, delay=0):
logging.FileHandler.__init__(self, filename, mode, encoding, delay)
def emit(self, record):
if self.should_change_file(record):
self.change_file(record.file_id)
logging.FileHandler.emit(self, record)
def should_change_file(self, record):
if not hasattr(record, 'file_id') or record.file_id == self.baseFilename:
return False
return True
def change_file(self, file_id):
self.stream.close()
self.baseFilename = file_id
self.stream = self._open()
if __name__ == '__main__':
logger = logging.getLogger('request_logger')
logger.setLevel(logging.DEBUG)
handler = MultiFileHandler(filename='out.log', mode='a')
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
# Log some messages to the original file
logger.debug('debug message')
logger.info('info message')
# Log some messages to a different file
logger.debug('debug message', extra={'file_id':'debug.log'})
logger.info('info message', extra={'file_id':'info.log'})
logger.warn('warn message', extra={'file_id':'warn.log'})
logger.error('error message', extra={'file_id':'error.log'})
如何编写一个简单的log4j2.xml文件,将不同级别的日志放入不同的文件中? 例如,我们有错误日志,任何信息日志,我需要将所有错误日志消息推入一个日志文件,所有信息日志消息推入另一个文件。 我怎么做?
问题内容: 我正在使用log4j登录我的应用程序。我正在尝试在不同文件中使用不同级别的日志,但是出了点问题。对于解决此问题的任何帮助,我们将不胜感激。 问题答案: log4j附加程序的标准行为是,它们以其阈值级别 或更高 的阈值记录所有消息,即具有阈值INFO的附加器将记录INFO,WARN,ERROR和FATAL消息,但不记录DEBUG。如果你想记录 只有 INFO信息,但不会发出警告及以上,然
问题内容: 我有一个普通的INFO级别应用日志。我需要的是另外记录所有错误级别的事件,以单独的错误日志。我正在使用这样的配置: 此配置仅记录错误。如果我首先放置信息级别记录器,则它将仅记录到一般附加程序,但错误记录器将无法工作。我想让他们两个都工作。 问题答案: 您需要做的是只有一个定义了INFO级别的定义,但是在您的两个追加器定义中,您需要相应地设置其阈值,例如 然后,将两个追加程序添加到记录器
我的简单问题是:如果我有两个类似logger的语句。info()和记录器。error()在Java中(使用log4j),我希望将这两行的结果打印在两个单独的文件中。也就是说,记录器。信息(…)应该打印到一个文件,比如myLog。信息和记录器。错误(…)应该打印到myLog。错误文件。我正在使用滚动文件追加器执行此任务。另外,我只需要一个记录器对象来完成任务。有人可能会建议两个或多个不同的记录器,每
我的目标是: 实现所有自定义,内置记录器从同一个包到不同的文件。 信息-信息日志文件 我尝试的是: 问题是: 记录器名称相同。因此,最新的记录器只能工作。在这种情况下,Info可以工作,但也不能调试。 我的疑问是: 我引用了这么多帖子。我认为下面的方法是有效的。 按此处所述,将每一个作为自定义记录器。但我确信这是否正确的解决方案
下面,我有一个全局应用的日志回溯配置。 我想全局使日志记录级别错误,除了一个类。对于一个特定的类,我想使日志记录级别 INFO。我该怎么做?