23

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

我最近更改了一个守护进程,我必须以非 root 用户身份运行,并且现在正在使用权限0600(仅所有者可读)创建文件,但我希望它们可以被所有或至少成员读取管理员组(06440640)。我的 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>
....
4

4 回答 4

21

文件权限由用户的 umask 决定 - log4j 本身无法更改它。

您可能希望将用户的 umask 设置为0117

$ umask -S 0117
u=rw,g=rw,o=
于 2011-10-25T17:53:40.773 回答
12

Log4J-core-2.9 将在FileAppenderRollingFileAppenderRollingRandomAccessFileManager中为 posix OS提供此功能 fileOwnerfileGroupfilePermissions

<RollingFile name="RollingFile"
             fileName="mylogs.log"
             filePattern="mylogs-$${date:MM-dd-yyyy}-%i.log.7z"
             fileOwner="log4j"
             fileGroup="log4grp"
             filePermissions="rw-r-----">
于 2017-06-21T06:44:19.467 回答
6

我意识到这是一个老问题,但由于它仍然是我搜索这个问题时的第一个命中......

您可以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));
        }
    }
}

然后只需引用WorldWritableFileAppender而不是RollingFileAppender在您的log4j.xml.

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

这是有效的,因为setFile()在最初设置记录器时以及在翻转后创建新文件时都会调用。旧文件被移到一边File.renameTo(),保留了权限。

于 2017-04-11T18:21:22.820 回答
1

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
于 2017-02-08T13:07:12.863 回答