JAVA日志使用

[转]JAVA日志使用

一 、概论 

在java 中实现记录日志的方式有很多种,
1. system.out.print ,system.err.print:最简单的方式,直接在控制台打印消息了。
2. java.util.logging : 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中写日志了(不好用,不推荐使用)
3. log4j :最强大的记录日志的方式。 可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。
4. commons-logging:通用的日志接口,common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库,自己也自带一个功能很弱的日志实现
5. slf4j:日志门面,只提供接口方法,当配合特定的日志实现时,需要引入相应的桥接包
6. log4j2:


在logging中,通常包含以下几个元素:
1.log- 日志对象
2.level - 日志级别
3.formatter/render/layout - 格式化日志记录
4.handler/appender - 输出位置,包括console, file, stream


二、java.util.logging简介 

源码演示:


  
  
  1. < public class Test {
  2. public static void main(String[] args) throws Exception {
  3. // 1.创建log
  4. Logger log = Logger.getLogger( "logtest");
  5. // 2.设置log级别(默认为info级别)
  6. log.setLevel(Level.INFO);
  7. // 3.设置Handler
  8. FileHandler fileHandler = new FileHandler( "d:" + File.separator + "log.txt");
  9. // 4.Handler格式化(如果不格式化,默认输出为xml类型)
  10. fileHandler.setFormatter( new Formatter() {
  11. @Override
  12. public String format(LogRecord record) {
  13. StringBuilder sb= new StringBuilder( "[" + new Date().toString()+ this.getClass().getName() + "]");
  14. sb.append(record.getLevel() + "\t" + record.getMessage()+ "\r\n");
  15. return sb.toString() ;
  16. }
  17. });
  18. // 5.日志添加Handler
  19. log.addHandler(fileHandler);
  20. // 6.日志输出内容
  21. log.fine( "fine日志测试"); //比info级别低的日志将不会输出
  22. log.info( "info日志测试");
  23. log.warning( "warning日志测试");
  24. }
  25. }>

输出结果如图:


更多细节及原理请查看---http://www.oseye.net/user/kevin/blog/237
            http://lavasoft.blog.51cto.com/62575/184492/


三、log4j   

log4j跟其它logger机制一样,存在着基本的logger所有基本概念,只是它的fomatter叫做patternLayout, 而handler则叫做appender. 另外log4j和java util logging在level的划分上有所不同,log4j的level分为:TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL。
1.工程结构


2.配置文件(本文以property方式,xml方式请查看其他)
<span style="font-size:18px;">####输出级别为 debug,目的地为appender1(可以指定多个):
log4j.rootLogger=debug,appender1,appender2,appender3 

####appender1 配置(控制台输出):
#输出位置:
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#输出格式:
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout

####appender2 配置(文件输出,html格式):
#输出位置:
log4j.appender.appender2=org.apache.log4j.FileAppender
#输出位置:
log4j.appender.appender2.File=D:/appender2.html
#输出格式:
log4j.appender.appender2.layout=org.apache.log4j.HTMLLayout

####appender3 配置(文件输出,自定义格式):
#输出位置:
log4j.appender.appender3=org.apache.log4j.FileAppender
#输出位置:
log4j.appender.appender3.File=D:/appender3.txt
#输出格式:
log4j.appender.appender3.layout=org.apache.log4j.PatternLayout
#自定义样式 , %r 时间 ,%t方法名 main,%p优先级 DEBUG/INFO/ERROR ,
#%c所属类的全名(包括包名),%l 发生的位置,在某个类的某行 ,%m 输出代码中指定的讯息,%n输出一个换行符号
log4j.appender.appender3.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m%n</span>

说明:
      1).配置根Logger,其语法为: 
  log4j.rootLogger = [ level ] , appenderName, appenderName, …
  其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。

  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有以e几种:
  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 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

3.代码:

   
   
  1. <span style= "font-size:18px;"> public class Log4jTest {
  2. //第一步:日志记录
  3. private static Logger log = Logger.getLogger(Log4jTest.class);
  4. public static void main(String[] args) throws Exception {
  5. //第二步:读取配置文件(默认读取根目录下log4j.properties)
  6. /*
  7. BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
  8.    PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
  9.    DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
  10. */
  11. //第三步:插入日志信息
  12. log.debug( "debug...信息");
  13. log.info( "info...信息");
  14. log.error( "error...信息");
  15. }
  16. }</span>
4.效果:



四、Commons-logging     

 目的是为所有流行的logging提供一个通用接口。用户在开发的时候只需要调用commons logging的接口。而运行环境中具体使用的是log4j,util logging或其它的logging, 则由commons logging配置文件或者commons logging的自动探测来决定。

在系统开发中,统一按照commons-logging的API进行开发,在部署时,选择不同的日志系统包,即可自动转换到不同的日志系统上。比如:开始选择JDK自带的日志系统,,如果中途无法忍受JDK自带的日志系统了,想换成log4j的日志系统,仅需要导入log4j.jar即可

Commons Logging包含三个jar:
commons-logging-api.jar  这里面包含了commons logging的通用接口以及两个logger的实现:SimpleLog和NoOpLog.
commons-logging.jar 这里面包含了通用接口,以及Log4j,JDK logger等的适配器。这个是最常用的包。
commons-logging-adapters.jar 只包含了第三方logger的适配器。必须和上面两个包中的一个搭配使用。

使用Commons-logging的LogFactory获取日志处理类时:
1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;
2) ???如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;
3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;

使用Log4j:

配置文件与上节提到的相同,只是代码略有改动:


生成文件:略

五、SLF4J                                                                                                                        

Simple logging facades for java也是一种通用的logging接口。 Common-logging动态查找日志实现(程序运行时找出日志实现),Slf4j则是静态绑定(编译时找到实现),动态绑定因为依赖ClassLoader寻找和载入日志实现,因此类似于OSGI那种使用独立ClassLoader就会造成无法使用的情况。
SLF4J与commons-logging的比较:http://www.360doc.com/content/10/1216/23/573136_78845816.shtml

SLF4J获得log对象(与commons相比还是有区别的)
private static final Logger logger = LoggerFactory.getLogger(Test.class);

  •                     <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count"></span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/u011179993">
                    <img src="https://profile.csdnimg.cn/D/D/C/3_u011179993" class="avatar_pic" username="u011179993">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/1x/7.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/u011179993" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">chenjazz</a></span>
                                                    <span class="flag expert">
                                <a href="https://blog.csdn.net/home/help.html#classicfication" target="_blank">
                                    <svg class="icon" aria-hidden="true">
                                        <use xlink:href="#csdnc-blogexpert"></use>
                                    </svg>
                                    博客专家
                                </a>
                            </span>
                                            </div>
                    <div class="text"><span>发布了111 篇原创文章</span> · <span>获赞 156</span> · <span>访问量 36万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://bbs.csdn.net/forums/p-u011179993" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-messageboard">他的留言板
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>
    </article>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值