java中的日志文件补充点

        首先我们思考一下日志是为了解决啥产生的,要求日志又是怎么样的?

       一、日志是用来调试的,那么就需要记录程序当前的运行状态和程序之前的运行状态,那么日志文件不仅要能够输出到控制台还要能够输出到文件,甚至能够有邮件的形式通知开发人员。

      二、定位错误。要求日志具备灵活性,可以让开发人员人员针对不同的类,不同的包,不同程度的错误输出到不同的文件中,日志应该是可以针对不同的需求分级的,纯debug环境和线上的生产环境是不一样的,这样才能更快更方便查找问题。

     三、进行数据分析,通过日志去分析用户数据,这样日志就需要是能够变成多文本的,例如HTML的,TXT的,XML等各种类型方便数据分析。

     我们会发现日志类最少有两个特性拥有时间戳和记录文件,它被叫做LoggerEven,而因为要有输出的地方所以采用Appender(可不断追加)来表示输出的目的地,作用于控制台的为SystemOutAppender,作用于文件的为FileAppender,作用与邮件的为SMTPAppender。之后要求要表现形式多样化嘛,就采用了Formatter来做这件格式化的事情,针对文本类即为SimmpleFormatter,对于HTML的就是HTMLFormatter,剩下XML格式的,我想聪明的你必然猜到了,那就是XMLFormatter。那不同的class和package,你会想到什么方法来设计呢?不得不感叹前人的智慧与实力,直接在获取Logger的时候将class或者package带上,并且利用Appender来输出,而一个Logger可以有多个Appender,也就是Logger.addAppender(new XXXAppender("XXX"))返回的是一个list。忍不住贴上一张图:

接下来最后一个就是要按照不同的场景让不同的日志输出到不同的地方,就是给日志分级,采用了Priority类,其中定义了五个级别:Debug,Info,Warm,Error,Fatal这从级别是低到高排序的,就能直接使用Logger.debug(),Logger.info() ...等来输出日志,针对特殊情况需要将所有的error日志输出到error.log文件中,会发现在Appender里有一个priority的属性,如果这个属性被赋值就能够直接定义输出的文件了。比如想要输出的日志级别是debug的,而有一个文件的FileAppender的priority是info那么就会输出到这个File上。道理你一定懂!然后大神Ceki Gülcü发现Appender,Logger,Formatter 互相不影响,可扩展性强就命名为log4j(Logger for Java),在之后设计了logback工具,并为了方便用户切换使用日志设置了slf4j的抽象层,用户通过适配层调用slf4j的api即可。

如果不是使用mave的话,就要导入jar包,写个lo4j的配置文件,如下

          1. 导入slf4j的jar
	   slf4j-api-1.6.1.jar
	
	2. 编写代码
		import org.slf4j.Logger;
		import org.slf4j.LoggerFactory;
		
		publicclass HelloSlf4j {
		     static  Logger logger = LoggerFactory.getLogger(HelloSlf4j.class);
		    publicstaticvoid main(String[] args) {
		        logger.debug("This is debug message");
		        logger.info("This is info message");
		        logger.warn("This is warn message");
		        logger.error("This is error message");
		    }
		}
	
	
	3. 真正使用
		a. 分析
		上面的代码,成功运行后,是没有日志输出的。因为slf4j只是一个接口定义。需要增加真正实现日志输出的框架,例如:log4j.
	
		b. 增加jar包(log4j为例)
		log4j-1.2.16.jar(log4j自身的jar包)
	    slf4j-log4j12-1.7.2.jar(log4j与slf4j的适配层)		
		
		c. 增加log4j的配置文件
		 直接使用log4j的配置文件即可

  如果是使用maven就在pom的依赖添加如下:

<dependency>
    <groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.7.2</version>
</dependency>

然后加一个log4j.properties

#config root logger
log4j.rootLogger = INFO,system.out
log4j.appender.system.out=org.apache.log4j.ConsoleAppender
log4j.appender.system.out.layout=org.apache.log4j.PatternLayout
log4j.appender.system.out.layout.ConversionPattern=MINAServer Logger-->%5p{%F:%L}-%m%n
 
#config this Project.file logger
log4j.logger.thisProject.file=INFO,thisProject.file.out
log4j.appender.thisProject.file.out=org.apache.log4j.DailyRollingFileAppender
log4j.appender.thisProject.file.out.File=logContentFile.log
log4j.appender.thisProject.file.out.layout=org.apache.log4j.PatternLayout


    ps. 细节
        a. 细节1:Logger导入的jar包不同于log4j
        b. 细节2:logger实例对象的获取,不同与log4j.

猜你喜欢

转载自blog.csdn.net/LCF_lxf_ldy/article/details/82563230