【问题标题】:How do I prefix my log messages with the current date and time?如何在我的日志消息前加上当前日期和时间?
【发布时间】:2021-12-31 15:41:53
【问题描述】:

我正在使用 Python 3.9 和 Django 3.2。我在我的 settings.py 文件中配置了日志记录

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO',
    },
}

当我登录我的一门课程时,我会这样做

import logging
...
class TransactionService:
    def __init__(self):
        self._logger = logging.getLogger(__name__)


    def my_method(self, arg1, arg2):
            ...
        self._logger.info("Doing some logging here.")
      

  

如何配置我的记录器,以便在打印出消息时,以当前日期和时间为前缀?

【问题讨论】:

    标签: python django logging python-3.9 django-3.0


    【解决方案1】:

    这对我有用(改编自 thorndeux 的回答):

    import logging.config
    
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'prepend_date': {
                'format': '{asctime} {levelname}: {message}',
                'style': '{',
            },
        },
        'handlers': {
            'console': {
                'class': 'logging.StreamHandler',
                'formatter': 'prepend_date',
            },
        },
        'root': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    }
    
    logging.config.dictConfig(LOGGING)
    logging.info('foo')
    logging.warning('bar')
    

    打印

    2021-11-28 16:05:13,469 INFO: foo
    2021-11-28 16:05:13,469 WARNING: bar
    

    【讨论】:

      【解决方案2】:

      将格式化程序添加到您的记录器。例如:

      LOGGING = {
          'version': 1,
          'disable_existing_loggers': False,
          'formatters': {
              'prepend_date': {
                  'format': '{asctime} {message}',
                  'style': '{',
              },
          },
          'handlers': {
              'console': {
                  'class': 'logging.StreamHandler',
                  'formatter': 'prepend_date',
              },
          },
          'root': {
              'handlers': ['console'],
              'level': 'INFO',
          },
      }
      

      【讨论】:

      • 试一试,但日期仍然没有出现。
      • prepend_datA 中有错字。你有没有抄过它?
      • 我刚刚剪切并粘贴了您在答案中的内容,但我没有看到任何日期被添加到我的日志文件行中。
      • 是的,但我的回答中有一个错字:我将格式化程序称为“prepend_date”,但是当我将它分配给处理程序时,我输入了错误的“prepend_data”,最后带有一个“A”。所以,如果你改变它应该工作。编辑:我会更改错字,一旦你看到它在哪里......
      • 请立即编辑您的答案,而不是试图描述错字; OP 可以随时检查编辑历史以查看已更改的内容。
      【解决方案3】:

      您的问题的答案可以在official documentation找到,请阅读全文。

      import logging
      
      FORMAT = '%(asctime)s  %(message)s'
      logging.basicConfig(format=FORMAT)
      
      logger = logging.getLogger()
      logger.setLevel(logging.INFO)
      logger.info("Doing some logging here.")
      

      这将打印:

      2021-11-29 14:06:59,825  Doing some logging here.
      

      【讨论】:

        【解决方案4】:

        您的示例中缺少的是 formatters(添加到 LOGGING dict 以下):

        LOGGING = {
            ...
            "formatters": {"console": {"format": "%(asctime)s %(message)s"}},
            # and add it to handlers
            "handlers": {"console": {"class": "logging.StreamHandler", "formatter": "console"}},
            ...
        }
        

        您可能希望将类中的日志记录设置更改为类似

        import logging
        logger = logging.getLogger(__name__)
        ...
        class TransactionService:
        
            def my_method(self, arg1, arg2):
                ...
                logger.info("Doing some logging here.")
        

        您还可以在official Django documentation 中找到完整示例(该小节中的最后一个示例):

        LOGGING = {
            'version': 1,
            'disable_existing_loggers': False,
            'formatters': {
                'verbose': {
                    'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
                    'style': '{',
                },
                'simple': {
                    'format': '{levelname} {message}',
                    'style': '{',
                },
            },
            'filters': {
                'special': {
                    '()': 'project.logging.SpecialFilter',
                    'foo': 'bar',
                },
                'require_debug_true': {
                    '()': 'django.utils.log.RequireDebugTrue',
                },
            },
            'handlers': {
                'console': {
                    'level': 'INFO',
                    'filters': ['require_debug_true'],
                    'class': 'logging.StreamHandler',
                    'formatter': 'simple'
                },
                'mail_admins': {
                    'level': 'ERROR',
                    'class': 'django.utils.log.AdminEmailHandler',
                    'filters': ['special']
                }
            },
            'loggers': {
                'django': {
                    'handlers': ['console'],
                    'propagate': True,
                },
                'django.request': {
                    'handlers': ['mail_admins'],
                    'level': 'ERROR',
                    'propagate': False,
                },
                'myproject.custom': {
                    'handlers': ['console', 'mail_admins'],
                    'level': 'INFO',
                    'filters': ['special']
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多