web-dev-qa-db-ja.com

log4j RollingFileAppenderによって作成されたログファイルの権限

RollingFileAppenderによって作成されたファイルの権限はどのように決定されますか?

最近、root以外のユーザーとして実行する必要があるデーモンプロセスを変更しました。ファイルは0600(所有者のみが読み取り可能)の権限で作成されていますが、すべてのユーザーに読み取り可能にしたいまたは、少なくとも管理グループのメンバー(0644または0640)。私のTomcatアプリによって作成されたファイルは常に0644です(全員が読み取り可能)。

誤って何かを変更したのか、それともそのユーザーのアクセス許可に関係があるのか​​はわかりません。テストとして親ディレクトリ0777を作成しましたが、役に立たなかったようです(0755でした)。 Sudoでそれらを見ることができるので、明らかに大したことではありませんが、むしろ煩わしく、顧客にコピーしてもらう必要があると問題になります。

環境は、jsvc/commons-daemonを使用してデーモンを実行するUbuntu 10.04LTSです。重要な場合は、ここに私のlog4j設定の基本を示します。

<!DOCTYPE log4j:configuration SYSTEM 'log4j.dtd'>
<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/" debug="true">

<appender name="StdOutAppender" class="org.Apache.log4j.ConsoleAppender">
    <!-- only send error / fatal messages to console (catalina.out) -->
    <param name="threshold" value="${log4j.StdOutAppender.threshold}" />
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %m%n" />
        <!--%d{dd-MMM-yyyy HH:mm:ss.SSS} [%5p] %c{2}.%M [line:%L]: %m%n-->
    </layout>
</appender>

<appender name="TimeBasedRollingFileAppender" class="org.Apache.log4j.rolling.RollingFileAppender">
    <param name="append" value="true" />
    <param name="encoding" value="UTF-8" />
    <param name="threshold" value="${log4j.TimeBasedRollingFileAppender.threshold}" />
    <rollingPolicy class="org.Apache.log4j.rolling.TimeBasedRollingPolicy">
        <param name="FileNamePattern" value="${cloud.daemon.log4j.file.config.path}.%d.gz" />
    </rollingPolicy>
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %m%n" />
        <!--%d{dd-MMM-yyyy HH:mm:ss.SSS} [%5p] %c{2}.%M [line:%L]: %m%n-->
    </layout>
</appender>
....
21
Ken Waln

ファイルのアクセス許可は、ユーザーのumaskによって決定されます。log4j自体で変更する方法はありません。

おそらく、ユーザーのumaskを0117に設定する必要があります

$ umask -S 0117
u=rw,g=rw,o=
19
Brian Roach

Log4J-core-2.9はこれを提供します 機能fileOwnerfileGroupおよびfilePermissionsposix OS forFileAppenderRollingFileAppenderおよびRollingRandomAccessFileManager

<RollingFile name="RollingFile"
             fileName="mylogs.log"
             filePattern="mylogs-$${date:MM-dd-yyyy}-%i.log.7z"
             fileOwner="log4j"
             fileGroup="log4grp"
             filePermissions="rw-r-----">
10

これは古い質問だと思いますが、この問題を検索したときの最初のヒットだったので...

次のように、RollingFileAppenderをサブクラス化して、ファイルが最初に開かれたときにファイルに権限を設定できます。

_public class WorldWritableFileAppender extends RollingFileAppender {
    @Override
    public synchronized void setFile(String fileName, boolean append,
            boolean bufferedIO, int bufferSize) throws IOException {
        super.setFile(fileName, append, bufferedIO, bufferSize);
        File f = new File(fileName);
        if(f.exists()) {
            Java.nio.file.Files.setPosixFilePermissions(f.toPath(), 
                    EnumSet.allOf(PosixFilePermission.class));
        }
    }
}
_

次に、_log4j.xml_でWorldWritableFileAppenderではなくRollingFileAppenderを参照します。

_<appender name="name" class="path.to.WorldWritableFileAppender">
_

これは、最初にロガーをセットアップするときと、ロールオーバー後に新しいファイルを作成するときの両方でsetFile()が呼び出されるため機能します。古いファイルは、権限を保持するFile.renameTo()によって脇に移動されます。

4

log4j.properties内には次のものが含まれます:log4j.appender.file.File=${user.home}/logとにかく、これはコンソールとファイル「ログ」に情報を表示する私の設定です。

# Root logger option
log4j.rootLogger=DEBUG, stdout, file

# Redirect log messages to console
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.Apache.log4j.RollingFileAppender
log4j.appender.file.File=${user.home}/test
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
2
Pichitron