Log4j组件构成

Log4j由三个重要的组件构成:

1.日志信息的优先级(Logger)

2.日志信息的输出目的地(Appender)

3.日志信息的输出格式(Layout)。

概要:

日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG,分别用来指定这条日志信息的重要程度;

日志信息的输出目的地指定了日志将打印到控制台还是文件中;

而输出格式则控制了日志信息的显示内容。

Log4j介绍

  Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。log4j--log for java (java的日志) .

Log4j下载地址: http://logging.apache.org/log4j/2.x/download.html

Log4j配置文件的格式

Log4j支持两种配置文件格式:

1. XML格式的文件

2. properties格式的文件

也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。

Log4j定义配置文件

1.配置根Logger

其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

参数说明:  

level是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。

Off:最高等级,用于关闭所有日志记录

Fatal:指出每个严重的错误事件将会导致应用程序的退出。

Error:指出虽然发生错误事件,但仍然不影响系统的继续运行。

Warn:表明会出现潜在的错误情形

Info:一般用在粗粒度级别上,强调应用程序的运行全程

Debug:一般和在粗粒度级别上,强调应用程序的运行全程。

All:最低等级,用于打开所有日志记录。

Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。

appenderName就是指日志信息输出到哪个地方,可以同时指定多个输出目的地。

2.配置日志信息输出目的地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{yyyMMMddHH:mm:ss,SSS},输出类似:2002年10月18日22:10:28,921   

%l输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像javaservlets这样的多客户多线程的应用中。

%%:输出一个”%”字符 %F:输出日志消息产生时所在的文件名称

%L:输出代码中的行号

%m:输出代码中指定的消息,产生的日志具体信息

%n:输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。

如:

1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。

2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。

3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。

4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

log4j.xml的配置方式

View Code

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="appender1"class="org.apache.log4j.RollingFileAppender"><param name="File" value="logfile08.html" /><param name="MaxFileSize" value="1MB" /><param name="MaxBackupIndex" value="5" /><layout class="org.apache.log4j.HTMLLayout"></layout></appender><root><level value="debug" /><appender-ref ref="appender1" /></root>
</log4j:configuration>

代码中使用Log4j

  在程序中使用Log4j之前,首先要将commons-logging.jar和logging-log4j-1.2.9.jar导入到classpath中,并将log4j.properties放于src根目录中。 在类中使用log4j,首先声明一个静态变量Loggerlogger=Logger.getLog("classname").现在就可以使用了。

用法如下:logger.debug("debugmessage")或者logger.info("infomessage").

1.得到记录器

  使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。

其语法为:

  publicstaticLoggergetLogger(Stringname)

  通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

  staticLoggerlogger=Logger.getLogger(ServerWithLog4j.class.getName())

2.读取配置文件

  当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

  BasicConfigurator.configure():自动快速地使用缺省Log4j环境。

  PropertyConfigurator.configure(StringconfigFilename):读取使用Java的特性文件编写的配置文件。

  DOMConfigurator.configure(Stringfilename):读取XML形式的配置文件。

3.插入记录信息(格式化日志信息)

  当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,语法如下:

   Logger.debug(Objectmessage);

   Logger.info(Objectmessage);

   Logger.warn(Objectmessage);

   Logger.error(Objectmessage);

程序演示

1.使用程序进行日志信息输出

 1 package org.demo.log4j.dennisit;
 2
 3 import java.io.IOException;
 4
 5 import org.apache.commons.logging.impl.Log4JLogger;
 6 import org.apache.log4j.BasicConfigurator;
 7 import org.apache.log4j.FileAppender;
 8 import org.apache.log4j.Layout;
 9 import org.apache.log4j.Level;
10 import org.apache.log4j.Logger;
11 import org.apache.log4j.SimpleLayout;
12
13 /**
14  *
15  *  @version : 1.1
16  *
17  *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>
18  *
19  *  @since      : 1.0        创建时间:    2013-1-1        下午03:19:42
20  *
21  *  @function: 通过代码将日志输出
22  *
23  */
24
25 public class Log4jPrintByCode {
26
27     private static Logger logger = Logger.getLogger(Log4jPrintByCode.class);
28
29     private Layout layout = new SimpleLayout();
30     private FileAppender fileAppender;
31
32
33     //使用构造依赖,创建对象时初始化
34     public Log4jPrintByCode(Layout layout, Level level,String distDir){
35
36         BasicConfigurator.configure();        //使用默认的配置信息,不需要写log4j.properties
37
38         try {
39             init(layout,level, distDir);
40         } catch (Exception e) {
41             e.printStackTrace();
42         }
43
44     }
45
46
47     public void init(Layout layout, Level level,String distDir) throws Exception{
48
49         logger.setLevel(level);                //设置日志输出级别
50         fileAppender = new FileAppender(layout,distDir,false);
51         logger.addAppender(fileAppender);    //添加输出端
52
53     }
54
55
56     public static void main(String[] args) {
57
58         SimpleLayout layout = new SimpleLayout();
59         String logDir = "log4jcode.Log";
60         Log4jPrintByCode log4jCode = new Log4jPrintByCode(layout,Level.INFO,logDir);
61
62
63         //下面信息将被输出
64         log4jCode.logger.info("log info print by log4j");
65         log4jCode.logger.warn("log warn print by log4j");
66         log4jCode.logger.error("log error print by log4j");
67
68     }
69
70
71     public Layout getLayout() {
72         return layout;
73     }
74
75     public void setLayout(Layout layout) {
76         this.layout = layout;
77     }
78
79     public FileAppender getFileAppender() {
80         return fileAppender;
81     }
82
83     public void setFileAppender(FileAppender fileAppender) {
84         this.fileAppender = fileAppender;
85     }
86
87
88
89 }

为了提高效率,我们可以在写日志前增加判断:

// 记录debug级别的信息
if (logger.isDebugEnabled()) {logger.debug("This is debug message from Dao.");
}// 记录info级别的信息
if (logger.isInfoEnabled()) {logger.info("This is info message from Dao.");
}

如果这个类作为基类,如J2EE中的BaseDao、BaseAction、BaseService等等,则我们可以将各层的日志信息分类输出到各个文件。

2.Log4J将同一个日志信息输出到多个目的地

应用实例将日志信息同时输出到控制台,文件和数据库中.

创建数据库与 表

/* 创建数据库 */
create database db_log4j;/* 切换数据库 */
use  db_log4j;/* 日志信息表 */
create table tb_log(logId int not null auto_increment comment '流水号' ,createDate varchar(45) default null comment '日志生成时间' ,thread varchar(45) default null comment '当前线程',level varchar(45) default null comment '当前日志级别' ,class varchar(45) default null comment '生成日志的类',message varchar(245) default null comment '日志具体信息',primary key(logId)
);

配置文件log4j.properties

#定义3个输出端
log4j.rootCategory=INFO,A1,A2,A3#定义A1输出到控制器
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#定义A1的布局模式为PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# 定义A1的输出格式
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n#定义A2输出到文件
log4j.appender.A2=org.apache.log4j.RollingFileAppender
#定义A2输出到哪个文件
log4j.appender.A2.File=./log/sysLog.log
#定义A2输出文件的最大长度
log4j.appender.A2.MaxFileSize = 1KB
#定义A2的备份文件数
log4j.appender.A2.MaxBackupIndex = 3
#定义A2的布局模式为PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
#定义A2的输出模式
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n#定义A3输出到数据库
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
#定义A3的布局和执行的SQL语句
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERT INTO tb_log(createDate,thread,level,class,message) values('%d','%t','%-5p','%c','%m')

Java测试代码

package org.demo.log4j.dennisit;import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;/****  @version : 1.1*  *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>*    *  @since      : 1.0        创建时间:    2013-1-1        下午04:13:59*     *  @function: 通过配置文件控制日志信息输出到多个目的端**/public class Log4jPrintByConfigure {private static Logger logger = Logger.getLogger(Log4jPrintByConfigure.class);public static void main(String[] args) throws Exception {//加载log配置文件log4j.propertiesPropertyConfigurator.configure("configure/log4j.properties");//文件存放在src同目录的configure文件夹下//如果放在src下的话,参数应为"bin/log4j.properties"或者"src/log4j.properties", 建议以bin为准//以下信息将被打印输出logger.debug("logger print DEBUG messgae");logger.info("logger print INFO message");logger.warn("logger print WARN message");logger.error("logger print ERROR message");logger.fatal("Here is FATAL message");}}

转载请注明出处[http://www.cnblogs.com/dennisit/archive/2013/01/01/2841603.html]

使用Log4j为项目配置日志输出应用详细总结及示例演示.相关推荐

  1. log4j中用变量配置日志输出文件位置

    http://sharep.blog.51cto.com/539048/143734 log4j中配置日志文件相对路径 2009-03-30 18:52:55 标签:log4j 休闲 职场 这篇文章写 ...

  2. SpringBoot通过yml和xml文件配置日志输出

    SpringBoot中默认使用Logback进行日志输出,可以同时使用通过logback的配置文件logback.xml或是SpringBoot框架的配置文件application.yml进行配置. ...

  3. 日志输出到文件nacos 配置_python 配置日志输出到终端与文件

    python 日志输出到终端与文件配置 Pou光明 2018-12-15 大家好,那个熟悉的我又回来了~ 最近一段时间由于工作原因,用了一段时间python.接触到了坑爹的GIL锁.python日志, ...

  4. tomcat部署springboot项目console日志输出中文乱码问题

    tomcat启动springboot项目输出的日志有两个层次.一是tomcat自身的输出,一个是springboot项目的输出. tomcat输出乱码 tomcat的conf/logging.prop ...

  5. 【springboot基础】配置日志输出级别以及输出位置

    1.配置application.yml logging:config: classpath:spring-logback.xmllevel:root: error 2.配置spring-logback ...

  6. rsyslog日志级别 配置日志输出级别

    日志级别如下: 等级数值 等级名称 说明 7 debug 调试程序产生的的日志 6 info 基本信息说明,无伤大雅 5 notice 虽然是正常信息,但比info还需要被注意到的一些信息内容 4 w ...

  7. log4j2日志输出到控制台-Maven工程

    log4j2简介: Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its pred ...

  8. 关于web项目log日志指定输出文件位置配置

    首先我们定义一个可以在运行时动态的找出项目的路径WebAppRootKey,这么做的原因是为了在后面配置log4j输出文件路径的时候能随心配置. <context-param><pa ...

  9. Java日志输出Logger,Commons Logging,Log4j的运用

    日志 在编写程序的过程中,常常用System.out.println()打印出执行过程中的某些变量,观察每一步的结果与代码逻辑是否符合,然后有针对性地修改代码.改好之后又要删除打印语句,这样很麻烦. ...

最新文章

  1. linux c 时间函数 time difftime 简介
  2. 拿来主义——老外写的系统统计脚本
  3. Spring注解开发-Bean注册
  4. 请求的安全信息不可用或无法显示
  5. 武侠乂服务器位置在哪,武侠乂手游秘境在哪里 地图秘境宝藏分布位置大全
  6. 【redis】redis基础命令,分布式锁,缓存问题学习大集合
  7. FRM-92120: Registry.dat
  8. Office2016+Visio2016安装过程
  9. 简单的光线追踪教程(一)
  10. 第五章:软件详细设计
  11. Linux中安装VIM命令
  12. 爬虫项目#4567电影网scrapy数据爬取moviePro/持久化储存handReqPro
  13. [RK3288][Android6.0] 调试笔记 --- 开机提示mmc rescan错误
  14. 《期权、期货及其他衍生产品》读书笔记(第七章:互换)
  15. 字符串百分号 c语言,C语言 输出百分号(%)的方法
  16. html js 做一个钟表,html,css,js实现的一个钟表
  17. 嵌入式微处理器的体系结构
  18. 【编译原理复习】第六章---- 属性文法和语法制导翻译
  19. 如何让PPT的备注演示者看到而观众看不到
  20. anaconda中的包如何传到pycharm中使用?

热门文章

  1. Java设计模式笔记(8)装饰模式
  2. 奖学金设计mysql_基于JAVA的奖学金评定系统设计与实现(MySQL)(含录像)
  3. mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解
  4. android serialport new 软件退出_基于Android9.0,了解Android启动流程
  5. grep -q用于if逻辑判断
  6. matlab自动排版,工具方法| Matlab 简单绘图与排版
  7. a byte of python中文版_面试官问 Python 版 “垃圾回收”机制,我没答上来
  8. 【转】C# 数据流详解(FileStream、MemoryStream、NetworkStream等类)
  9. 【转】刨根究底字符编码之十五——UTF-32编码方式
  10. Java 并发基础——线程安全性