log日志规范,区别

来源:互联网 发布:网店刷销量软件 编辑:程序博客网 时间:2024/06/09 20:29

日志的级别

level:日志的级别,常用的DEBUG , INFO ,WARN ,ERROR四种.

DEBUG:
这个级别的信息,可以随意的使用,任何觉得有利于在调试时更详细的了解系统运行的状态.

INFO:
这个级别的信息用来反馈系统的当前状态给最终用户的,应该对最终用户具有实际意义,也就是最终用户要能够看得明白.

WRAN:
这个级别的信息应该是进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。(例如容量问题)

ERROR:
这个级别的信息应该是无法正常运行,或者错误的运行急需修正的一些问题.


日志的常用配置

配置log输出的目的地
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
配置log的信息格式:
org.apache.log4j.HTMLLayout(HTML表格形式)
org.apache.log4j.TTCCLayout(日志的格式包括日志产生的时间、线程、类别等等信息)
org.apache.log4j.PatternLayout(灵活地自定义日志格式)

附例:
log4j.rootLogger=info,A1,app//指定根Logger,及日志输出级别,大于等于该级别的日志将被输出,设为OFF可以关闭日志
log4j.appender.A1=org.apache.log4j.ConsoleAppender//日志输出到控制台
log4j.appender.A1.layout=org.apache.log4j.PatternLayout//输出格式
log4j.appender.A1.layout.ConversionPattern=%d %X{uuid} %X{sessionid}%p [%c] - %m%n

log4j.appender.app=org.apache.log4j.DailyRollingFileAppender//按日输出
log4j.appender.app.Encoding=UTF-8//编码
log4j.appender.app.File=/data/tomcat_logs/app.log//输出文件地址
log4j.appender.app.DatePattern=’.’yyyy-MM-dd//文件格式
log4j.appender.app.layout=net.logstash.log4j.JSONEventLayoutV1//json格式输出

java中常用的日志框架

简介

在系统开发中,日志是很重要的一个环节,日志写得好对于我们开发调试,线上问题追踪等都有很大的帮助。但记日志并不是简单的输出信息,需要考虑很多问题,比如日志输出的速度,日志输出对于系统内存,CPU的影响等,为此,出现了很多日志框架,以帮助开发者解决这些问题。

java中的常用日志框架

比较常用的有Log4j,SLF4j,Commons-logging

Commons-loggin:
是apache最早提供的日志的门面接口。它的主要作用是提供一个日志门面,使用者可以使用不同的日志实现。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。common-logging内部有一个Simple logger的简单实现,但是功能很弱。
SLF4j:
是Simple Logging Facade for Java的简称,即java的简单日志门面。类似于Apache Common-Logging,是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。

Log4j:
经典的一种日志解决方案。内部把日志系统抽象封装成Logger 、appender 、pattern等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。pache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码。
各个框架之间的关系
1. commons-logging和slf4j是java中的日志门面,即它们提供了一套通用的接口,具体的实现可以由开发者自由选择。log4j则是具体的日志实现方案。
2. 它们可以理解为接口与实现类的关系
3. 三个框架都可以在程序中使用,但是为了考虑扩展性,一般我们在程序开发的时候,会选择使用commons-logging或者slf4j这些日志门面,而不是直接使用log4j或者logback这些实现。即我们写代码的时候导入的类一般都是来自门面框架中的类,然后将某个日志的实现框架加入到项目中,提供真正的日志输出功能。
4. 比较常用的搭配是slf4j+log4j

如图:
结构图

使用举例:
在开发中,我们一般不会直接使用某个具体的日志框架(比如log4j),而是使用commons-logging和slf4j,这样做的好处是,我们可以自由选择日志实现。

基于slf4j的日志使用

import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class TestCase {    Logger log = LoggerFactory.getLogger(getClass());    @Test    public void test() {        try {            String str = null;            log.info("zhangsan{}", "love");            str.length();        } catch (Exception e) {            e.printStackTrace();            log.error("error", e);        }    }}

基于commons-logging的日志使用

import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class XXXService {    private static final Log log = LogFactory.getLog(getClass());    public void doSomething(){        log.info("begin dosomething....");    }}

Commons-logging和SLF4j实现机制
使用门面模式,如果门面模式本身不提供日志实现,那么我们还是不能正确打印日志的。所以还需要通过门面模式能够找到其实现类。就跟接口与实现类一样。
那么,日志的门面框架是如何与实现框架建立关系的呢?

Commons-logging

common-logging通过动态查找的机制,在程序运行时自动找出真正使用的日志库。由于它使用了ClassLoader寻找和载入底层的日志库,导致了象OSGI这样的框架无法正常工作,因为OSGI的不同的插件使用自己的ClassLoader。OSGI的这种机制保证了插件互相独立,然而却使Apache Commons-Logging无法工作。

SLF4j

slf4j在编译时静态绑定真正的Log库,因此可以再OSGI中使用。它是通过查找类路径下org.slf4j.impl.StaticLoggerBinder,然后绑定工作都在这类里面进行,如果发现类路径下有多个StaticLoggerBinder,会给出警告。

总结以上: 使用SLF4J+log4j能更效率的实现.
带来下这几方面的好处:
1、更好的可读性;
2、不需要使用logger.isDebugEnabled()来解决日志因为字符拼接产生的性能问题。比如:logger.debug(“Processing trade with id: {} and symbol : {} “, id, symbol);

Log4j打印异常堆栈信息

在Java中,通常情况下,需要将异常堆栈信息输出到日志中,这样便于纠错及修正Bug.

当出现异常时,调用e.printStackTrace();其实相当于什么都没做,同时也不会把异常信息输出到日志文件中
使用log.error(e.getMessage());只能够输出异常信息,但是并不包括异常堆栈,所以无法追踪出错的源点
使用log.error(e);除了输出异常信息外,还能输出异常类型,但是同样不包括异常堆栈,该方法doc说明为:Logs a message object with the ERROR level.显然并不会记录异常堆栈信息
当然也可以自己手动写个工具类,来挨个输出e.getStackTrace();获得的堆栈信息,显然繁琐麻烦
其实在log4j中只需要这样调用,就可以获得异常及堆栈信息log.error(Object var1, Throwable var2);,该方法doc说明为:Logs a message at the ERROR level including the stack trace of the Throwable t passed as parameter.

2 0
原创粉丝点击