当前位置: 首页 > 工具软件 > log4sh > 使用案例 >

解决log4j生成的log日志文件读写权限问题

贺山
2023-12-01

java web项目使用非管理员用户部署到Unix/Linux Weblogic服务器上时,由于weblogic 的$DOMAINS_HOME/bin/startWeblogic.sh文件中配置的umask值为022,所以生成的log日志文件的读写默认权限为rw-r–r-- ,导致其他用户无法操作日志文件,比如说运维用户会定期清理历史日志文件。


解决方案 :

(参考自点击打开链接
1.Log4j 2.9以上版本可以File上增加filePermissions配置

<file name=“File” fileName=“my.log” filePermissions=“rwxr-xr-x” >
    <PatternLayout pattern=“%m%n” />
</file>

2.Log4j 2.9以下版本可以通过继承RollingFileAddpender或者DailyRollingFileAppender来实现
log4j.properties配置文件:

log4j.appender.file=com.myproj.common.myLog4jWriter
log4j.appender.file.Threhold=INFO
log4j.appender.file.Encoding=UTF-8
log4j.appender.file.File=/home/ap/projweb/log/my.log
log4j.appender.file.DatePattern=.yyyyMMdd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.ConversinPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c:%L]-[%p] %m%n

JDK7.0以上的版本:
com.myproj.common.myLog4jWriter.java 代码

import java.io.File;
import java.io.IOException;
import org.apache.log4j.DailyRollingFileAppender;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.util.HashSet;
import java.util.Set;

public class myLog4jWriter extends DailyRollingFileAppender{
    @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);
        Set<PosixFilePermission> set = new HashSet<PosixFilePermission>();
        //设置所有者权限
        set.add(PosixFilePermission.OWNER_READ);
        set.add(PosixFilePermission.OWNER_WRITE);
        set.add(PosixFilePermission.OWNER_EXECUTE);
        //设置同组用户权限
        set.add(PosixFilePermission.GROUP_READ);
        set.add(PosixFilePermission.GROUP_EXECUTE);
        //设置其他用户权限
        set.add(PosixFilePermission.OTHERS_READ);
        set.add(PosixFilePermission.OTHERS_EXECUTE);
        
        if(f.exists()){
            Files.setPosixFilePermissions(f.toPath(),set);
        }
    }
}

JDK7.0以下版本:
com.myproj.common.myLog4jWriter.java 代码

import java.io.File;
import java.io.IOException;
import org.apache.log4j.DailyRollingFileAppender;

public class myLog4jWriter extends DailyRollingFileAppender{
    @Override
    Public synchronized void setFile(String fileName,boolean append,boolean bufferedIO,int bufferSize) throws IOException {
        super.setFile(fileName,append,bufferedIO,bufferSize);
        File file = new File(fileName);
        //为所有用户增加可读权限
        file.setReadable(true,false);
        //为所有用户增加可执行权限
        file.setExecutable(true,false);
    }
}

启动项目即可
生成的日志文件读写权限为rwxr-xr-x(755)


附录:

File类中的设置权限的方法:
Public boolean setReadable(boolean readable):设置文件的所有者的可读权限。参数readable 为true时表示设置文件所有者有文件的可读权限,为false则无可读权限
Public boolean setReadable(boolean readable,boolean ownerOnly): 设置文件所有者或每个人的执行权限。参数readable 为true时表示允许文件的可读权限,为false则无可读权限;参数ownerOnly为true时表示设置可读权限只对文件所有者生效,为false时表示可读权限适用于每个用户。返回值返回true表示方法执行成功,false表示方法执行失败。
setWriteable(boolean writeable)、setWriteable(boolean writeable,boolean ownerOnly) 用法同上
setExecutalbe(boolean executalbe)、setExecutalbe(boolean executalbe,boolean ownerOnly) 用法同上


 类似资料: