在我们的应用程序中日志是不可缺少的部分, 在 Apache 中由一个功能无比强大的日志组件, 它提供了方便的日志记录, 这个开源的项目就是我们惯用的 Log4j,jar 包我么们一颗取 Apache 官网下载最新版本的. log4j 下载地址 https://logging.apache.org/log4j/2.x/
一. 入门篇
1. 打开我们的 Eclipse 新建一个 Java 项目并且导入 Log4j 的 Jar 包
2. 创建并且设置我们 Log4j 的资源文件
- ### 设置 ###
- log4j.rootLogger = debug,stdout,D,E
- ### 输出信息到控制台 ###
- log4j.appender.stdout = org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.Target = System.out
- log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{
- yyyy-MM-dd HH:mm:ss,SSS
- } method:%l%n%m%n
- ### 输出 DEBUG 级别以上的日志到 E://logs/error.log ###
- log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File = E://logs/log.log
- log4j.appender.D.Append = true
- log4j.appender.D.Threshold = DEBUG
- log4j.appender.D.layout = org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern = %-d{
- yyyy-MM-dd HH:mm:ss
- } [ %t:%r ] - [ %p ] %m%n
- ### 输入 ERROR 级别以上的日志到 E://logs/error.log ###
- log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.E.File =E://logs/error.log
- log4j.appender.E.Append = true
- log4j.appender.E.Threshold = ERROR
- log4j.appender.E.layout = org.apache.log4j.PatternLayout
- log4j.appender.E.layout.ConversionPattern = %-d{
- yyyy-MM-dd HH:mm:ss
- } [ %t:%r ] - [ %p ] %m%n
3. 我们来到 Log4jTest 中的 main 方法设置日志内容
- logger.debug("记录 debug 级别的信息");
- logger.info("记录 info 级别的信息");
- logger.error("记录 error 级别的信息");
4. 查看我们的日志输出结果:
这是控制台上打印的信息.
然后我们在来看看我们日志文件
这个时候我们发现日志已经按照我们的配置要求输出到对应的文档去了.
二. log4j 最基本的使用方式
log4j 最要由三个重要的组件构成: 日志信息的优先级, 日志信息的输出目的地, 日志信息的输出格式. 日志信息的优先级从高到低由 ERROR,WARN,INFO,DEBUG, 分别用来指定这条日志信息的重要程度; 日志信息的输出目的地指定了日志是打印在控制台还是输出到文件中; 而输出格式控制了日志信息的显示内容.
1)定义配置文件
其实我们可以完全不用配置 log4j 文件, 我们可以在代码中完成 log4j 的配置环境, 但是使用配置文件将使应用程序变得更加的灵活. log4j 支持两种配置文件格式, 一种是 xml 格式的文件还有一种就是我们上面用的使用 properteis 资源文件.
配置根 Logger, 语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, ...
其中, level 是日志记录的优先级, 分为 OFF,FATAL,ERROR,WARN,INFO,DEBUG,ALL 或者您定义的级别. Log4j 建议只使用四个级别, 优 先级从高到低分别是 ERROR,WARN,INFO,DEBUG. 通过在这里定义的级别, 您可以控制到应用程序中相应级别的日志信息的开关. 比如在这里定 义了 INFO 级别, 则应用程序中所有 DEBUG 级别的日志信息将不被打印出来. appenderName 就是指 B 日志信息输出到哪个地方. 您可以同时指定多个输出目的地.
配置日志信息输出目的地 Appender, 其语法为:
- log4j.appender.appenderName = fully.qualified.name.of.appender.class
- log4j.appender.appenderName.option1 = value1
- ...
- log4j.appender.appenderName.option = valueN
其中, Log4j 提供的 appender 有以下几种:
- org.apache.log4j.ConsoleAppender(控制台),
- org.apache.log4j.FileAppender(文件),
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3. 配置日志信息的格式(布局), 其语法为:
- log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
- log4j.appender.appenderName.layout.option1 = value1
- ...
- log4j.appender.appenderName.layout.option = valueN
其中, Log4j 提供的 layout 有以下几种:
- org.apache.log4j.htmlLayout(以 HTML 表格形式布局),
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
- org.apache.log4j.TTCCLayout(包含日志产生的时间, 线程, 类别等等信息)
Log4J 采用类似 C 语言中的 printf 函数的打印格式格式化日志信息, 打印参数如下: %m 输出代码中指定的消息
%p 输出优先级, 即 DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该 log 信息耗费的毫秒数
%c 输出所属的类目, 通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符, Windows 平台为 "rn",Unix 平台为 "n"
%d 输出日志时间点的日期或时间, 默认格式为 ISO8601, 也可以在其后指定格式, 比如:%d{yyy MMM dd HH:mm:ss,SSS}, 输出类似: 2002 年 10 月 18 日 22:10:28,921
%l 输出日志事件的发生位置, 包括类目名, 发生的线程, 以及在代码中的行数. 举例: Log4jTest.main(Log4jTest.java:9)
2)在代码中使用 Log4j
首先我们要得到记录器
使用 Log4j, 第一步就是获取日志记录器, 这个记录器将负责控制日志信息. 其语法为:
public static Logger getLogger( String name)
通过指定的名字获得记录器, 如果必要的话, 则为这个名字创建一个新的记录器. Name 一般取本类的名字, 比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
然后我们需要读取配置文件
当获得了日志记录器之后, 第二步将配置 Log4j 环境, 其语法为:
BasicConfigurator.configure (): 自动快速地使用缺省 Log4j 环境.
PropertyConfigurator.configure ( String configFilename) : 读取使用 Java 的特性文件编写的配置文件.
DOMConfigurator.configure ( String filename ) : 读取 xml 形式的配置文件.
插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕, 您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方, 其语法如下:
- Logger.debug ( Object message ) ;
- Logger.info ( Object message ) ;
- Logger.warn ( Object message ) ;
- Logger.error ( Object message ) ;
3)日志级别
每个 Logger 都被了一个日志级别(log level), 用来控制日志信息的输出. 日志级别从高到低分为:
A:off 最高等级, 用于关闭所有日志记录.
B:fatal 指出每个严重的错误事件将会导致应用程序的退出.
C:error 指出虽然发生错误事件, 但仍然不影响系统的继续运行.
D:warm 表明会出现潜在的错误情形.
E:info 一般和在粗粒度级别上, 强调应用程序的运行全程.
F:debug 一般用于细粒度级别上, 对调试应用程序非常有帮助.
G:all 最低等级, 用于打开所有日志记录.
上面这些级别是定义在 org.apache.log4j.Level 类中. Log4j 只建议使用 4 个级别, 优先级从高到低分别是 error,warn,info 和 debug. 通过使用日志级别, 可以控制应用程序中相应级别日志信息的输出. 例如, 如果使用 b 了 info 级别, 则应用程序中所有低于 info 级别的日志信息 (如 debug) 将不会被打印出来.
三, web 项目中使用 log4j
上面代码描述了 Log4j 的简单应用, 其实使用 Log4j 也就是这样简单方便. 当然除了上面的配置方法, 还有其它, 比如做一个 J2EE 应用, 在 J2EE 应用使用 Log4j, 必须先在启动服务时加载 Log4j 的配置文件进行初始化, 可以在 Web.xml 中进行.
1,Web 应用的 log4j 使用基本上都采用: 新建一个 servlet, 这个 servlet 在 init 函数中为 log4j 执行配置. 一般就是读入配置文件. 所以需要在 Web.xml 中为这个 servlet 配置, 同时设定 load-on-startup 为 1.
2, 这个 servlet 配置 log4j 就是读出配置文件, 然后调用 configure 函数. 这里有两个问题: 一, 需要知道文件在哪里; 二, 需要正确的文件类型
3, 配置文件位置在 Web.xml 中配置一个 param 即可, 路径一般是相对于 Web 的 root 目录
4, 文件类型一般有两种, 一个是 Java 的 property 文件, 另一种是 xml 文件
配置文件的大致内容: log4j 可以指定输出的 log 级别的最低等级, 以及 log 的输出配置格式, 每个 log 可以指定多个输出方式
接下来我们来创建一个 Web 项目
然后我们配置 Web.xml
- <servlet>
- <servlet-name>Log4JTestServlet</servlet-name>
- <servlet-class>com.miya.log4j.Log4JTestServlet</servlet-class>
- </servlet>
- <!-- 用来启动 log4jConfigLocation 的 servlet -->
- <servlet>
- <servlet-name>Log4JInitServlet</servlet-name>
- <servlet-class>com.miya.log4j.Log4JInitServlet</servlet-class>
- <init-param>
- <param-name>log4j-properties-location</param-name>
- <param-value>/Web-INF/classes/log4j.properties</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Log4JTestServlet</servlet-name>
- <url-pattern>/test</url-pattern>
- </servlet-mapping>
配置 log4j.properties
- ### set log levels ###
- log4j.rootLogger = debug,stdout,D,E
- log4j.appender.stdout = org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.Target = System.out
- log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{
- yyyy-MM-dd HH:mm:ss,SSS
- } method:%l%n%m%n
- log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File = F://logs/log.log
- log4j.appender.D.Append = true
- log4j.appender.D.Threshold = DEBUG
- log4j.appender.D.layout = org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern = %-d{
- yyyy-MM-dd HH:mm:ss
- } [ %t:%r ] - [ %p ] %m%n
- log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.E.File =F://logs/error.log
- log4j.appender.E.Append = true
- log4j.appender.E.Threshold = ERROR
- log4j.appender.E.layout = org.apache.log4j.PatternLayout
- log4j.appender.E.layout.ConversionPattern = %-d{
- yyyy-MM-dd HH:mm:ss
- } [ %t:%r ] - [ %p ] %m%n
Web 容器一打开就加载 servlet 这样也是就行了.
当我们需要在 Spring 项目中加入 Log4j
首先百年不变配置 Web.xml
- <servlet>
- <servlet-name>Log4JTestServlet</servlet-name>
- <servlet-class>com.miya.log4j.Log4JTestServlet</servlet-class>
- </servlet>
- <!-- 用来启动 log4jConfigLocation 的 servlet -->
- <!-- <servlet>
- <servlet-name>Log4JInitServlet</servlet-name>
- <servlet-class>com.miya.log4j.Log4JInitServlet</servlet-class>
- <init-param>
- <param-name>log4j-properties-location</param-name>
- <param-value>/Web-INF/classes/log4j.properties</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>-->
- <servlet-mapping>
- <servlet-name>Log4JTestServlet</servlet-name>
- <url-pattern>/test</url-pattern>
- </servlet-mapping>
- <!-- Spring 容器加载 -->
- <listener>
- <listener-class>org.springframework.Web.context.ContextLoaderListener</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:applicationContext.xml</param-value>
- </context-param>
- <!-- 设置根目录 -->
- <context-param>
- <param-name>webAppRootKey</param-name>
- <param-value>webapp.root</param-value>
- </context-param>
- <context-param>
- <param-name>log4jConfigLocation</param-name>
- <param-value>/Web-INF/classes/log4j.properties</param-value>
- </context-param>
- <!-- 3000 表示 开一条 watchdog 线程每 60 秒扫描一下配置文件的变化; 这样便于日志存放位置的改变 -->
- <context-param>
- <param-name>log4jRefreshInterval</param-name>
- <param-value>3000</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.Web.util.Log4jConfigListener</listener-class>
- </listener>
在 spring 的配置中 applicationContext.xml 中不需要加入任何 bean. 在我们程序一运行 log4j 的 servlet 也会跟着 spring 窗口启动了.
来源: https://www.cnblogs.com/SimpleWu/p/9696970.html