现象描述:
线上机器的程序文件(包括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 12月 08  19:09  catalina.out
-rw-r----- 1 app app 27M 12月 02 10:17 catalina.out.7.gz
-rw-r----- 1 app app 29M 12月 03 13:08 catalina.out.6.gz
-rw-r----- 1 app app 23M 12月 04 15:25 catalina.out.5.gz
-rw-r----- 1 app app 33M 12月 05 11:30 catalina.out.4.gz
-rw-r----- 1 app app 31M 12月 06 08:44 catalina.out.3.gz
-rw-r----- 1 app app 31M 12月 07 10:02 catalina.out.2.gz
-rw-r----- 1 app app 45M 12月 08 19:09 catalina.out.1.gz

原因分析一:Tomcat在启动(catalina.sh)时会重新设置UMASK
Tomcat在启动服务时可能会重新设置UMASK值,其默认值为0027,而操作系统的默认值0022,两者不一样。解决办法:需要到catalina.sh脚本里修改UMASK值:

如上,将catalina.sh脚本中的"UMASK"的值由"0027"改为"0022",即改成系统当前用户的umask即可!

原因分析二:log4j2设置日志文件读写权限(filePermissions)
由于日志比较大,并且实时输出,需要每天做日志轮询,如果日志轮询的过程是通过log4j插件自动切割完成的,则可能会由lig4j2的filePermissions设置引起日志文件不可读现象。log4j2在2.9版本以上有一个filePermissions,可以指定文件权限。

spring-boot使用log4j2作为日志插件的时候需要设置日志文件的读写权限,可以File 上增加filePermissions,如:

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

需要注意的是,spring-boot version1.5.7.release的spring-boot-starter-log4j2中引用的log4j2的版本是2.7,而filePermissions只有在2.9以上的版本才有,所以需要在pom.xml中添加2.9的依赖

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>

tomcat程序生成的日志文件不可读问题 - 运维总结的更多相关文章

  1. tomcat的localhost_access_log日志文件

    一.服务器打印日志要关闭hibernate的日志,首先要把hibernate.show_sql设置为false;然后设置log4j.properties. # Control logging for ...

  2. shell脚本切割tomcat的日志文件

    鉴于在调试logback和log4j的文件切割一直无法成功,随性用shell写个脚本用来切割tomcat下的日志文件(大家如果有在logback或log4j使用文件切割成功的话,可以留下使用方式,先谢 ...

  3. Tomcat输出保存JVM GC日志文件

    当系统出现问题时,分析java虚拟机GC日志可以帮助我们定位问题,一般来说, 我们可以通过制定JVM参数使tomcat保存GC日志文件,具体实现如下: Windows下: 找到tomcat的解压目录, ...

  4. Tomcat 日志文件分割

    新到公司, 拿到了前辈们留下的 程序 “病历书” , 上面记载了项目上的一些 经常会犯的毛病,  还有相应的解决方法. 其中有的是因为后台 代码逻辑上的一些原因 , N手代码通病了吧 (这个还是以后再 ...

  5. shell脚本切割tomcat日志文件

    转自:http://www.cnblogs.com/lishun1005/p/6054816.html 鉴于在调试logback和log4j的文件切割一直无法成功,随性用shell写个脚本用来切割to ...

  6. Tomcat nginx log日志按天分割切割

    利用 Linux 自带的 logrotate 工具来实现按天切割日志.下方已 centos 7 系统为例来实践讲解. 原理 Logrotate是基于CRON来运行的,其脚本是/etc/cron.dai ...

  7. 【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?

    问题描述 在使用Azure Spring Cloud服务时,如果要收集应用程序的日志.有控制台输出(实时流日志),也可以配置Log Analytics服务. 日志流式处理 可以通过以下命令在 Azur ...

  8. 运维开发:python websocket网页实时显示远程服务器日志信息

    功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息 一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看.你还在用 ...

  9. ECS运维:操作系统有异常?诊断日志来帮忙!

    ​云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新.阿里云使用严格的IDC标准.服务器准入标准 ...

随机推荐

  1. 23.login1(SKCTF)

    没有账号?注册一个试一试~ 题目提示用SQL约束攻击,那么什么是SQL约束攻击呢? 约束攻击的原理就是注册用户名为'admin    '(有多个空格)的账号,密码'*******'(密码可以自定义,符 ...

  2. 2019-2020-1 20199305《Linux内核原理与分析》第七周作业

    进程的描述与创建 (一)进程的描述 (1)操作系统内核实现操作系统的三大管理功能(进程管理最为核心) 进程管理 内存管理 文件系统 (2)在Linux内中用一个数据结构struct task_stru ...

  3. 权限控制终于来了!Redis 6.0新特性——ACLs

    在2019年纽约的Redis Day上,Salvatore Sanfilippo(AKA Antirez)介绍了即将发布的Redis 6.0的新特性.以下是关于ACLs的内容. ACLs简介 在过去的 ...

  4. OverLoad怎么用

    首先给出一个实例 package practice3; public class TryOverLoad { public static void main(String[] args) { Syst ...

  5. 安装PS

    1:下载溜云库 2:查找PS软件,下载 3:按照教程安装

  6. MongoDB数据库常用SQL命令 — MongoDB可视化工具Robo 3T

    1.db.collection.updateMany() 修改集合中的多个文档. db.getCollection('user').find({"pId":"3332a5 ...

  7. ETC到底要不要办?有什么好处?

    一说到ETC,开车的朋友想必不会陌生.但很多车友却不太愿意办理ETC, 究其原因,主要是一些谣言所致,一传一十传百最后变成了真实的谎言,并且对此深信不疑, 比如下面5个广泛流传的谣言     在来看看 ...

  8. C#属性方法 构造函数(不知道自己理解的对不对)

    using System; namespace test { class Program { static void Main(string[] args) { Cat kitty = new Cat ...

  9. linux创建用户并锁定用户目录和首次登陆强制修改密码

    1.     创建用户及访问目录 mkdir -p /home/user/testuser   创建用户目录 useradd testuser -d /home/user/testuser  -M   ...

  10. GO-切片拷贝以及赋值

    一.拷贝 package main import "fmt" func main(){ //copy函数,把一个切片copy到另一个切片之上 var a [1000]int=[10 ...