代码之家  ›  专栏  ›  技术社区  ›  Cory Engebretson

python日志处理程序。RotatingFileHandler允许创建组可写日志文件吗?

  •  38
  • Cory Engebretson  · 技术社区  · 17 年前

    我使用的是标准的python(2.5.2)日志模块,特别是 RotatingFileHandler ,在linux系统上。我的应用程序支持命令行界面和web服务界面。我希望两者都写入同一个日志文件。但是,当日志文件旋转时,新文件具有 644

    mode 设置( r / w / a

    8 回复  |  直到 5 年前
        1
  •  30
  •   rob    15 年前

    这里有一个稍微好一点的解决方案。这会覆盖所使用的open方法。在创建之前设置umask,然后将其恢复到原来的状态。

    class GroupWriteRotatingFileHandler(logging.handlers.RotatingFileHandler):    
        def _open(self):
            prevumask=os.umask(0o002)
            #os.fdopen(os.open('/path/to/file', os.O_WRONLY, 0600))
            rtv=logging.handlers.RotatingFileHandler._open(self)
            os.umask(prevumask)
            return rtv
    
        2
  •  22
  •   Community Mohan Dere    9 年前

    我尝试扫描logging.handlers模块,但无法找到指定其他文件权限模式的方法。因此,我现在有了一个基于将RotatingFileHandler扩展为自定义处理程序的解决方案。这是相当无痛的,一旦我找到了一些很好的参考来创建一个。自定义处理程序的代码如下。

    class GroupWriteRotatingFileHandler(handlers.RotatingFileHandler):
    
        def doRollover(self):
            """
            Override base class method to make the new log file group writable.
            """
            # Rotate the file first.
            handlers.RotatingFileHandler.doRollover(self)
    
            # Add group write to the current permissions.
            currMode = os.stat(self.baseFilename).st_mode
            os.chmod(self.baseFilename, currMode | stat.S_IWGRP)
    

    我还发现,要从日志配置文件中引用自定义处理程序,我必须将我的模块绑定到日志名称空间。很简单,但很烦人。

    from mynamespace.logging import custom_handlers
    logging.custom_handlers = custom_handlers
    

    我发现有用的参考文献: binding custom handlers 和 creating custom handlers

        3
  •  3
  •   DennisLi HARI BABU JANGAM    6 年前

    import os
    
    class GroupWriteRotatingFileHandler(handlers.RotatingFileHandler):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            os.chmod(self.baseFilename, 0o0777)  # You can change whatever permission you want here.
    
            # you can also change the group of the file:
            os.chown(self.baseFilename, uid, gid)   # pass the user_id and group_id you want to set 
    
    
        4
  •  2
  •   gluejar    8 年前

    rob my_module :

    import logging
    import logging.handlers
    import os
    

    这 class= 在日志配置过程中发生的情况在日志模块的命名空间中进行评估,默认情况下,这没有与处理程序的绑定。所以我们必须明确地把它放进去,然后才能扩展它 this SO article

    logging.handlers = logging.handlers
    

    class GroupWriteRotatingFileHandler(logging.handlers.RotatingFileHandler):    
        def _open(self):
            prevumask = os.umask(0o002)
            rtv = logging.handlers.RotatingFileHandler._open(self)
            os.umask(prevumask)
            return rtv
    

    要将此用于Django,请在设置文件中添加以下内容

    from my_module import GroupWriteRotatingFileHandler
    logging.handlers.GroupWriteRotatingFileHandler = GroupWriteRotatingFileHandler
    

    LOGGING['handlers']['file'] 你有

    'class': 'logging.handlers.GroupWriteRotatingFileHandler'
    
        6
  •  0
  •   wcc526    10 年前
    $ chgrp loggroup logdir
    $ chmod g+w logdir
    $ chmod g+s logdir
    $ usermod -a -G loggroup myuser
    $ umask 0002
    
        7
  •  0
  •   caot    6 年前

    def _open(self): 曾与 umask(0o000) 获取的所有权限 -rw-rw-rw- .

    os.chmod(self.baseFilename, 0o0777) ValueError: Unable to configure handler 'some_handler': [Errno 1] Operation not permitted: root:root testuser .

    from logging import handlers
    
    import logging
    import os
    
    class GroupWriteRotatingFileHandler(handlers.RotatingFileHandler):
        def _open(self):
            prevumask = os.umask(0o000)  # -rw-rw-rw-
            rtv = logging.handlers.RotatingFileHandler._open(self)
            os.umask(prevumask)
            return rtv
    
    LOGGING = {
        'handlers': {
            'db_handler': {
                    'level': 'DEBUG',
                    'class': 'log.GroupWriteRotatingFileHandler',
                    'filename': PATH_TO_LOGS + '/db.log',
                    'maxBytes': maxBytes,
                    'backupCount': backupCount,
                    'formatter': 'standard',
            },
    

    日志文件:

    logs]# ls -lrt
    -rw-rw-rw- 1 root root 71 Apr  1 16:02 db.log
    
    logs]# ls -lrt
    total 0
    -rw-rw-rw- 1 testuser testuser 0 Apr  1 16:20 db.log
    
    
        8
  •  0
  •   ARA1307    5 年前

    作为临时解决方法,我在日志文件名中添加了一个随机后缀,这样每个进程在启动时都会得到一个唯一的文件名。