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

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

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

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

环境是Ubuntu 10.04LTS,使用jsvc/commons-daemon来运行守护进程。 如果重要的是我的log4j配置的基础知识:

                       .... 

文件权限由用户的umask决定 – 没有办法在log4j本身中更改它。

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

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

Log4J-core-2.9将为FileAppenderRollingFileAppenderRollingRandomAccessFileManager中的 posix OS提供此function fileOwnerfileGroupfilePermissions

  

我意识到这是一个古老的问题,但是因为这是我搜索这个问题时的第一次打击……

您可以简单地将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

  

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

在log4j.properties里面包含这个: log4j.appender.file.File=${user.home}/log无论如何,这是我在控制台和文件“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