38

RotatingFileHandlerLinuxシステムで標準のpython(2.5.2)ロギングモジュール、特にを使用しています。私のアプリケーションは、コマンドラインインターフェイスとWebサービスインターフェイスの両方をサポートしています。両方を同じログファイルに書き込んでもらいたいのですが。ただし、ログファイルがローテーションされると、新しいファイルには644アクセス許可があり、Webサーバーユーザーが所有するため、コマンドラインユーザーがログファイルに書き込むことができなくなります。新しいログファイルをログ構成またはログの初期化中にグループ書き込み可能にするように指定できますか?

mode設定(r/ w/ )を調べましたがa、ファイルのアクセス許可がサポートされていないようです。

4

8 に答える 8

31

これが少し良い解決策です。これは、使用される_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
于 2011-07-21T16:16:39.973 に答える
23

私は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

私が便利だと思った参考資料: カスタムハンドラーのバインドとカスタムハンドラー作成

于 2009-09-10T21:29:32.670 に答える
3

これがうまく機能した簡単な解決策です:

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 

于 2019-11-07T03:31:35.770 に答える
2

これは、 robのソリューションに基づくDjangoの完全なソリューションです。でmy_module

import logging
import logging.handlers
import os

ロギング構成中に発生するclass=ことは、ロギングモジュールの名前空間で評価され、デフォルトでは、これにはハンドラーへのバインディングがありません。したがって、拡張する前に明示的に挿入する必要があります。このSOの記事を参照してください

logging.handlers = logging.handlers

私が見つけるのに永遠にかかったのはこの魔法の呪文です-私はそれが何もしなかったとは信じられませんでした!最後に、Jonのクラスはエラーなしでロードされます。

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'
于 2018-08-02T00:03:38.950 に答える
1

James Gardnerは、ファイルをローテーションするだけで、ファイルを作成または削除しないハンドラーを作成しました:http: //packages.python.org/logrotate/index.html

于 2012-08-07T19:01:29.150 に答える
0
$ chgrp loggroup logdir
$ chmod g+w logdir
$ chmod g+s logdir
$ usermod -a -G loggroup myuser
$ umask 0002
于 2016-05-30T07:19:02.443 に答える
0

のすべての権限を取得するために機能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

于 2020-04-01T20:26:35.927 に答える
0

ここで説明しているのはアンチパターンだと思います。異なるプロセスが同じファイルにデータを書き込むべきではありません。

そして、上記の解決策のどれも私にはうまくいきませんでした、異なるシナリオで異なる許可の問題を引き起こしました。

一時的な回避策として、ログファイル名にランダムなサフィックスを追加して、各プロセスが起動時に一意のファイル名を取得するようにしました。

この問題を解決する適切な方法-一元化されたログハンドラー(ログサーバー)、たとえばrsyslogを使用します。

于 2021-04-08T23:05:11.917 に答える