日志规范与自动删除

  1. 日志规范
    1.1. 目的
    在正式环境运行时,程序出现问题是能够提供足够的信息来帮助开发人员找到问题。
    1.2. 要求
    为了达到这样的目的,要求要准确的在问题发生时暴露问题原因,执行内容上下文(报
    错的位置,层级),执行的参数。通过这些打印的日志能够反向发现问题出现的地方和原因。
    那么就有如下要求:
  2. 打印日志级别要严格区分,拒绝所有操作不区分层级打印同一级别日志
    (1) debug 开发调试时使用 debug 级别 调试信息,可记录详细的业务处理到哪一步了,
    以及当前的变量状态
    (2) info 业务结果说明
    (3) error 发生错误的业务日志说明 运行期错误
  3. 举例说明:
    1】假设一个标准的 MVC 模式的后台 Controller-Service-Dao 层
    一个请求过来,假设在 Service 层中报错,那么在 Service 的异常捕获就应该捕获错
    误,描述错误类型,然后组装自定义的业务异常类,向上层抛出,抛向 Controller 层。
    本层不用记录错误日志(因为上层会自己打印):这里所说的异常是指的中断服务了的
    异常,停止继续进行本次请求。
    另外一种情况是指的:本层业务处理失败,但是有存在补救或者异常处理后可以继
    续执行的,在当前层打印错误日志:当前方法 方法传入参数 以及错误原因 补救方式。
    Controller 层捕获这个异常后,知道是业务异常后,将本次请求的链接,参数和异
    常的错误信息(message 和 StackTrace 信息)组织错误日志输出。
    然后组装错误返回信息作为返回值。
    2】切勿使用 AOP 层打印全部日志,性能很堪忧的。会占用相当多的 I/O,导致服
    务器的处理性能下降。 (TFinfo的14秒到4秒就是处理了AOP层的日志打印降为了Debug
    级,正式环境不输出即可)
    1.2.1. 基本的 Logger 编码规范
    1.在一个对象中通常只使用一个 Logger 对象,Logger 应该是 static final 的,只有在少数
    需要在构造函数中传递 logger 的情况下才使用 private final。
    2.输出 Exceptions 的全部 Throwable 信息,因为 logger.error(msg)和
    logger.error(msg,e.getMessage())这样的日志输出方法会丢失掉最重要的
    StackTrace 信息。
    3.不允许记录日志后又抛出异常,因为这样会多次记录日志,只允许记录一次日志。
    4.不允许出现 System print(包括 System.out.println 和 System.error.println)语句。
    5.不允许出现 printStackTrace。
    6.有意义的日志
    通常情况下在程序日志里记录一些比较有意义的状态数据:程序启动,退出的时间点;程序
    运行消耗时间;耗时程序的执行进度;重要变量的状态变化。
    初次之外,在公共的日志里规避打印程序的调试或者提示信息。
    1.3. log4j.properties 的配置
    配置示例:

指定根 Logger,及日志输出级别,大于等于该级别的日志将被输出,设为 OFF

可以关闭日志

测试环境

log4j.rootLogger=ALL,Debug,InfoFile,ErrorFile

正式环境

log4j.rootLogger=InfoFile,ErrorFile

debug

log4j.appender.Debug= org.apache.log4j.ConsoleAppender
log4j.appender.Debug.Target= System.out
log4j.appender.Debug.layout= org.apache.log4j.PatternLayout
log4j.appender.Debug.Append= true
log4j.appender.Debug.Threshold= INFO
log4j.appender.Debug.layout.ConversionPattern= %d{yyyy-MM-dd
HH:mm:ss}|%5p|%c{1}|%C|%M: %L - %m%n

info

log4j.appender.InfoFile=org.apache.log4j.DailyRollingFileAppender

按日输出

log4j.appender.InfoFile.File=${catalina.home}/log/info/info.log

拆分日志文件夹 输出文件地址

log4j.appender.InfoFile.Encoding=UTF-8

编码

log4j.appender.InfoFile.Threshold=INFO

日志级别

log4j.appender.InfoFile.DatePattern=’.’yyyy-MM-dd’.log’

文件格式

log4j.appender.InfoFile.layout=org.apache.log4j.PatternLayout

日志格式

log4j.appender.InfoFile.layout.ConversionPattern=%d{yyyy-MM-dd
HH:mm:ss}|%5p|%c{1}|%C|%M: %L - %m%n

error

log4j.appender.ErrorFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ErrorFile.File=${catalina.home}/log/error/error.log
log4j.appender.ErrorFile.Encoding=UTF-8
log4j.appender.ErrorFile.Threshold=ERROR
log4j.appender.ErrorFile.DatePattern=’.’yyyy-MM-dd’.log’
log4j.appender.ErrorFile.layout=org.apache.log4j.PatternLayout
log4j.appender.ErrorFile.layout.ConversionPattern=%d{yyyy-MM-dd
HH:mm:ss}|%5p|%c{1}|%C|%M: %L - %m%n
2. 自动日志删除
2.1. 创建文件
找一个路径,建议和 tomcat 文件夹同级。
使用执行:
touch auto-del-log.sh
创建文件,然后执行
chmod +x auto-del-log.sh
赋予权限,接着打开文件:
vi auto-del-log.sh
2.2. 编写规则
2.2.1. 示例:
例如,假如 tomcat(所有 apache-tomcat 的上一层文件夹)路径是/home/tfapp/tomcat,删
除周期是删除十天之前的日志那么可以输入:
find /home/tfapp/tomcat -mtime +10 -name “.log.” -exec rm -rf {} \;
tomcat 日志删除命令 30 天前日志:
find tomcat 路径 -mtime +30 -name “.log.” -exec rm -rf {} \;
find tomcat 路径 -mtime +30 -name “*.log” -exec rm -rf {} \;
find tomcat 路径 -mtime +30 -name “localhost_access_log” -exec rm -rf {} \;
若是按照第一步的规则打印的日志使用一条即可删除 Java 程序日志(但是 Tomcat 的日志删
不到 所以将 Tomcat 日志删除的三条命令一起用最好 干干净净):
find tomcat 路径 -mtime +30 -name “.log.” -exec rm -rf {} \;
2.2.2. 介绍说明:
find 对应目录 -mtime +天数 -name “文件名” -exec rm -rf {} \;
find:Linux 查找命令,用户查找指定条件的文件
/home/apache-tomcat-7.0.55-13-990*/webapps/HollyProxyServer2.0/WEB-INF/logs/:需要进行
清理的目标目录
-mtime:标准语句写法
+10 :数字代表天数
-name “.log.“:目标文件的类型,带有 log 的所有文件
-exec:固定写法
rm -rf:强制删除包括目录在内的文件
{} \;:固定写法,一对大括号+空格++;
2.2.3. 增加到定时任务中:
补充:最小化安装可能没有按照 crontab 使用如下命令按照
yum install -y vixie-cron crontabs
执行
crontab -e
点击 insert,切换为编辑模式,然后插入:
0 1 * * * /home/tfapp/auto-del-log.sh
说明:
cron 表达式 执行路径 执行文件
这个配置
然后按 ESC
输入 wq 保存退出
完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值