java log4j file-permissions rollingfileappender

java - Permisos en archivos de registro creados por log4j RollingFileAppender



file-permissions (4)

Log4J-core-2.9 proporcionará esta característica fileOwner , fileGroup y filePermissions para posix OS en FileAppender , RollingFileAppender y RollingRandomAccessFileManager :

<RollingFile name="RollingFile" fileName="mylogs.log" filePattern="mylogs-$${date:MM-dd-yyyy}-%i.log.7z" fileOwner="log4j" fileGroup="log4grp" filePermissions="rw-r-----">

¿Cómo se determinan los permisos para los archivos creados por RollingFileAppender ?

Hace poco cambié un proceso de daemon que debo ejecutar como un usuario no root y los archivos ahora se están creando con permisos de 0600 (solo legibles por el propietario), pero me gustaría que todos los miembros o al menos los puedan leer. de un grupo de administradores ( 0644 o 0644 ). Los archivos creados por las aplicaciones de mi tomcat siempre son 0644 (todos los pueden leer).

No sé si cambié inadvertidamente otra cosa o si es algo que ver con los permisos de ese usuario. Hice el directorio de padres 0777 como una prueba y no pareció ayudar (era 0755 ). Obviamente, no es un gran problema ya que puedo sudo para mirarlos, pero es bastante molesto y será un problema si tengo que tener un cliente que me los copie.

El entorno es Ubuntu 10.04LTS utilizando jsvc/commons-daemon para ejecutar el daemon. En caso de que importe, aquí están los conceptos básicos de mi configuración 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> ....


Los permisos de los archivos están determinados por la umask del usuario, no hay forma de cambiarlo en log4j.

Es probable que desee establecer umask del usuario a 0117

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


Me doy cuenta de que esta es una pregunta antigua, pero como fue el primer golpe aún cuando busqué este problema ...

Puede simplemente subclasificar RollingFileAppender y establecer el permiso en el archivo cuando se abre por primera vez, de esta manera:

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

Luego simplemente WorldWritableFileAppender referencia a WorldWritableFileAppender lugar de RollingFileAppender en su log4j.xml .

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

Esto funciona porque a setFile() se le llama tanto al configurar originalmente el registrador como al crear un nuevo archivo después de la transferencia. El archivo antiguo se mueve a un lado con File.renameTo() , que conserva los permisos.


dentro de log4j.properties incluye esto: log4j.appender.file.File=${user.home}/log todos modos, esta es mi configuración que muestra información en la consola y el archivo "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