Разрешения на файлы журналов, созданные log4j RollingFileAppender - PullRequest
18 голосов
/ 25 октября 2011

Как определяются разрешения для файлов, созданных 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>
....

Ответы [ 4 ]

16 голосов
/ 25 октября 2011

Права доступа к файлам определяются пользователем umask - изменить его в самом log4j невозможно.

Возможно, вы хотите установить umask пользователя на 0117

$ umask -S 0117
u=rw,g=rw,o=
7 голосов
/ 21 июня 2017

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-----">
3 голосов
/ 11 апреля 2017

Я понимаю, что это старый вопрос, но так как он был первым хитом, когда я искал эту проблему ...

Вы можете просто создать подкласс 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(), который сохраняет права доступа.

2 голосов
/ 08 февраля 2017

внутри 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
...