本文演示了如果使用LOG4J的记录日志,实现同一个类对不同的文件写日志。使用的是log4j1.2.17版本
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件等。我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
一、下载apache-log4j-extras-1.2.17-bin.tar.gz
从官网下载
http://logging.apache.org/log4j/1.2/download.html
二、将下载的文件加压,将得到的JAR包加入到工程项目的第三方包里面,工程项目的结构如下:
三、编辑log4j.properties文件
log4j.properties 配置文件说明
Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。
1.配置根Logger
log4j.rootLogger = [ level ] , appenderName, appenderName, …
level 是日志记录的优先级,从高到低排序:OFF FATAL ERROR WARN INFO DEBUG ALL。控制日志输出级别开关。
2.配置日志信息输出目的地Appender
Appender种类:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
layout布局种类:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
ConversionPattern布局模式:
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%M:输出产生日志信息的方法名。
%F:输出日志消息产生时所在的文件名称。
%L:输出代码中的行号。
%m 输出代码中指定的具体日志信息。
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个"%"字符。
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
2)%-20c:"-"号表示左对齐。
3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。
3、其他说明
additivity:
默认为TRUE,表示子logger的输入会传送到根logger。这里设置为false,只写子logger的文件。通常用于将不同的LOG分开文件写。
四、JAVA代码调用
log4J参考
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件等。我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
一、下载apache-log4j-extras-1.2.17-bin.tar.gz
从官网下载
http://logging.apache.org/log4j/1.2/download.html
二、将下载的文件加压,将得到的JAR包加入到工程项目的第三方包里面,工程项目的结构如下:
三、编辑log4j.properties文件
log4j.properties 配置文件说明
Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。
1.配置根Logger
log4j.rootLogger = [ level ] , appenderName, appenderName, …
level 是日志记录的优先级,从高到低排序:OFF FATAL ERROR WARN INFO DEBUG ALL。控制日志输出级别开关。
2.配置日志信息输出目的地Appender
Appender种类:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
layout布局种类:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
ConversionPattern布局模式:
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%M:输出产生日志信息的方法名。
%F:输出日志消息产生时所在的文件名称。
%L:输出代码中的行号。
%m 输出代码中指定的具体日志信息。
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个"%"字符。
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
2)%-20c:"-"号表示左对齐。
3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。
3、其他说明
additivity:
默认为TRUE,表示子logger的输入会传送到根logger。这里设置为false,只写子logger的文件。通常用于将不同的LOG分开文件写。
本例的配置文件如下,:
log4j.rootLogger = info,stdout,all
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.all = org.apache.log4j.DailyRollingFileAppender
log4j.appender.all.File = ../logs/all.log
log4j.appender.all.Append = true
log4j.appender.all.Threshold = error
log4j.appender.all.layout = org.apache.log4j.PatternLayout
log4j.appender.all.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] [%c] [%l] %m%n
log4j.logger.subDebugLogger=debug, file1appender
log4j.appender.file1appender = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file1appender.File =../logs/debug.log
log4j.appender.file1appender.Append = true
log4j.appender.file1appender.Threshold = debug
log4j.appender.file1appender.layout = org.apache.log4j.PatternLayout
log4j.appender.file1appender.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] [%c] [%l] %m%n
log4j.additivity.subDebugLogger=false
log4j.logger.subInfoLogger=info, file2appender
log4j.appender.file2appender = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file2appender.File =../logs/info.log
log4j.appender.file2appender.Append = true
log4j.appender.file2appender.Threshold = info
log4j.appender.file2appender.layout = org.apache.log4j.PatternLayout
log4j.appender.file2appender.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS} [ %t:%r ] - [ %p ] [%c] [%l] %m%n
log4j.additivity.subInfoLogger=false
log4j.logger.subErrorLogger=error, file3appender
log4j.appender.file3appender = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file3appender.File =../logs/error.log
log4j.appender.file3appender.Append = true
log4j.appender.file3appender.Threshold = error
log4j.appender.file3appender.layout = org.apache.log4j.PatternLayout
log4j.appender.file3appender.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS} [ %t:%r ] - [ %p ] [%c] [%l] %m%n
log4j.additivity.subErrorLogger=false
四、JAVA代码调用
package log4jtest;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class test2 {
public static void main(String[] args) {
// Logger logger = Logger.getLogger ( test2.class.getName() );
// 读取配置文件,配置Log4j环境
PropertyConfigurator.configure(Thread.currentThread().getContextClassLoader().getResource("./conf/log4j.properties"));
Logger.getRootLogger().debug("DDD");
Logger.getRootLogger().info("EEE");
Logger.getRootLogger().error("FFF");
Logger.getLogger("subDebugLogger").debug("GGG");
Logger.getLogger("subDebugLogger").info("HHH");
Logger.getLogger("subDebugLogger").error("III");
Logger.getLogger("subInfoLogger").debug("JJJ");
Logger.getLogger("subInfoLogger").info("KKK");
Logger.getLogger("subInfoLogger").error("LLL");
Logger.getLogger("subErrorLogger").debug("MMM");
Logger.getLogger("subErrorLogger").info("NNN");
Logger.getLogger("subErrorLogger").error("OOO");
}
}
五、运行调试,运行结果如下,以下是标准输出,当然还有几个文件输出,这里不截图了。
[ INFO] 2017-07-14 16:15:55,417 method:log4jtest.test2.main(test2.java:15)
EEE
[ERROR] 2017-07-14 16:15:55,425 method:log4jtest.test2.main(test2.java:16)
FFF
log4J参考
http://www.cnblogs.com/ITtangtang/p/3926665.html
http://www.codeceo.com/article/log4j-usage.html