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>
....
ファイルのアクセス許可は、ユーザーのumaskによって決定されます。log4j自体で変更する方法はありません。
おそらく、ユーザーのumaskを0117
に設定する必要があります
$ umask -S 0117
u=rw,g=rw,o=
Log4J-core-2.9はこれを提供します 機能fileOwner、fileGroupおよびfilePermissionsposix OS forFileAppender、RollingFileAppenderおよびRollingRandomAccessFileManager:
<RollingFile name="RollingFile"
fileName="mylogs.log"
filePattern="mylogs-$${date:MM-dd-yyyy}-%i.log.7z"
fileOwner="log4j"
fileGroup="log4grp"
filePermissions="rw-r-----">
これは古い質問だと思いますが、この問題を検索したときの最初のヒットだったので...
次のように、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()
によって脇に移動されます。
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