log4j RollingFileAppender创建的日志文件权限

24
< p > RollingFileAppender 创建的文件权限是如何确定的?

最近,我将一个守护进程更改为以非根用户运行,并且文件现在被创建为 0600 的权限(仅由所有者可读),但是我希望它们可以被所有人或至少管理员组的成员读取( 0644 0640 )。我的Tomcat应用程序创建的文件始终是 0644 (所有人都可以读取)。

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

环境是Ubuntu 10.04LTS,使用 jsvc / commons-daemon 来运行守护程序。如果有影响的话,这是我的 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>
....

1
我意识到这是一个非常古老的问题,但有一个Jira问题计划在2.8.1中修复,可以明确设置这些权限。 - Jeff G
数字权限更清晰地表示为位置 r w x 字符,正如您的括号注释所建议的那样。chmod 的“符号模式”也支持这些字符。 - Arthur
5个回答

22

文件权限由用户的umask确定 - log4j本身没有更改它的方法。

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

$ umask -S 0117
u=rw,g=rw,o=

1
谢谢 - 我完全忘记了umask。事实证明,现在我知道该搜索什么,jsvc硬编码了umask,所以我可能不得不接受它(或重新编译jsvc) - https://issues.apache.org/jira/browse/DAEMON-178。 - Ken Waln
2
这个答案已经不准确了。Log4j 2.9.0添加了一种配置方式,可以在不更改umask设置的情况下进行配置。 - Jeff G

14

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-----">

如何在logback中实现这个功能? - PSS

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));
        }
    }
}

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

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

这个工作是因为在设置日志记录器和滚动后创建新文件时,setFile() 被调用。旧文件通过 File.renameTo() 移开,这会保留权限。

1
当锁定于LOG4j v1时,这真的很有帮助。 - NaanProphet

2
在log4j.properties文件中添加以下内容:log4j.appender.file.File=${user.home}/log,这样就可以将信息同时显示在控制台和“log”文件中。请注意,不要删除任何HTML标签。
# 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

0
将以下内容添加到您的pom文件中:
<plugin>                
  <groupId>
     org.springframework.boot</groupId>
  <artifactId>spring-boot-maven- plugin</artifactId>
 <configuration>
   <jvmArguments>
     -DUMASK="0022"
     -Dorg.apache.catalina.security.SecurityListener.UMASK="0022"
   </jvmArguments>
 </configuration>
</plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接