log4j 产生的日志位置设置 和 catalina.home、catalina.base

本文介绍了一种方法,通过设置系统属性、使用服务器环境变量或在servlet初始化时动态调整日志路径,以实现log4j日志输出路径的动态配置。这种方法避免了频繁修改日志路径的不便,适用于不同环境部署。
方法一、 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs/app.log 
其中“${WORKDIR}/”是个变量,会被System Property中的“WORKDIR”的值代替。这样,我们就可以在log4j加载配置文件之前,先用System.setProperty ("WORKDIR", WORKDIR);设置好根路径,此操作可通过一初始的servlet进行。 

方法二、可以使用服务器环境变量 
log4j的配置文件支持服务器的vm的环境变量,格式类似${catalina.home} 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=${catalina.home}/logs/logs_tomcat.log 
log4j.appender.R.MaxFileSize=10KB 
其中的${catalina.home}并非windows系统的环境变量,这个环境变量就不需要在Windows系统的环境变量中设置。之所以这样,你可以看看tomcat\bin\catalina.bat(startup,shutdown都是调用这个)里面自带有-Dcatalina.home= "%CATALINA_HOME%" 。继承这个思想,所以你也可以自己设定一个参数-Dmylog.home="D:/abc/log"到对应的服务器java启动的vm参数中 

方法三、通过servlet初始化init()方法中加载file属性实现相对路径 
具体实现:做一个servlet,在系统加载的时候,就把properties的文件读到一个properties文件中.那个file的属性值(我使用的是相对目录)改掉(前面加上系统的根目录),让后把这个properties对象设置到propertyConfig中去,这样就初始化了log的设置.在后面的使用中就用不着再配置了 
一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便,目前我采用了动态改变日志路径方法来实现相对路径保存日志文件




catalina.homecatalina.base这两个属性仅在你需要安装多个Tomcat实 例而不想安装多个软件备份的时候使用,这样能节省磁盘空间。
Tomcat6.0为例,其Tomcat目 录结构如下:

bin (运行脚本)
conf (配置文件)
lib (核心库文件)
logs (日志目录)
temp (临时目录)
webapps (自动装载的应用程序的目录)
work (JVM临时文件目录[java.io.tmpdir])

让 我们看看这些目录那些可以被多个Tomcat实例公用,其实只有 bin 和 lib 目录,其它目录conf、logs、temp、webapps和work每个Tomcat实例必须拥有其自己独立的备份。
明 白了上述关系就容易理解catalina.home和catalina.base的 用途了。
catalina.home指向公用信息的位置,就是bin和lib的父目 录。
catalina.base指 向每个Tomcat目 录私有信息的位置,就是conf、logs、temp、webapps和work的父目录。
仅运行一个Tomcat实 例时,这两个属性指向的位置是相同的。


### Tomcat catalina.out 配置每日滚动日志 为了实现 Tomcat 的 `catalina.out` 日志每日滚动,可以通过以下几种方式实现。以下是具体方法的详细说明: #### 方法一:使用 Logrotate 工具 Logrotate 是 Linux 系统自带的日志轮转工具,可以用来管理日志文件的大小生命周期。通过配置 Logrotate,可以让 `catalina.out` 每天生成一个新的日志文件,并删除旧的日志文件。 在 `/etc/logrotate.d/` 目录下创建一个配置文件,例如 `tomcat`,内容如下: ```bash /path/to/tomcat/logs/catalina.out { daily # 每天轮转一次 rotate 7 # 保留最近 7 天的日志 compress # 压缩旧日志 delaycompress # 在下一次轮转时才压缩 missingok # 如果日志文件丢失,不报错 notifempty # 如果日志为空,不进行轮转 copytruncate # 轮转后截断原文件,Tomcat 可继续写入 } ``` 这种方式的优点是简单易用,且不需要修改 Tomcat 的配置[^3]。 #### 方法二:使用 Shell 脚本与 Crontab 定时任务 通过编写一个简单的 Shell 脚本,并结合 Crontab 定时任务,可以手动实现日志切割。以下是一个示例脚本: ```bash #!/bin/bash # 编写一个.sh文件,并放到tomcat下的bin目录,在cron中自动执行 cd `dirname $0` d=`date +%Y%m%d` d7=`date -d'7 day ago' +%Y%m%d` cd ../logs/ cp catalina.out catalina.out.${d} # 将当前日志重命名为带日期的文件 echo "" > catalina.out # 清空原始日志文件 rm -rf catalina.out.${d7} # 删除7天前的日志文件 ``` 将此脚本保存为 `logrotate.sh`,并赋予可执行权限: ```bash chmod +x logrotate.sh ``` 然后在 Crontab 中添加定时任务,每天凌晨执行一次: ```bash 0 0 * * * /path/to/tomcat/bin/logrotate.sh ``` 这种方式的优点是灵活性高,可以根据需求自定义脚本逻辑[^4]。 #### 方法三:关闭 catalina.out 并使用 Log4j 或其他日志框架 如果项目中已经集成了 Log4j 或其他日志框架,建议直接关闭 `catalina.out` 日志输出,转而使用这些框架来管理日志。可以通过修改 Tomcat 的启动脚本(如 `catalina.sh`),注释掉以下行: ```bash #CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out ``` 然后配置 Log4j 或其他日志框架,实现按需的日志分割清理。这种方式的优点是可以更好地控制日志格式存储位置[^2]。 #### 注意事项 - 如果选择使用 Logrotate 或 Shell 脚本,请确保 Tomcat 进程有权限访问修改日志文件。 - 如果选择关闭 `catalina.out`,需要确保其他日志框架能够完整记录所有必要的信息。 - 定期检查日志文件的存储空间,避免因日志堆积导致磁盘满的问题[^1]。 ```python # 示例 Python 代码:检查日志文件大小 import os def check_log_size(log_path, max_size_mb=2048): if os.path.exists(log_path): size = os.path.getsize(log_path) / (1024 * 1024) # 转换为 MB if size > max_size_mb: return f"日志文件 {log_path} 超过 {max_size_mb}MB,请及时清理!" return "日志文件大小正常" print(check_log_size("/path/to/tomcat/logs/catalina.out")) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值