Ответ 1
Разрешения на файлы определяются пользователем umask - нет способа изменить его в самой log4j.
Вероятно, вы хотите установить для пользователя umask значение 0117
$ umask -S 0117
u=rw,g=rw,o=
Как определяются разрешения для файлов, созданных с помощью RollingFileAppender
?
Недавно я изменил процесс демона, который должен быть запущен как пользователь, не являющийся пользователем root, и теперь файлы создаются с разрешениями 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>
....
Разрешения на файлы определяются пользователем umask - нет способа изменить его в самой log4j.
Вероятно, вы хотите установить для пользователя umask значение 0117
$ umask -S 0117
u=rw,g=rw,o=
Log4J-core-2.9 предоставит эту fileOwner, fileGroup и filePermissions для posix OS в FileAppender, RollingFileAppender и RollingRandomAccessFileManager:
<RollingFile name="RollingFile"
fileName="mylogs.log"
filePattern="mylogs-$${date:MM-dd-yyyy}-%i.log.7z"
fileOwner="log4j"
fileGroup="log4grp"
filePermissions="rw-r-----">
внутри 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
Я понимаю, что это старый вопрос, но поскольку он был первым хитом, когда я искал эту проблему...
Вы можете просто подклассом 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()
, который сохраняет разрешения.