欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

异常处理散记(一):log4j\logback在滚动策略中设置日志文件的权限

程序员文章站 2022-05-23 11:07:33
...

起因:

在linux服务器上,发现root用户部署项目程序后,使用低权限的用户登录查看项目日志时,无权查看日志。

具体表现:

手动生成的其他文件属性为644(“rw-r–r--”),其他人有查看权限;
项目程序生成的日志文件属性为640(即"rw-r-----")。

解决方案:

出现日志文件权限问题,主要考虑2个方面:
中间件掩码设置日志组件权限设置

1、日志组件权限修改
一般情况下而言,日志组件属于应用组件,不会对文件的权限造成影响。

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

非要修改的话,logback没有针对文件限的修改方式,所以暂时不支持直接进行修改;log4j有提供在特定的属性filepermissions,可以进行日志文件的属性设置。

ps单个日志文件修改:
log4j 2.9以上版本可以通过其中中的filePermissions配置完成。

<File name="File" fileName="my.log" filePermissions="rw-r--r--">
   <PatternLayout pattern="%m%n" />
</File>

ps:本次主要针对在滚动策略中的文件权限修改,不多作提及。

在滚动策略中修改

 <RollingFile name="InfoLog" 
 fileName="/var/log/myApp/Info.log" 
 filePattern="/var/log/myApp/Info%d\{yyyy-MM-dd}.%i.log" 
 filePermissions="rw-r--r--">
      
    </RollingFile>

2、掩码修改

2.1Tomcat掩码修改
(此方法原作者https://www.cnblogs.com/kevingrace/p/11844116.html
现象描述:
线上机器的程序文件(包括TOMCAT自身)使用APP账号作为属主运行,同时禁止了APP账号的BASH。登录系统使用了统一认证,这样每个人都有自己的账号登录系统。为了方便开发人员登录查看日志,日志文件的文件权限为"rw-r-r",同时也是系统默认的umask。这里简单说下umask权限码。在Linux系统下,新建目录的权限是777减去umask码值,新建文件的权限是666减去umaks码值,由于linux默认的umask是0022,所以一般新建目录和文件的默认权限分别是755和644。

[root@localhost ~]# umask
0022

但是,在部署tomcat后,发现tomcat的日志文件catalina.out的权限是640(即"rw-r-----"),新生成的日志文件权限全都是640,开发者使用其他用户登录后对这些日志文件均不可读!

-rw-r-----  1  app app 356K 1208  19:09  catalina.out
-rw-r-----  1  app app 27M  1202  10:17  catalina.out.7.gz
-rw-r-----  1  app app 29M  1203  13:08  catalina.out.6.gz
-rw-r-----  1  app app 23M  1204  15:25  catalina.out.5.gz
-rw-r-----  1  app app 33M  1205  11:30  catalina.out.4.gz
-rw-r-----  1  app app 31M  1206  08:44  catalina.out.3.gz
-rw-r-----  1  app app 31M  1207  10:02  catalina.out.2.gz
-rw-r-----  1  app app 45M  1208  19:09  catalina.out.1.gz

原因:Tomcat在启动(catalina.sh)时会重新设置UMASK
Tomcat在启动服务时可能会重新设置UMASK值,其默认值为0027,而操作系统的默认值0022,两者不一样。解决办法:需要到catalina.sh脚本里修改UMASK值:
异常处理散记(一):log4j\logback在滚动策略中设置日志文件的权限
如上,将catalina.sh脚本中的"UMASK"的值由"0027"改为"0022",即改成系统当前用户的umask即可

2.2webLogic掩码修改
(此方法原作者https://blog.51cto.com/comer/2154037
如何设置WebLogic生成的日志文件的权限?
在运维的过程中,有时我们需要以有别于启动WebLogic的用户去访问或收集日志等信息,以及时了解系统运行情况,这就要求日志文件的访问权限是允许其他用户访问的。一般情况下,新生成的文件默认权限是根据操作系统的umask的设置决定的。那如何改变WebLogic运行时产生的日志文件的访问权限呢?
如果通过操作系统的umask命令修改是不会生效的,因为在WebLgoic的启动脚本startWebLogic.sh中有类似这么一条命令“umask 022”,其覆盖了操作系统的设置。
比如startWebLogic.sh中设置了“umask 037”,那么生成的日志文件访问权限如下:

-bash-4.2$ ls -l
total 13164
-rw-r----- 1 oracle oracle     842 Jul 25 04:30 access.log
-rw-r----- 1 oracle oracle 2150626 Jul 27 10:35 AdminServer.log
-rw-r----- 1 oracle oracle  576289 Jul 27 10:35 base_domain.log

我们可以通过修改脚本中umask的值来控制日志等新生成文件的访问权限。
这个在WebLogic 11g上可以正常工作。但是在WebLogic 12.2.1.1.0 和12.2.1.2.0上即使设置了umask也不会生效,这是WebLogic的bug(Bug 24794915),此缺陷在12.2.1.3.0上已经修复。
在这两个版本(12.2.1.1.0 和12.2.1.2.0)上需要安装这个补丁。12.2.1.3.0上已经支持了下面的参数,不需要再安装补丁。

安装补丁后支持了一个参数-Dweblogic.DefaultLogFilePermissionsEnabled,其默认是true。
此参数的含义是当-Dweblogic.DefaultLogFilePermissionsEnabled=true,新生成的文件使用默认的文件访问权限640。如果设置-Dweblogic.DefaultLogFilePermissionsEnabled=false,那么新生成的文件的访问权限受startWebLogic.sh脚本中的umask设置的值控制,采用自定义的设置。
所有在WebLogic12.2.*版本上,需要在启动该参数中加上-Dweblogic.DefaultLogFilePermissionsEnabled=false,然后再修改startWebLogic.sh中的umask值。Java options一般在setDomainEnv.sh中设置。

这个参数控制的是WebLogic新生成的所有的文件,不仅仅是日志文件。
另外如果WebLogic Server是通过NodeManager启动的,需要在startNodeManager.sh脚本中设置。


本文主要参考网址

loggin.apache.org https://logging.apache.org/log4j/2.x/manual/appenders.html

apache滚动策略日志文件jira信息单
https://issues.apache.org/jira/browse/LOG4J2-2238

csdn单个日志文件编写的博客
https://blog.csdn.net/wo2huoa/article/details/79205575
单个日志文件权限编写的博客
https://www.cnblogs.com/tootwo2/p/7679443.html

tomcat程序生成的日志文件不可读问题 - 运维总结
https://www.cnblogs.com/kevingrace/p/11844116.html

如何设置WebLogic生成的日志文件的权限?
https://blog.51cto.com/comer/2154037

csdn启发“权限问题查看掩码”的博客
https://blog.csdn.net/weixin_34051201/article/details/85097344

log4j RollingFileAppender创建的日志文件的权限
https://www.thinbug.com/q/7893511

日志logback\log4j学习地址

掘金的很详细
Springboot 集成logback 日志框架简介
https://juejin.im/post/5b128f326fb9a01e8b7814c4#heading-22

博客园的介绍日志slf4j门面接口介绍
Java日志框架:slf4j作用及其实现原理
https://www.cnblogs.com/xrq730/p/8619156.html

博客园的slf4j\logback\log4j三者关系介绍
slf4j log4j logback关系详解和相关用法
https://www.cnblogs.com/sinte-beuve/p/5758971.html

博客园的log4j和logback对比
logback的使用和logback.xml详解
https://www.cnblogs.com/warking/p/5710303.html


这个问题主要是耽误了挺长时间(好几天),又想起好久没写博客了。遂将这个问题记录下来。

希望能帮助有遇到类似问题的人!