Java 对log4j RollingFileAppender创建的日志文件的权限

Java 对log4j RollingFileAppender创建的日志文件的权限,java,log4j,file-permissions,rollingfileappender,Java,Log4j,File Permissions,Rollingfileappender,如何确定由RollingFileAppender创建的文件的权限 我最近更改了一个守护进程,我必须以非root用户的身份运行,现在正在使用0600权限创建文件(只能由所有者读取),但我希望管理员组的所有或至少成员都能读到这些文件(0644或0640)。我的tomcat应用程序创建的文件总是0644(所有人都可读) 我不知道我是否无意中更改了其他内容,或者是否与该用户的权限有关。我将父目录0777作为一个测试,它似乎没有帮助(它是0755)。显然没什么大不了的,因为我可以sudo查看它们,但这很烦

如何确定由
RollingFileAppender
创建的文件的权限

我最近更改了一个守护进程,我必须以非root用户的身份运行,现在正在使用
0600
权限创建文件(只能由所有者读取),但我希望管理员组的所有或至少成员都能读到这些文件(
0644
0640
)。我的tomcat应用程序创建的文件总是
0644
(所有人都可读)

我不知道我是否无意中更改了其他内容,或者是否与该用户的权限有关。我将父目录
0777
作为一个测试,它似乎没有帮助(它是
0755
)。显然没什么大不了的,因为我可以
sudo
查看它们,但这很烦人,如果我必须让客户为我复制它们,这将是一个问题

环境是Ubuntu10.04LTS,使用
jsvc/commons守护程序运行守护程序。如果重要的话,这里是我的
log4j
config的基础:

<!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.properties内部包括:
log4j.appender.file.file=${user.home}/log
无论如何,这是我的配置,在控制台和文件“log”中显示信息


我意识到这是一个老问题,但因为它是我搜索这个问题时的第一个命中率

您只需在文件首次打开时对其设置子类
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-core-2.9将为FileAppender、RollingFileAppender和RollingAndomaccessFileManager中的posix操作系统提供此文件所有者、文件组和文件权限:



谢谢——我完全忘记了umask。事实证明,现在我知道谷歌的目的了,jsvc硬编码umask,所以我可能不得不接受它(或者重新编译jsvc)——这个答案不再准确。Log4j 2.9.0添加了一种在不更改umask设置的情况下配置此权限的方法。我意识到这是一个非常老的问题,但在2.8.1中有一个计划要修复的问题,该问题将允许显式设置这些权限。这在锁定到Log4j v1时非常有用。
<appender name="name" class="path.to.WorldWritableFileAppender">
<RollingFile name="RollingFile"
             fileName="mylogs.log"
             filePattern="mylogs-$${date:MM-dd-yyyy}-%i.log.7z"
             fileOwner="log4j"
             fileGroup="log4grp"
             filePermissions="rw-r-----">