之前说过关于java日志跟踪的几大主要用的框架,也说到了,其实在其中,Log4J充当着一个相当重要的角色。目前,大部分框架也都是采用的是Log4J,虽然说它已经停止了更新,作者也重新起了LogBack的项目,但是,LogBack目前在国内的使用还是相当的少。目前大部分项目还是使用的是Log4J,所以记录一下Log4J的一些常见的使用方法和配置。
 
1、简单的Log4J使用实例
     Log4J作为一个较好的框架,它有着功能强大操作简单的特点,在日常开发过程中,其实需要开发人员做的,大部分是其配置文件的编写,而不是去过多的研究如何写代码。以下是使用Log4J的简单的使用实例,从中,便可以看出其简单易用。
     首先,需要导入Log4J 的jar包,在此就不再赘述了。然后就是在根目录下创建log4j.properties文件(该文件就是在开发过程中我们最常需要写到的文件),在文件中加入代码
#可以设置级别:debug>info>error
#debug:显示debug、info、error
#info:显示info、error
#error:只error
log4j.rootLogger=debug,appender1
#log4j.rootLogger=info,appender1
#log4j.rootLogger=error,appender1
#输出到控制台
log4j.appender.stdout.Threshold=DEBUG
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=[Bash]:%d %5p (%c:%L) - %m%n
  最后,编辑简单的测试类:
 private static Logger logger = Logger.getLogger(Log.class);

 public static void main(String[] args) {
// System.out.println("This is println message."); // 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
logger.error("This is error message.");
}

  运行后,在控制台上的输出如下:

[Bash]:2016-01-18 23:10:11,089  INFO (com.sean.log.LogTest1:14) - This is info message
[Bash]:2016-01-18 23:10:11,093 ERROR (com.sean.log.LogTest1:15) - This is error message
  以上,就算是完成了Log4J的简单使用。
 
  2、输出什么?

  上面,我们实现了Log4J的控制台输出,这里面,需要用到的代码并不多,相对而言,需要说的是log4J的配置文件。在通用的开发环境中,Log4J的使用,重点就是在于其配置文件的配置中。Log4J的配置文件有两种,一种是采用properties文件,另一种是使用xml文件。常见的,也是使用properties的方式进行配置。

1. DEBUG (the least serious)
#   2. INFO
#   3. WARN
#   4. ERROR
#   5. FATAL (the most serious)

  其中debug级别最高,fatal级别为最低,定义的级别越高,则Log4J 会输出显示的级别越多,反之越少。
     接下来,需要配置之前说到的日志输出类,告诉log4J,要采用哪个工具类输出到哪里,常见的包括如同控制台,文本文件,html文件,数据库等。其配置大概如下
log4j.appender.appenderName = class#配置日志输出采用的类
log4j.appender.appenderName.key= value#配置相关日志输出的参数

   到这里,暂时不再说如何输出,先说下输出什么。在第一个实例中,能够发现,控制台的输出和在配置文件中配置的参数是有关的。

     第一个实例中,定义了一个appender为stdout,就是输出到控制台,其中有个参数为ConversionPattern,实例输出的信息其实是以该模板为参照了。在Log4J 中,所有Log4J 定义的appender,都需要定义一个格式化输出的方式,即layout,默认采用的是PatternLayout,而layout会有一个ConversionPattern 参数,主要是让开发者配置他们输出的信息的模板。具体可以如何配置呢?
该参数的包括如下内容:
                  -X: X信息输出时左对齐;
                   %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
                   %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
                   %r: 输出自应用启动到输出该log信息耗费的毫秒数
                   %c: 输出日志信息所属的类目,通常就是所在类的全名
                   %t: 输出产生该日志事件的线程名
                   %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
                   %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
                   %%: 输出一个"%"字符
                   %F: 输出日志消息产生时所在的文件名称
                   %L: 输出代码中的行号
                   %m: 输出代码中指定的消息,产生的日志具体信息
                   %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
                   在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度
 
通过上述参数的组合,开发者可以定义出自己想要输出的内容,有Log4J 输出,如: %r %5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
 
3、如何输出
 
之前说到了,log4J可以实现多种方式的输出,包括控制台,文件,socket,html,数据库,当然也允许自定义输出方式。其中,有一些配置,是仅需要在配置文件中配置,Log4J 即可帮我们完成输出的,而想socket和数据库这样的输出,则是需要其余的一些条件的配合才能进行。
以下是比较完整的log4J的配置文件如下

log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true
# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG #级别
log4j.appender.CONSOLE.Target=System.out #输出
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout #格式化方式
log4j.appender.CONSOLE.layout.ConversionPattern=[bash] %d - %c -%-4r [%t] %-5p %c %x - %m%n #格式化标准
#应用于文件(单个文件)
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE .Threshold=ERROR
log4j.appender.FILE.File=file.log #文件名
log4j.appender.FILE.Append=true #是否累加,是为增量输出,否未覆盖输出
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout #格式化方式
log4j.appender.FILE.layout.ConversionPattern=[bash ] %d - %c -%-4r [%t] %-5p %c %x - %m%n #格式化标准
# Use this layout for LogFactor 5 analysis
# 应用于文件增量添加,按照大小
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender #输出类
log4j.appender.ROLLING_FILE.Threshold=ERROR #输出级别
log4j.appender.ROLLING_FILE.File=rolling.log #文件位置,可以动态配置
log4j.appender.ROLLING_FILE.Append=true #是否累加,是为增量输出,否未覆盖输出
log4j.appender.ROLLING_FILE.MaxFileSize=10KB #文件最大尺寸,
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 #备份数
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout #格式化方式
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # 应用于文件增量添加,按照日期
log4j.appender.Daily_ROLLING_FILE=org.apache.log4j. DailyRollingFileAppender#输出类
log4j.appender.Daily_ROLLING_FILE .Threshold=ERROR #输出级别
log4j.appender.Daily_ROLLING_FILE .File=rolling.log #文件位置,可以动态配置
log4j.appender.Daily_ROLLING_FILE .Append=true #是否累加,是为增量输出,否未覆盖输出
log4j.appender.info.DatePattern=-yyyy-MM-dd'.log'
log4j.appender.Daily_ROLLING_FILE .layout=org.apache.log4j.PatternLayout #格式化方式
log4j.appender.Daily_ROLLING_FILE .layout.ConversionPattern=[bash ] %d - %c -%-4r [%t] %-5p %c %x - %m%n #应用于socket
log4j.appender.SOCKET=org.apache.log4j.net.SocketAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCKET.layout.ConversionPattern=[bash ] %d - %c -%-4r [%t] %-5p %c %x - %m%n # 发送日志给邮件(这种方式用公用邮箱时常会被拦截)
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From= @126.com
log4j.appender.MAIL.SMTPHost=smtp.126.com
log4j.appender.MAIL.SMTPUsername= @126.com
log4j.appender.MAIL.SMTPPassword=
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To= @qq.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[bash ] %d - %c -%-4r [%t] %-5p %c %x - %m%n # html输出
log4j.appender.HTML=org.apache.log4j.FileAppender
log4j.appender.HTML.File=D://htmlLayout.html
log4j.appender.HTML.layout=org.apache.log4j.HTMLLayout
log4j.appender.HTML.layout.Title=HTML Layout Example
log4j.appender.HTML.layout.LocationInfo=true
log4j.appender.HTML.layout.ConversionPattern=[bash ] %d - %c -%-4r [%t] %-5p %c %x - %m%n # 用于数据库
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[bash ] %d - %c -%-4r [%t] %-5p %c %x - %m%n
以上配置文件中,控制台输出,文本输出,html输出都是只需要在配置文件中进行配置,log4j就会根据配置文件中的格式进行输出的。
 
关于使用socket输出,则需要有一台对应的服务器,同时,服务器上还需要有个服务器程序,进行socket监听,来处理日志。
 
比如,当配置文件配置如下时:
#应用于socket
log4j.appender.SOCKET=org.apache.log4j.net.SocketAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=9090
log4j.appender.SOCKET.LocationInfo=true
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[Bash]:%d %5p (%c:%L) - %m%n

默认情况下log4j采用的是tcp协议进行访问,所以,在服务器端需要有个程序,监听9090端口,来实现日志的接收

public static void main(String arg[]) throws IOException {

    ServerSocket serverSocket=new ServerSocket(9090);
while (true){
Socket s= serverSocket.accept();
String line; BufferedReader is=new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));
System.out.println(is.readLine());
} }
关于通过邮件的方式输出,首先确定classpath下有mail.jar包,供Log4J 发送使用,接下来需要配置发送邮箱,和邮件服务器地址,还有用户名密码。需要注意的是,如果采用的是邮件服务提供商的例如网易这样子的邮箱,很有可能会导致发送不出或者被拦截的可能,同时邮件也有可能会存在乱码的问题。
 
关于通过数据库的方式输出,首先,要在对应的数据库服务器下创建一个数据库与表,作为输出的对象。接着,需要导入对应数据库驱动的jar包,然后再配置文件中配置好用户名和密码。最后是配置需要输出的数据库语句。Log4J 并不能知道你需要输出什么,所以需要开发者自己定义好要输出的字段,组成数据库语句,有Log4J 去执行,才能实现数据的输出。如:insert into log(message) values('%m')
 
除了Log4J 定义好的appender以外,开发者还可以通过自定义的方式来实现appender,自定义的方式需要继承基类 AppenderSkeleton ,具体如何实现,建议参考源码,此处主要讲应用,就不再赘述了
 
最后简易的说一下Log4J 的几种输出方式的使用情况,文件输出应该是最常用的一种,因为其配置较为简单,而且能够进行按日期增量备份,如果是不是要求非常高,该方式已经能够达到日志输出的目的了。相较之下,采用socket,mail的方式相对更少用,首先,采用socket的话,需要有个socket的服务端程序来接收日志,这样子意味着要添加工作量,除非是已经有了对应的程序,否则在开发过程中,个人不会选择用socket。至于mail,功能非常强大,可是有一点,在于如果采用常用的邮件提供商,会有被拦截的可能。同时,如果只有当日志输出把握的非常好的情况下,才会出现mail的情况,比如,需要严格定义好输出error的标准,然后设置mail输出等级为error,如果设置的不好,可能会导致不断发送垃圾文件的可能
 
关于使用数据库和html的方式收集数据,两者各有各的好处。Html对日志的展示比较直观,可是,如果单独采用这种方式的话,可能就无法日志进行进一步的处理了。采用数据库的方式最大的好处,可以对日志进行进一步的处理,如索引,筛选等,可是需要的资源也比较多。好刀用到刀刃上,具体该怎么使用,还需要根据具体的需求来进行设计。
 
参考:http://www.blogjava.net/hwpok/archive/2008/08/23/223891.html

循序渐进看Java web日志跟踪(3)-Log4J的使用和配置的更多相关文章

  1. 循序渐进看Java web日志跟踪(1)-Tomcat 日志追踪与配置

    日志,是软件运行过程中,对各类操作中重要信息的记录. 日志跟踪,不管对于怎么样的项目来说,都是非常重要的一部分,它关系到项目后期的维护和排错,起着举足轻重的作用.项目开发过程中,对日志的记录规则,也将 ...

  2. 循序渐进看Java web日志跟踪(2)-Java日志API认识

    接触过Java的朋友应该都会知道,java的开源框架百花齐放,实现同样的功能,总能找到几个强大的开源框架来进行选择.在日志方面,Java同样不逊色.除了JDK本身自带的简单的日志工具,java还有如l ...

  3. 阿里云部署Java web项目初体验(转)/linux 上配置jdk和安装tomcat

    摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在阿里云上部署Java web项目. 一.准备工作 购买了阿里云的云解析,和云服务器ecs. 2.下载put ...

  4. Java Web入门学习(二) Eclipse的配置

    Java Web学习(二) Eclipse的配置 一.下载Eclipse 1.进入Eclipse官网,进行下载 上图,下载Eclipse IDE for JaveEE Developers 版本,然后 ...

  5. Java Web开发之路(一)——环境配置

    1. 下载JDK(Java Development Kit)工具包.其中包括运行Java程序所必须的JRE环境及开发过程中常用的库文件. (JDK与JRE的关系: JDK是Java的开发环境,在编写J ...

  6. java Web开发中,Tomcat安装顺序与配置(windows7系统下)

    一.要先安装JDK[比如,安装目录:D:/program Files/Java ] 注:1.JDK安装顺序可以参照百度,后期会补上 2.安装是否成功的验证方式:点击“开始”→输入“cmd”→输入“Ja ...

  7. 【Java】日志知识总结和经常使用组合配置(commons-logging,log4j,slf4j,logback)

    Log4j Apache的一个开放源码项目,通过使用Log4j,我们能够控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等.用 ...

  8. java web,从零开始,一步一步配置ssm(Spring+SpringMVC+MyBatis)框架

    1.安装JDK: 安装之后要配置环境变量,在系统变量里: 新建变量名JAVA_HOME,变量值C:\Program Files\Java\jdk1.8.0_77: 新建变量名CLASSPATH,变量值 ...

  9. Mac下Intellij IDea发布Java Web项目详解四 为所有Module配置Tomcat Deployment

    准备工作1:新建第一个JavaWeb项目 准备工作2:新建Module step5 为所有项目配置Deployment 5.1 如图 5.2 [+][Artifact] 5.3 将这里列出的所有内容选 ...

随机推荐

  1. leetcode Binary Tree Postorder Traversal 二叉树后续遍历

    先给出递归版本的实现方法,有时间再弄个循环版的.代码如下: /** * Definition for binary tree * struct TreeNode { * int val; * Tree ...

  2. async/task/await

    async/task/await三组合是.NET Framework 4.5带给.NET开发者的大礼,合理地使用它,可以提高应用程序的吞吐能力. 但是它的使用有点绕人,如果不正确使用,会带来意想不到的 ...

  3. ubuntu下无法打开windows下ntfs文件系统的解决方法

    例如:/dev/sda5无法加载,使用如下命令 sudo ntfsfix /dev/sda5 如果命令没有安装,先安装(sudo apt-get install ntfsprogs).

  4. jquery水印插件:placeholder

    jquery水印插件:placeholder 有的浏览器支持html5的水印placeholder(如Crome,firefox,ie10+),有的不支持html5的placeholder(ie9,i ...

  5. 解决Timer回调方法重复调用的问题

    如果Timer的回调方法的执行时间很长,计时器可能在上个回调方法还没有完成的时候再次触发,如果我们只是想让一个回调方法执行完后再执行下一个回调方法,可以这样: private static Timer ...

  6. PRML 第三章 - 线性回归

    这段时间组里在有计划地学习书籍PRML (Pattern Recognition and Machine Learning),前两天自己做了一个里面第三章linear regression的分享,这里 ...

  7. 企业架构与建模之使用ArchiMate进行分析

    企业架构与建模之使用ArchiMate进行分析(全系列完) 4. 使用ArchiMate进行分析 正如前面所说的那样,一个企业整体效率的提升有时并不是通过某一个领域内的优化就能达到的,而且这种忽视全局 ...

  8. Oracle随机获取记录

    , )) RANDOMNUM FROM DUAL) B ORDER BY B.RANDOMNUM

  9. 使用Ajax

    ASP.NET 使用Ajax   之前在Ajax初步理解中介绍了对Ajax的初步理解,本文将介绍在ASP.NET中如何方便使用Ajax,第一种当然是使用jQuery的ajax,功能强大而且操作简单方便 ...

  10. Java学习笔记——Java程序运行超时后退出或进行其他操作的实现

    当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...