日志是系统开发过程当中用于排查问题重要的记录。一般使用日志来记录系统运行的行为,什么时间点发生了什么 事情。Java中经常使用的莫过于Log4j框架了。下面主要围绕Log4j的基础知识、Log4j的使用方式以及实际开发过程当中使用slf4j+log4j作日志等几方面进行展开:java
(一)Log4j的基础知识web
log4j是java中经常使用的一种日志框架,能够用来控制日志的输出格式、输出位置等。输出位置能够是控制台、文件、数据库、指定服务器等。下面介绍的内容,主要是经常使用的一些配置方式。spring
(1)经常使用日志级别数据库
log4j中提供了不一样的日志级别,所谓日志级别,就是能够在不一样的场景下控制日志的输出。经过日志级别的控制,能够将不一样级别的日志输出到不一样的位置。经常使用的日志级别主要有如下四种:apache
DEBUG、INFO、WARN、ERROR服务器
他们的级别从左到右依次是从低到高。若是输出DEBUG级别的日志,那么DEBUG、INFO、WARN、ERROR级别的日志都会输出。app
一般经过控制日志级别将日志输出到不一样的文件,便于异常状况的排查。框架
(2)Log4j的配置方法ide
使用Log4j须要配置log4j.properties配置文件(还能够使用xml格式配置,该部分以properties格式介绍)。布局
下面介绍一下配置文件的配置方法,经过该部分的介绍,能够轻松读懂别人的配置文件,亦能本身配置配置文件。
log4j.rootLogger=WARN, Console, File1
经过log4j.rootLogger配置整个应用的日志输出级别和输出位置。
WARN指定了日志的输出级别,Console和File1指定了日志输出的位置,名称随便起,可是通常起的要有意义,以加强可读性。
若是须要对具体的包、或者类单独控制日志的输出,能够按包进行配置,配置方式以下:
log4j.logger.com.iot=DEBUG, File2
改配置的意思是com.iot包下的全部类的日志输出级别是DEBUG,输出位置是File2。
appender是配置文件的输出位置,在根配置中,指定了文件的输出位置名字,那么该部分就是指定具体输出位置的形式
log4j提供了四种经常使用的输出位置控制,他们是:
一般使用第一种、第三种和第四种,第二种使用较少,由于只能往一个文件中写日志,日志会愈来愈大,查看不方便。
使用方式:
#Console log4j.appender.Console=org.apache.log4j.ConsoleAppender #RollingFile log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.RollingFile.File=../logs/jeesite/jeesite.log
其中加红表粗的字体是根配置中指定的输出位置名,在这里具体指定了是用的输出实现。若是是输出到文件,须要指定文件的路径。
这里特别强调,若是使用RollingFileAppender,须要指定文件的大小,和文件的个数;
使用MaxFileSize指定文件的大小,即当日志文件大小大于1KB时,就会产生新的日志文件。可是硬盘空间有限,日志文件不能无限量的增长,因此须要限制文件的个数。
使用MaxBackupIndex指定文件的个数,达到该个数以后,再次产生的日志文件会覆盖掉老的日志文件。
一个好的日志格式,能够一眼能发现关键信息所在。log4j提供了集中日志格式实现:
一般使用第二种自定义布局格式,经过layout指定具体的布局格式,使用方式:
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
使用了自定义布局格式,就须要自定义布局格式,经过layout.ConversionPattern指定日志格式,以下所示:
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
注:-5表明占5个字符,为了输出对齐使用。
其中各字母的含义以下:
在根配置中,指定了日志级别,该级别是对全部的输出位置进行控制的。可是好比咱们须要将ERROR级别的日志输出到一个文件中,那么就须要经过Threshold来指定了。使用方法:
log4j.appender.RollingFile.Threshold=ERROR
(二)Log4j的使用方式
上面介绍了Log4j的基础知识和经常使用的配置方式,那么在使用的过程当中,有如下几个步骤:
(1)导入log4j的jar包
(2)按照需求编写log4j.properties配置文件
例如:
log4j.rootLogger=DEBUG, Console, File #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d %-5p [%c{5}] - %m%n #File log4j.appender.File=org.apache.log4j.FileAppender log4j.appender.File.File=E://servlet.log log4j.appender.File.layout=org.apache.log4j.PatternLayout log4j.appender.File.layout.ConversionPattern=%d %-5p [%c{5}] - %m%n
(3)在web.xml中配置log4j
编写一个servlet,令其随web应用的启动而启动。
直接代码:
web.xml配置:
<servlet> <servlet-name>log4jServlet</servlet-name> <servlet-class>Log4jServlet</servlet-class> <init-param> <param-name>log4j</param-name> <param-value>WEB-INF/log4j.properties</param-value> </init-param> <load-on-startup>1</load-on-startup><!-- 指定servlet随web应用部署而自启动,值越小,优先级越高 --> </servlet> <servlet-mapping> <servlet-name>log4jServlet</servlet-name> <url-pattern>/log4jServlet.do</url-pattern> </servlet-mapping>
Log4jServlet代码:
public class Log4jServlet extends HttpServlet { @Override public void init() throws ServletException { super.init(); String prefix = getServletContext().getRealPath("/"); String log4jFile = getServletConfig().getInitParameter("log4j"); String log4jConfigPath = prefix + log4jFile; PropertyConfigurator.configure(log4jConfigPath); } }
直接上代码:
web.xml文件:
<context-param> <param-name>log4j</param-name> <param-value>WEB-INF/log4j.properties</param-value> </context-param> <listener> <listener-class>LogListener</listener-class> </listener>
listener监听器实现代码:
public class LogListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } @Override public void contextInitialized(ServletContextEvent servletContextEvent) { ServletContext ctx = servletContextEvent.getServletContext(); String prefix = ctx.getRealPath("/"); String log4jFile = ctx.getInitParameter("log4j"); String log4jConfigPath = prefix + log4jFile; PropertyConfigurator.configure(log4jConfigPath); System.out.println("initialized log4j finish"); } }
若是使用spring,那么能够直接使用spring提供的log4j加载监听器,具体使用可查资料。
(4)日志使用
配置好上面的过程以后,就能够在代码中直接使用了,使用代码:
private final static Logger logger = Logger.getLogger(LogServlet.class); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.debug("执行servlet"); logger.info("执行servlet"); logger.warn("执行servlet"); logger.error("执行servlet"); }
上面的代码执行完,就会根据日志的配置,在预期的位置输出日志
(三)实际开发过程当中使用slf4j+log4j作日志
上面内容讲完以后,就能够在开发过程当中使用log4j框架进行日志输出了。可是一般在开发中咱们常常会见到slf4j。
SLF4J:即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各类各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,容许最终用户在部署其应用时使用其所但愿的日志系统。
在使用SLF4J的时候,不须要在代码中或配置文件中指定你打算使用那个具体的日志系统,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录便可,最终日志的格式、记录级别、输出方式等经过具体日志系统的配置来实现,所以能够在应用中灵活切换日志系统。
有关slf4j的详细东西,这里不作过多介绍,只介绍如何使用slf4j+log4j实现日志记录。
基本的配置和使用log4j相同,可是须要导入下面三个包
使用的过程当中,Logger类的定义以下:
private final static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(LogServlet.class);
其余的和单独使用log4j没有什么区别。