Python:如何使用日志模块每天创建日志文件?

kit*_*kit 13 python logging

我是python日志记录模块的新手.我想在应用程序处于运行状态时每天创建一个新的日志文件.

log file name - my_app_20170622.log
log file entries within time - 00:00:01 to 23:59:59
Run Code Online (Sandbox Code Playgroud)

第二天,我想创建一个新的日志文件,第二天的日期 -

log file name - my_app_20170623.log
log file entries within time - 00:00:01 to 23:59:59
Run Code Online (Sandbox Code Playgroud)

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

他们在python的日志记录模块中的任何配置是否每天都创建一个日志?

Adr*_*nez 21

你必须创建一个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)
Run Code Online (Sandbox Code Playgroud)

这段代码将创建一个my_app.log但是日志将被移动到my_app.log.20170623当天在午夜结束时命名的新日志文件.

我希望这有帮助.

  • 嗨@kit,您为什么发布正确的解决方案作为答案?我的回答符合你的要求,不是吗? (2认同)

Mil*_*vić 14

旋转文件处理器

\n
class RotatingFileHandler(  filename[, mode[, maxBytes[, backupCount]]])\n
Run Code Online (Sandbox Code Playgroud)\n

RotatingFileHandler 返回该类的一个新实例。指定的文件将打开并用作日志记录流。如果未指定模式,a则使用。默认情况下,文件无限增长。

\n

ARotatingFileHandler允许我们在每次当前日志文件达到一定大小时将日志语句轮换到一个新文件中。

\n

在此示例中,我们\xe2\x80\x99ll对其进行设置,以便当它达到500字节时,我们\xe2\x80\x99ll将轮换到新文件中,最多可达2个备份。

\n
import logging\nimport logging.handlers as handlers\nimport time\n\nlogger = logging.getLogger(\'my_app\')\nlogger.setLevel(logging.INFO)\n\nlogHandler = handlers.RotatingFileHandler(\'app.log\', maxBytes=500, backupCount=2)\nlogHandler.setLevel(logging.INFO)\nlogger.addHandler(logHandler)\n\ndef main():\n    while True:\n        time.sleep(1)\n        logger.info("A Sample Log Statement")\n\nmain()\n
Run Code Online (Sandbox Code Playgroud)\n

执行此命令后,您应该注意到,每次app.log超过 500 字节时,它都会被关闭并重命名,app.log.x其中值会x递增,直到达到我们设置的值backupCount

\n

定时旋转文件处理程序

\n
class TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])\n
Run Code Online (Sandbox Code Playgroud)\n

TimedRotatingFileHandler 返回该类的一个新实例。指定的文件将打开并用作日志记录流。旋转时它还会设置文件名后缀。旋转根据时间和间隔的乘积进行。

\n

您可以使用 when 来指定间隔类型。可能值的列表是,请注意它们不区分大小写:

\n
|   Value  |    Type of interval   |\n|:--------:|:---------------------:|\n|     S    |        Seconds        |\n|     M    |        Minutes        |\n|     H    |         Hours         |\n|     D    |          Days         |\n|     W    |  Week day (0=Monday)  |\n| midnight | Roll over at midnight |\n
Run Code Online (Sandbox Code Playgroud)\n

TimedRotatingFileHandler允许我们按时间片捕获日志文件。

\n
import logging\nimport logging.handlers as handlers\nimport time\n\nlogger = logging.getLogger(\'my_app\')\nlogger.setLevel(logging.INFO)\n\nlogHandler = handlers.TimedRotatingFileHandler(\'timed_app.log\', when=\'M\', interval=1)\nlogHandler.setLevel(logging.INFO)\nlogger.addHandler(logHandler)\n\ndef main():\n    while True:\n        time.sleep(1)\n        logger.info("A Sample Log Statement")\n\nmain()\n
Run Code Online (Sandbox Code Playgroud)\n

运行此代码将无限期地每分钟创建新的日志文件。我们可以在实例backupCount上设置参数logHandler,它将限制我们创建的日志文件的数量。

\n

使用适当的日志级别

\n

TimedRotatingFileHandlerRotatingFileHandler可以执行以下操作,例如将所有错误消息记录到旋转文件,但将所有正常日志文件记录到 TimedRotatingFileHandler,因为我们希望我们可以期望它们比错误消息多得多。

\n

两个级别的记录被拆分为两个不同的日志级别:INFOERROR到两个不同的地方。

\n
import logging\nimport logging.handlers as handlers\nimport time\n\nlogger = logging.getLogger(\'my_app\')\nlogger.setLevel(logging.INFO)\n\n## Here we define our formatter\nformatter = logging.Formatter(\'%(asctime)s - %(name)s - %(levelname)s - %(message)s\')\n\nlogHandler = handlers.TimedRotatingFileHandler(\'normal.log\', when=\'M\', interval=1, backupCount=0)\nlogHandler.setLevel(logging.INFO)\nlogHandler.setFormatter(formatter)\n\nerrorLogHandler = handlers.RotatingFileHandler(\'error.log\', maxBytes=5000, backupCount=0)\nerrorLogHandler.setLevel(logging.ERROR)\nerrorLogHandler.setFormatter(formatter)\n\nlogger.addHandler(logHandler)\nlogger.addHandler(errorLogHandler)\n\ndef main():\n    while True:\n        time.sleep(1)\n        logger.info("A Sample Log Statement")\n        logger.error("An error log statement")\n\nmain()\n
Run Code Online (Sandbox Code Playgroud)\n

您应该注意到,运行此命令时会创建 3 个日志文件。将error.log仅包含级别ERROR或更高级别的日志。该文件normal.log将包含从我们的应用程序中注销的所有日志消息的组合。

\n

这些只是我认为在实现您自己的日志系统时很重要的一些事情。

\n


ket*_*tan 5

最后,我得到了正确的答案,我想分享这个答案。

基本上,需要创建一个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)
Run Code Online (Sandbox Code Playgroud)

上面的代码将生成像当天的 my_app.log 和前一天的 my_app.log.20170704 这样的文件。

希望能帮助到你。


小智 1

我建议你看一下logging.handlers.TimedRotatingFileHandler。我想这就是你要找的。