logging总结 - log4j2使用流程[归档存储]

  • 第一步:添加log4j-api、log4j-core的支持
<log4j2.version>2.7</log4j2.version>
<!-- configure logging -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>${log4j2.version}</version>
</dependency>
  • 第二步:在resources目录下添加log4j2.xml,打包后,会自动复制到classpath下
<?xml version="1.0" encoding="UTF-8"?>
<!--status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出
monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。 -->
<configuration status="WARN" monitorInterval="600">

    <properties>
        <!-- 配置日志文件输出目录 -->
        <property name="LOG_HOME">D:/logs</property>
        <property name="APPLICATION_FILE_NAME">application</property>
        <property name="ERROR_FILE_NAME">error</property>
    </properties>

    <Appenders>
        <!-- 配置日志文件输出目录 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 输出日志的格式 -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n"/>
        </Console>

        <!--fileName  指定当前日志文件的位置和文件名称   filePattern  指定当发生Rolling时,文件的转移和重命名规则-->
        <RollingRandomAccessFile name="APPLICATION-APPENDER"
                                 fileName="${LOG_HOME}/${APPLICATION_FILE_NAME}.log"
                                 filePattern="${LOG_HOME}/${APPLICATION_FILE_NAME}.%d{yyyy-MM-dd}-%i.log">
            <PatternLayout charset="UTF-8"
                           pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n"/>
            <Policies>
                <!--和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd
                HH-mm}-%i,最小的时间粒度是mm,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd
                HH},最小粒度为小时,则每一个小时生成一个文件。modulate:Indicates whether the interval should be adjusted to cause the next rollover to
                occur on the interval boundary.-->
                <TimeBasedTriggeringPolicy interval="1" />
                <!--指定当文件体积大于size指定的值时,触发Rolling-->
                <SizeBasedTriggeringPolicy size="200 MB"/>
            </Policies>
            <!--指定最多保存的文件数  (指-%i 一个间隔最多文件数)-->
            <!--<DefaultRolloverStrategy max="20"/>-->
        </RollingRandomAccessFile>

        <!--fileName  指定当前日志文件的位置和文件名称   filePattern  指定当发生Rolling时,文件的转移和重命名规则-->
        <RollingRandomAccessFile name="ERROR-APPENDER"
                                 fileName="${LOG_HOME}/${ERROR_FILE_NAME}.log"
                                 filePattern="${LOG_HOME}/${ERROR_FILE_NAME}.%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8"
                           pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n"/>
            <Policies>
                <!--和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd
                HH-mm}-%i,最小的时间粒度是mm,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd
                HH},最小粒度为小时,则每一个小时生成一个文件。modulate:Indicates whether the interval should be adjusted to cause the next rollover to
                occur on the interval boundary.-->
                <TimeBasedTriggeringPolicy interval="1" />
                <!--指定当文件体积大于size指定的值时,触发Rolling-->
                <SizeBasedTriggeringPolicy size="200 MB"/>
            </Policies>
            <!--指定最多保存的文件数  (指-%i 一个间隔最多文件数)-->
            <!--<DefaultRolloverStrategy max="20"/>-->
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
        <!--additivity="false"表示在该logger中输出的日志不会再延伸到父层logger additivity="false"表示在该logger中输出的日志不会再延伸到父层logger
        日志级别从低到高分为TRACE < DEBUG  < INFO  < WARN  < ERROR  < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。-->
        <!-- 系统全日志 -->
        <Logger name="com.zhaogang" level="DEBUG" additivity="true">
            <AppenderRef ref="APPLICATION-APPENDER"/>
            <AppenderRef ref="ERROR-APPENDER"/>
        </Logger>

        <Root level="DEBUG">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</configuration>
  • 第三步:使用
private static Logger logger = LogManager.getLogger("当前类名即可");
  logger.info("trace-debug-info-warn-error-fatal");

注意:

<web-app> 2.5 以前要多个依赖 log4j-web,还需要在web.xml配置listener、filter

 Log4j2 不支持 Servlet 2.5以前的WEB应用。

(Servlet 2.5 意思是 web.xml 文件中的 <web-app>  的 version属性值是 2.5 。)

解决方案:升级web-app至3.0  

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

spring默认使用commons logging打日志,会被activiti的桥接工具把日志输入重定向到slf4j

<!-- 桥接:告诉Slf4j使用Log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>${log4j2.version}</version>
</dependency>

总结:

1.添加log4j-api、log4j-core的支持

2.在resources目录下添加log4j2.xml,打包后,会自动复制到classpath下

3.private static Logger logger = LogManager.getLogger("exception");

  logger.info("trace-debug-info-warn-error-fatal");

Log4j 2 包含了基于LMAX 分离库的下一代的异步日志系统,在多线程环境下,异步日志系统比 Log4j 1.x 和Logback 提高了10倍性能提升(吞吐量和延迟率 )

目前的日志框架有jdk自带的logging,log4j1、log4j2、logback

目前用于实现日志统一的框架apache的commons-logging、slf4j

SLF4J(Simple Logging Facade for Java简单日志门面):

不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在

部署其应用时使用其所希望的日志系统。 提供的核心API是一些接口以及一个LoggerFactory的工厂类。

log4j(log for java):

Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

Logback:

log4j创始人设计的又一个开源日志组件。当前分成三个模块:

①logback-core(基础模块),

②logback- classic(log4j的一个 改良版本)

③logback-access(logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。)

log4j2:

与log4j1发生了很大的变化,不兼容。log4j1仅仅作为一个实际的日志框架,slf4j、commons-logging作为门面,统一各种日志框架的混乱格局,现在log4j2也想跳出来充当门面了,也想统一大家了。哎,日志格局越来越混乱了。

log4j-api: 作为日志接口层,用于统一底层日志系统

log4j-core : 作为上述日志接口的实现,是一个实际的日志框架

slf4j、jcl、jul、log4j1、log4j2、logback大总结

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏公众号_薛勤的博客

SpringBoot热部署的实现方式

一般情况下直接在pom.xml文件添加下面的依赖即可,但eclipse和IDEA有时也会造成影响。

10830
来自专栏信安之路

CVE2018-1111 漏洞复现

近日,红帽官方发布了安全更新,修复了编号为 CVE-2018-1111 的远程代码执行漏洞,攻击者可以通过伪造 DHCP 服务器发送响应包,攻击红帽系统,获取 ...

17200
来自专栏Java技术分享

集群分片

 由于复制中,每个数据库都是拥有完整的数据,因此复制的总数据存储量受限于内存最小的数据库节点,如果数据量过大,复制就无能为力了。

24590
来自专栏木头编程 - moTzxx

CentOS6.5 Nginx无法解析php文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

55230
来自专栏cloudskyme

WSO2 ESB(1)

什么是WSO2 ESB? WSO2 ESB是一个轻量级的易于使用的企业服务资源总线。WSO2 ESB允许系统管理员和SOA架构师,消息路由,虚拟化,中介,转换,...

42740
来自专栏乐沙弥的世界

Linux 7下安装Python 3.6

版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。

17910
来自专栏决胜机器学习

Redis专题(六)——Redis高可用(复制篇)

Redis专题(六) ——Redis高可用(复制篇) (原创内容,转载请注明来源,谢谢) 一、单台服务器 单台redis服务器,会出现单点故障,且需要承受所...

36560
来自专栏Java技术分享

集群分片

复制的问题  由于复制中,每个数据库都是拥有完整的数据,因此复制的总数据存储量受限于内存最小的数据库节点,如果数据量过大,复制就无能为力了。 分片 分片(Pat...

22280
来自专栏散尽浮华

Gitlab利用Webhook实现Push代码后的jenkins自动构建

之前部署了Gitlab的代码托管平台和Jenkins的代码发布平台。通常是开发后的代码先推到Gitlab上管理,然后在Jenkins里通过脚本构建代码发布。这种...

41070
来自专栏云计算教程系列

你的nginx访问过慢?增加个模块吧!

ngx_pagespeed 是nginx web服务器的一个模块,通过安装它你的网站加载速度将会“嗖”的一下上升。

1K30

扫码关注云+社区

领取腾讯云代金券