系统开发中日志的使用

来源:互联网 发布:修改定位软件 编辑:程序博客网 时间:2024/06/15 10:33

一.首先总结下log和system.out.println()的区别

1.System.out.print和java运行程序运行在同一线程,也就是说,业务程序会等待System.out的动作,导致资源被占用;使用日志工具时是进行调试信息的打印,这类工具是异步线程的,不会使程序处于等待状态。

2.System.out.print的优点:直观、方便;Log的优点:异步、解耦、灵活、策略多。

3.System.out.print是在控制台输出,只能输出到控制台,功能上线后,总不能一直盯着控制台吧,而且日志文件需要保留,以供日后分析,是需要一套管理规范的,即便使用tomcat服务器,System.out会输出到catalina.out文件,catalina.out文件也不会一直存在,需要定期清空,如果不清空,大文件的读写也是挺影响性能的。说到这里,System.out.print写入的文件只有一个,对于一个文件的读写,这个io肯定会排队写,且System.out.print在当前线程,肯定对性能会有稍微的影响。

4.需要指出的是,真正的开发环境下,存在大量的System.out.print是不规范的开发习惯。

二.学习下Log4j

Log4j中有三个重要的组件:

1. Loggers日志信息的优先级

日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度,设置为高级别的优先级时,低优先级的日志将不会输出,比如将日志级别设置为INFO,则DEBUG级别的目录不会被记录,为了防止日志输出泛滥,最好不要将日志级别设置太低,一般为INFO即可。

2.  Appenders,日志信息的输出目的地

日志信息的输出目的地指定了日志将打印到控制台还是文件中,参数如下:
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件,本文中的案例选择的策略)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件,也是一个不错的选择)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

3.  Layouts,日志信息的输出格式

输出格式的功能是控制日志信息的显示内容,参数如下:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式,本案例所选择的策略,需对日志格式进行设置)

三. 项目中集成日志管理

#log4j.rootLogger = [level],appenderName,appenderName2,...#level是日志记录的优先级,分为OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL##Log4j建议只使用四个级别,优先级从低到高分别是DEBUG,INFO,WARN,ERROR#通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关#比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来log4j.rootLogger=DEBUG, debug#Log4j针对不同包指定level:#一般在生产环境中应用系统,日志级别调整为INFO以避免过多的输出日志。#但某些时候,需要跟踪具体问题,那么就得打开DEBUG日志。#但是如果打开log4j.rootLogger,则需要的信息就会淹没在日志的海洋中。#此时,需要单独指定某个或者某些Logger的日志级别为DEBUG,而rootLogger保持INFO不变。#参考配置如下(指定com.ssm.maven.core.admin类的日志输出)#分包设置,admin与service包中的日志输出分离log4j.logger.com.ssm.maven.core.admin=INFO,adminlog4j.logger.com.ssm.maven.core.service=INFO,servicelog4j.logger.org.springframework=OFFlog4j.logger.org.mybatis.spring=ONlog4j.logger.org.springframework.context.annotation=OFFlog4j.appender.admin=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.admin.layout=org.apache.log4j.PatternLayoutlog4j.appender.admin.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%nlog4j.appender.admin.datePattern='.'yyyy-MM-ddlog4j.appender.admin.Threshold = INFOlog4j.appender.admin.append=true#admin包下的日志输出到admin.log文件中log4j.appender.admin.File=${catalina.home}/logs/ssm-maven/admin.loglog4j.appender.service=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.service.layout=org.apache.log4j.PatternLayoutlog4j.appender.service.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%nlog4j.appender.service.datePattern='.'yyyy-MM-ddlog4j.appender.service.Threshold = INFOlog4j.appender.service.append=true#admin包下的日志输出到service.log文件中log4j.appender.service.File=${catalina.home}/logs/ssm-maven/service.loglog4j.logger.debug=debuglog4j.appender.debug=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.debug.layout=org.apache.log4j.PatternLayoutlog4j.appender.debug.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%nlog4j.appender.debug.datePattern='.'yyyy-MM-ddlog4j.appender.debug.Threshold = DEBUGlog4j.appender.debug.append=truelog4j.appender.debug.File=${catalina.home}/logs/ssm-maven/debug.loglog4j.logger.java.sql.ResultSet=INFOlog4j.logger.org.apache=INFOlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG