我是python日志记录模块的新手。我想在应用程序处于运行状态时每天创建一个新的日志文件。
log file name - my_app_20170622.log
log file entries within time - 00:00:01 to 23:59:59
第二天,我想创建一个新日志文件,其中包含第二天的日期 -
log file name - my_app_20170623.log
log file entries within time - 00:00:01 to 23:59:59
我正在使用python的日志模块。
我正在使用如下 -
log_level = int(log_level)
logger = logging.getLogger('simple')
logger.setLevel(log_level)
fh = logging.FileHandler(log_file_name)
fh.setLevel(log_level)
formatter = logging.Formatter(log_format)
fh.setFormatter(formatter)
logger.addHandler(fh)
他们在python的日志记录模块中的任何配置是否每天都创建一个日志?
答案 0 :(得分:15)
您必须创建TimedRotatingFileHandler
:
from logging.handlers import TimedRotatingFileHandler
logname = "my_app.log"
handler = TimedRotatingFileHandler(logname, when="midnight", interval=1)
handler.suffix = "%Y%m%d"
logger.addHandler(handler)
这段代码将创建my_app.log
,但当当天在午夜结束时,日志将被移动到名为my_app.log.20170623
的新日志文件。
我希望这会有所帮助。
答案 1 :(得分:3)
最后,我得到了正确答案,我想分享这个答案。
基本上,需要创建一个TimedRotatingFileHandler,如下所示 -
log_format = "%(asctime)s - %(levelname)s - %(message)s"
log_level = 10
handler = TimedRotatingFileHandler("my_app.log", when="midnight", interval=1)
handler.setLevel(log_level)
formatter = logging.Formatter(log_format)
handler.setFormatter(formatter)
# add a suffix which you want
handler.suffix = "%Y%m%d"
#need to change the extMatch variable to match the suffix for it
handler.extMatch = re.compile(r"^\d{8}$")
# finally add handler to logger
logger.addHandler(handler)
以上代码将生成当天的my_app.log文件和前一天的my_app.log.20170704文件。
希望它有所帮助。
答案 2 :(得分:1)
class RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
返回 RotatingFileHandler
类 的新实例。指定的文件被打开并用作记录流。如果未指定模式,则使用 a
。默认情况下,文件会无限增长。
每次当前日志文件达到特定大小时,RotatingFileHandler
允许我们将日志语句轮换到一个新文件中。
在此示例中,我们将对其进行设置,以便当它达到 500 字节时,我们将轮换到一个新文件中,最多备份 2 个。
import logging
import logging.handlers as handlers
import time
logger = logging.getLogger('my_app')
logger.setLevel(logging.INFO)
logHandler = handlers.RotatingFileHandler('app.log', maxBytes=500, backupCount=2)
logHandler.setLevel(logging.INFO)
logger.addHandler(logHandler)
def main():
while True:
time.sleep(1)
logger.info("A Sample Log Statement")
main()
执行此操作后,您应该注意到每次 app.log
超过 500 字节时,它都会关闭并重命名为 app.log.x
,其中 x
的值递增,直到达到我们设置的任何值backupCount
到。
class TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
返回 TimedRotatingFileHandler
类 的新实例。指定的文件被打开并用作记录流。旋转时,它还设置文件名后缀。根据时间和间隔的乘积进行旋转。
您可以使用when来指定间隔的类型。可能的值列表是,注意它们不区分大小写:
| Value | Type of interval |
|:--------:|:---------------------:|
| S | Seconds |
| M | Minutes |
| H | Hours |
| D | Days |
| W | Week day (0=Monday) |
| midnight | Roll over at midnight |
TimedRotatingFileHandler
允许我们按时间片捕获日志文件。
import logging
import logging.handlers as handlers
import time
logger = logging.getLogger('my_app')
logger.setLevel(logging.INFO)
logHandler = handlers.TimedRotatingFileHandler('timed_app.log', when='M', interval=1)
logHandler.setLevel(logging.INFO)
logger.addHandler(logHandler)
def main():
while True:
time.sleep(1)
logger.info("A Sample Log Statement")
main()
运行此代码将每分钟无限期地创建新的日志文件。我们可以在 backupCount
实例上设置 logHandler
参数,它会限制我们创建的日志文件的数量。
使用 TimedRotatingFileHandler
和 RotatingFileHandler
可以执行以下操作,例如将所有错误消息记录到一个旋转文件中,但将所有正常日志文件记录到 TimedRotatingFileHandler 中,因为我们希望我们可以期望比错误消息更多。
两个级别的记录分为两个不同的日志级别:INFO
和 ERROR
到两个不同的地方。
import logging
import logging.handlers as handlers
import time
logger = logging.getLogger('my_app')
logger.setLevel(logging.INFO)
## Here we define our formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logHandler = handlers.TimedRotatingFileHandler('normal.log', when='M', interval=1, backupCount=0)
logHandler.setLevel(logging.INFO)
logHandler.setFormatter(formatter)
errorLogHandler = handlers.RotatingFileHandler('error.log', maxBytes=5000, backupCount=0)
errorLogHandler.setLevel(logging.ERROR)
errorLogHandler.setFormatter(formatter)
logger.addHandler(logHandler)
logger.addHandler(errorLogHandler)
def main():
while True:
time.sleep(1)
logger.info("A Sample Log Statement")
logger.error("An error log statement")
main()
您应该注意到,当您运行它时会创建 3 个日志文件。 error.log
将仅包含级别为 ERROR
或更高的日志。 normal.log
将包含从我们的应用程序中注销的所有日志消息的组合。
在实现自己的日志系统时,我认为这些只是一些很重要的事情。
答案 3 :(得分:0)
我建议你看看logging.handlers.TimedRotatingFileHandler
。
我认为这是你正在寻找的东西。
答案 4 :(得分:0)
TimedRotatingFileHandler 可用于此目的。请参考以下代码。
from logging.config import dictConfig
import logging
dictConfig({
'version': 1,
'formatters': {
'standard': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s'
}
},
'handlers': {
'myapp_handler': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': './my_app.log',
'when': 'd',
'interval': 1,
'backupCount': 30,
'level': 'DEBUG',
"encoding": "utf8",
'formatter': 'standard'
},
},
'loggers': {
'simple': {
'level': 'DEBUG',
'handlers': ['myapp_handler']
}
},
})
logger = logging.getLogger("simple")
logger.error("This is a test error")
在上面的例子中,我使用了 dictConfig 来配置记录器。请参考链接:https://docs.python.org/3/library/logging.config.html 了解其他配置方式。
一旦日期发生变化,记录器模块会通过给当前文件添加日期后缀来创建一个新文件。