文档章节

java日志组件总结

bowen_wjl
 bowen_wjl
发布于 2015/01/07 16:26
字数 1708
阅读 49
收藏 0

java日志组件总结

一、常用日志组件关系图

从上图中,我们可以看到 4 部分。
接口:将所有日志实现适配到了一起,用统一的接口调用。
实现:目前主流的日志实现
旧日志到 slf4j 的适配器:如果使用了 slf4j ,但是只想用一种实现,想把 log4j 的日志体系也从 logback 输出,这个是很有用的。
slf4j 到实现的适配器:如果想制定 slf4j 的具体实现,需要这些包。

二、slf4J与旧日志框架的关系
slf4j 等于commons-logging,是各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决定具体的日志实现库。
logback-classic(默认的 logback实现 )
slf4j-jcl.jar(apache commons logging)
slf4j-logj12.jar(log4j 1.2.4)
slf4j-jdk14(java.util.logging)
将所有使用旧式日志 API 的第三方类库或旧代码的日志调用转到 slfj
jcl-over-slf4j.jar/jcl104-over-slf4japache commons logging 1.1.1/1.0.4,直接替换即可。
log4j-over-slf4j.jarlog4j,直接替换即可。
jul-to-slf4jjdk logging,需要在程序开始时调用 SLF4JBridgeHandler.install()来注册 listener参考 JulOverSlf4jProcessor,可在 applicationContext.xml中定义该 bean来实现初始化。注意原有的 log4j.properites将失效, logback网站上提供转换器,支持从 log4j.properties 转换到 logback.xml 

三、优势:转移到logback的理由
    slf4j支持参数化的 logger.error("帐号 ID{}不存在 ", userId);告别了 if(logger.isDebugEnable()) 时代。
    另外 logback的整体性能比 log4j也较佳, hibernate等项目已经采用了 slf4j:"某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在 LOGBack中需要 3纳秒,而在 Log4J中则需要 30纳秒。  LOGBack创建记录器( logger)的速度也更快: 13毫秒,而在 Log4J中需要 23毫秒。更重要的是,它获取已存在的记录器只需 94纳秒,而  Log4J需要 2234纳秒,时间减少到了 1/23"

slf4j logback的使用
1.如果日志的参数超过 3个,需要写成
Object[] params = {newVal, below, above}; logger.debug("Value {} was inserted between {} and {}.", params);
commons-logging slf4j的代码比较: commons-logging 示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
  
public class TestLog {
    Log log = LogFactory.getLog(TestLog.class);
  
    public void print() {
        if (log.isDebugEnabled()) {
            log.debug(sql);
            log.debug("My name is " + name + ", I am " + age + " years old.");
        }
    }
}


slf4j的示例代码:

1
2
3
4
5
6
7
8
9
10
11
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
  
public class TestLogBySlf4J {
    Logger logger = LoggerFactory.getLogger(TestLogBySlf4J.class);
  
    public void print() {
        logger.debug(sql);
        logger.debug("My name is {}, I am {} years old.", name, age);
    }
}

2.因为内部已优化,作者认为 slf4jlogger不需要定义为 static
3.可设置缓存后批量写日志文件 (但服务器如果重启,可能会丢失未写到磁盘的记录 )
4.MDC,用 Filter,将当前用户名等业务信息放入 MDC中,在日志 format定义中即可使用该变量。
5.JMS Appender用于告警 , DB Appender用于业务日志等

 

四、相关配置

日志配置参数说明

%m

输出代码中指定的消息

%p

输出优先级,即DEBUGINFOWARNERRORFATAL

%r

输出自应用启动到输出该log信息耗费的毫秒数

%c

输出所属的类目,通常就是所在类的全名

%t

输出产生该日志事件的线程名

%n

输出一个回车换行符,Windows平台为“\r\n”Unix平台为“\n”

%d

输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20021018 221028921

%l

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

 

以下是一个完整的log4j.properties

1
2
3
4
5
6
7
8
9
10
log4j.rootCategory=error, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p : %c(%L) -> %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=/home/httpd/html/gameStatistics/log/stats.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d %p : %c(%L) -> %m%n
log4j.logger.org.apache.commons=error
log4j.logger.com.danga.MemCached.MemCachedClient=ERROR

其中 R ,代表 RollingFileAppender ,指定文件大小到达指定尺寸的时候产生一个新的日志文件, R.File 配置了文件路径和名称, R.layout 使日志以指定布局模式输出,
R.layout.ConversionPattern 采用类似 C 语言中的 printf 函数的打印格式格式化日志信息;
log4j.logger.com.danga.MemCached.MemCachedClient=ERROR ,指单独设置 memcached 日志级别
在工程的 src 根目录下创建 logback.xml 文件 ( 名字是固定的,转载过程自动完成,不需要手动控制 )
这里 logback 有一个专门用来读取 logback.xml 的机制, logback 框架初始化时,会调用类文件来读取 logback.xml 文件,若是没有找到,则调用默认设备文件,按照默认设备文件进行设备。
以下是一个完整的 logback.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <!--定义时间戳-->
   <timestamp key="byDay" datePattern="yyyy-MM-dd"/>
   <!--定义指定文件名称的输出-->
   <appender name="RootFileAppender" class="ch.qos.logback.core.FileAppender">
      <!--此处设定的文件名称是动态设置的  即每天生成一个文件用于记录当天的文件信息-->
      <file>/home/httpd/html/gameStatistics/log/stats-${byDay}.log</file>
      <append>true</append>
       
      <layout class="ch.qos.logback.classic.PatternLayout">
         <pattern>%d{yyyy-MM-dd HH:mm:ss}, %p, %c, %t, %F, %L, %C{1}, %M %m%n</pattern>
      </layout>
       
      <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
         <level>debug</level>
       </filter>
       <!--过滤器指定该类的日志级别-->
   </appender>
    
   <!--定义控制台输出-->
   <appender name="RootConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
      <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
         <level>debug</level>
      </filter>
       
      <layout class="ch.qos.logback.classic.PatternLayout">
         <pattern>%d{yyyy-MM-dd HH:mm:ss}, %p, %c, %t, %F, %L, %C{1}, %M %m%n</pattern>
       </layout>
   </appender>
    
   <!-- 设置根 的日志级别,根元素是配置文件的入口-->
   <root>
      <level value="error"/>
       <appender-ref ref="RootFileAppender"/> <!-- 配置对RootFileAppender的引用-->
      <appender-ref ref="RootConsoleAppender"/> <!-- 配置对RootConsoleAppender的引用-->
   </root>
</configuration>


log4j.xml


2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
   
<log4j:configuration xmlns:log4j=' http://jakarta.apache.org/log4j/' >
   
    <appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern"  
                  value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" />
        </layout>
        <!--过滤器设置输出的级别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="levelMin" value="debug" />
            <param name="levelMax" value="warn" />
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>
 
    <appender name="myFile" class="org.apache.log4j.RollingFileAppender">  
        <param name="File" value="D:/output.log" /><!-- 设置日志输出文件名 -->
        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
        <param name="Append" value="true" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
        </layout>
    </appender>
  
    <appender name="activexAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="E:/activex.log" /> 
        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> 
        <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" 
            value="[%d{MMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" />
        </layout> 
    </appender>
   
    <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->
    <logger name="com.runway.bssp.activeXdemo" additivity="false">
        <priority value ="info"/> 
        <appender-ref ref="activexAppender" /> 
    </logger>
 
    <!-- 根logger的设置-->
    <root>
        <priority value ="debug"/>
        <appender-ref ref="myConsole"/>
        <appender-ref ref="myFile"/>
    </root>
</log4j:configuration>

© 著作权归作者所有

共有 人打赏支持
bowen_wjl
粉丝 3
博文 6
码字总数 3587
作品 0
南京
私信 提问
阿里年薪50WJAVA工程师转大数据学习路线!

大数据有两个方向,一个是偏计算机的,另一个是偏经济的。你学过Java,所以你可以偏将计算机的。 Java程序员想转大数据可行吗?Java是全世界使用人数最多的编程语言。不少程序员选择Java做为...

JAVA丶学习
2018/04/25
0
0
Java程序员最常用的8个Java日志框架

作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用、WEB应用以及移动应用。然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位b...

紫魅编程
2016/04/23
2.8K
1
Hibernate框架(一)——总体介绍

作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷。利用Hibernate框架我们就可以不再编写重复的JDBC代...

凡尘里的一根葱
2015/11/10
0
0
Tomcat的组件及配置文件(一)

tomcat的组件: tomcat运行在JVM中,运行在JVM中之后,它会启动一个JVM实例,这个JVM实例称之为叫做tomcat server; 一个server就是运行在JVM中的一个实例,这个实例内部跑的是tomcat; conn...

长得丑死了
2018/06/21
0
0
Apache java项目全介绍

Jakarta项目是ASF(The Apache Software Foundation)的一部分。 ASF是一个非赢利组织,她鼓励基于开放的软件许可下进行合作、注重实效的开发,并提供各个领域的高质量软件,她涉及到 Http服务...

Sephiroth
2010/04/05
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
2
0
微信网页授权获取用户信息(ThinkPHP5)+ 微信发送客服消息(一)

以thinkphp5为实例,创建控制器 class Kf extends Controller { /** * [protected description]微信公众号appid * @var [type] */ protected $appid = "xxxxxxxxxxxxxxx"; /** * [protected......

半缘修道半缘君丶
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部