代码之家  ›  专栏  ›  技术社区  ›  mipadi

如何在Django中配置Python日志模块?

  •  1
  • mipadi  · 技术社区  · 15 年前

    logging 模块。我在Django项目的 settings.py 文件:

    import logging
    import logging.handlers
    import os
    date_fmt = '%m/%d/%Y %H:%M:%S'
    log_formatter = logging.Formatter(u'[%(asctime)s] %(levelname)-7s: %(message)s (%(filename)s:%(lineno)d)', datefmt=date_fmt)
    log_dir = os.path.join(PROJECT_DIR, "var", "log", "my_app")
    log_name = os.path.join(log_dir, "nyrb.log")
    bytes = 1024 * 1024   # 1 MB
    if not os.path.exists(log_dir):
      os.makedirs(log_dir)
    handler = logging.handlers.RotatingFileHandler(log_name, maxBytes=bytes, backupCount=7)
    handler.setFormatter(log_formatter)
    handler.setLevel(logging.DEBUG)
    logging.getLogger().setLevel(logging.DEBUG)
    logging.getLogger().addHandler(handler)
    logging.getLogger(__name__).info("Initialized logging subsystem")
    

    在启动时,我在日志文件中获得了一些与Django相关的消息,以及“初始化的日志子系统”,但是所有日志消息最终都会进入web服务器日志( /var/log/apache2/error.log ,因为我使用的是Apache),并使用标准日志格式(而不是我指定的格式化程序)。我是否配置了错误的日志记录?

    4 回复  |  直到 15 年前
        1
  •  3
  •   mipadi    15 年前

    有点反高潮,但事实证明,项目中安装了一个第三方应用程序,它有自己的日志记录配置,它覆盖了我设置的配置(出于某种原因,它修改了根日志记录程序——对于Django应用程序来说不太合规!)。删除了代码,一切正常。

        2
  •  2
  •   Community CDub    8 年前

    this other answer . 请注意,settings.py通常导入两次,因此应避免创建多个处理程序。Django在1.3中提供了更好的日志支持(希望如此),但是现在您应该确保,如果多次调用安装程序代码,则不会产生不利影响。

    sys.stdout sys.stderr 就像小溪一样。你可能想打印出来 logging.getLogger().handlers 只是想看看你所期待的。

        3
  •  2
  •   miku    13 年前

    我成功地使用了它(尽管它不是 旋转 ):

    # in settings.py
    import logging
    logging.basicConfig(
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)s %(funcName)s %(lineno)d \
                  \033[35m%(message)s\033[0m', 
        datefmt = '[%d/%b/%Y %H:%M:%S]',
        filename = '/tmp/my_django_app.log',
        filemode = 'a'
    )
    

        4
  •  0
  •   nkrkv    15 年前

    我猜当Apache分叉这个过程时,日志记录就会停止。在这之后,因为所有的文件描述符在守护进程中都被关闭了,所以日志系统尝试重新打开日志文件,据我所知,它的用途是什么 相对的

    log_dir = os.path.join(PROJECT_DIR, "var", "log", "my_app")
    log_name = os.path.join(log_dir, "nyrb.log")
    

    但当进程被后台监控时,没有当前目录。尽量使用绝对值 log_dir 路径。希望有帮助。