log4j2的高并发死锁问题配置优化方式

目录
  • log4j2高并发死锁问题配置优化
    • Maven中pom.xml引用
    • 配置如下
  • log4j2.x简单使用文档
    • 1.项目中引入两个jar包
    • 2.指定日志配置文件位置
    • 3.简单的配置文件
    • 4.获取Logger对象后即可写日志了

log4j2高并发死锁问题配置优化

Maven中pom.xml引用

<log4j2.version>2.7</log4j2.version>

版本以上

<!-- log4j2 高并发造成死锁 -->
  <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-web</artifactId>
   <version>${log4j2.version}</version>
  </dependency>
  <dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-slf4j-impl</artifactId>
   <version>${log4j2.version}</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/com.lmax/disruptor -->
  <dependency>
   <groupId>com.lmax</groupId>
   <artifactId>disruptor</artifactId>
   <version>3.3.6</version>
  </dependency>

配置如下

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
 <configuration status="WARN" monitorInterval="30">
     <!--先定义所有的appender-->
     <appenders>
     <!--这个输出控制台的配置-->
       <!--   <console name="Console" target="SYSTEM_OUT">
         输出日志的格式
             <PatternLayout charset="GBK" pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
         </console> -->
     <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
    <!--  <File name="log" fileName="log/test.log" append="false">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
     </File> -->
     <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
          <!-- ${sys:user.home} 当前用户目录,但创建文件夹没权限失败的情况 -->
          <RollingRandomAccessFile  name="RollingRandomAccessFile-RcsDataSys-Debug" fileName="/logs/RcsDataSys/RcsDataSys-debug.log"
                      filePattern="/logs/RcsDataSys/$${date:yyyy-MM}/RcsDataSys-debug-%d{yyyy-MM-dd}-%i.log" immediateFlush="true" Append="true">
             <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->     

              <Filters>
               <!-- 禁止error日志进入 纯的info日志-->
              <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
              <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
             </Filters>
             <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="50 MB"/>
             </Policies>
             <DefaultRolloverStrategy max="15">
                <Delete basePath="/logs/RcsDataSys" maxDepth="2">
                  <IfFileName glob="*/RcsDataSys-debug*.log" />
                  <IfLastModified age="3d" />
                </Delete>
            </DefaultRolloverStrategy>
         </RollingRandomAccessFile >
         <RollingRandomAccessFile  name="RollingRandomAccessFile-RcsDataSys-Info" fileName="/logs/RcsDataSys/RcsDataSys-info.log"
                      filePattern="/logs/RcsDataSys/$${date:yyyy-MM}/RcsDataSys-info-%d{yyyy-MM-dd}-%i.log" immediateFlush="true" >
             <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
              <Filters>
               <!-- 禁止error日志进入 纯的info日志-->
              <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
              <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
             </Filters>
             <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
             <DefaultRolloverStrategy max="3">
                <Delete basePath="/logs/RcsDataSys" maxDepth="2">
                  <IfFileName glob="*/RcsDataSys-info*.log" />
                  <IfLastModified age="7d" />
                </Delete>
            </DefaultRolloverStrategy>
         </RollingRandomAccessFile >
         <RollingRandomAccessFile  name="RollingRandomAccessFile-RcsDataSys-Warn" fileName="/logs/RcsDataSys/RcsDataSys-warn.log"
                      filePattern="/logs/RcsDataSys/$${date:yyyy-MM}/RcsDataSys-warn-%d{yyyy-MM-dd}-%i.log" immediateFlush="true">
             <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
             <DefaultRolloverStrategy max="2"/>
         </RollingRandomAccessFile >
         <RollingRandomAccessFile  name="RollingRandomAccessFile-RcsDataSys-Error" fileName="/logs/RcsDataSys/RcsDataSys-error.log"
                      filePattern="/logs/RcsDataSys/$${date:yyyy-MM}/RcsDataSys-error-%d{yyyy-MM-dd}-%i.log" immediateFlush="true">
             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="50 MB"/>
             </Policies>
              <DefaultRolloverStrategy max="3">
                <Delete basePath="/logs/RcsDataSys" maxDepth="2">
                  <IfFileName glob="*/RcsDataSys-error*.log" />
                  <IfLastModified age="3d" />
                </Delete>
            </DefaultRolloverStrategy>
         </RollingRandomAccessFile >
     </appenders>
     <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
     <loggers>
         <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
         <logger name="org.springframework" level="INFO"></logger>
         <logger name="org.mybatis" level="INFO"></logger>
         <logger name="org.apache.ibatis" level="INFO"></logger>
         <logger name="org.apache.ibatis.logging.jdbc.BaseJdbcLogger" additivity="false"></logger>
        <asyncRoot level="DEBUG" includeLocation="true">
             <appender-ref ref="RollingRandomAccessFile-RcsDataSys-Debug"/>
          <appender-ref ref="RollingRandomAccessFile-RcsDataSys-Info"/>
          <appender-ref ref="RollingRandomAccessFile-RcsDataSys-Error"/>
     </asyncRoot>
       <logger name="druid.sql.Statement" level="info" additivity="false">
        </logger>
        <logger name="druid.sql.ResultSet" level="info" additivity="false">
        </logger>
        <logger name="com.alibaba.druid" level="info" additivity="false">
        </logger>
        <logger name="org.quartz" level="info" additivity="false">
        </logger>

     </loggers>
</configuration>

log4j2.x简单使用文档

简单总结log4j2.x的使用过程。

1.项目中引入两个jar包

  • log4j-core-2.0-beta9.jar
  • log4j-api-2.0-beta9.jar

2.指定日志配置文件位置

//指定日志的配置器文件
    static{
        System.setProperty("log4j.configurationFile", "./log4j2.xml");
    } 

3.简单的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </RollingFile>
    </appenders>
    <loggers>
        <logger name="com.klaus.tcp.synchronous.TcpSocketN" level="debug" additivity="false">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFile"/>
        </logger>
        <root level="error">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFile"/>
        </root>
    </loggers>
</configuration>

4.获取Logger对象后即可写日志了

log = LogManager.getLogger(TcpSocketN.class.getName());
log.error(e.getMessage());

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 关于Spring Boot项目的 log4j2 核弹漏洞问题(一行代码配置搞定)

    看到群里还有小伙伴说公司里还特别建了800+人的群在处理... 好在很快就有了缓解措施和解决方案.同时,log4j2官方也是速度影响发布了最新的修复版本.各应用方也可以执行较为稳定的修复方案了. 不过我看到群里发出来的各种修复方法,还真是不好看...所以这里也提一下Spring Boot用户怎么修复最简单吧. 最简修复方式 有些小伙伴其实想到了直接通过Spring Boot的Starter去解决,所以还给Spring Boot提了Issue,希望spring-boot-starter-log4j

  • Spring Boot Log4j2的配置使用详解

    后台程序开发及上线时,一般都会用到Log信息打印及Log日志记录,开发时通过Log信息打印可以快速的定位问题所在,帮助我们快捷开发.程序上线后如遇到Bug或错误,此时则需要日志记录来查找发现问题所在. Spring Boot 可以集成很多不同的日志系统,其中最常用的Apache Log4j,而Log4j 2是Log4j的升级版本,Log4j 2相对于Log4j 1.x 有了很多显著的改善.所以这篇博客就直接来说说Spring Boot如何集成并配置使用Log4j2. 1. 导入Log4j2的包

  • jedispool连redis高并发卡死的问题

    java端在使用jedispool 连接redis的时候,在高并发的时候经常死锁,或报连接异常,JedisConnectionException,或者getResource 异常等各种问题 在使用jedispool 的时候一定要注意两点 1. 在获取 jedisPool和jedis的时候加上线程同步,保证不要创建过多的jedispool 和 jedis 2. 用完Jedis实例后需要返还给JedisPool 整理了一下redis工具类,通过大量测试和高并发测试的 package com.casp

  • 老生常谈Log4j和Log4j2的区别(推荐)

    相信很多程序猿朋友对log4j都很熟悉,log4j可以说是陪伴了绝大多数的朋友开启的编程.我不知道log4j之前是用什么,至少在我的生涯中,是log4j带我开启的日志时代. log4j是Apache的一个开源项目,我们不去考究它的起源时间,但是据我了解,log4j 1已经不再更新了. 回顾log4j,曾给我们留下了多少的回忆,我记得早些年,那时候mybatis还是叫ibatis的时候,我为了配置ibatis控制台打印日志,纠结了多少个夜晚,最后配置出来时的那种喜悦感.废话不多说,下面我就以列举的

  • log4j2的高并发死锁问题配置优化方式

    目录 log4j2高并发死锁问题配置优化 Maven中pom.xml引用 配置如下 log4j2.x简单使用文档 1.项目中引入两个jar包 2.指定日志配置文件位置 3.简单的配置文件 4.获取Logger对象后即可写日志了 log4j2高并发死锁问题配置优化 Maven中pom.xml引用 <log4j2.version>2.7</log4j2.version> 版本以上 <!-- log4j2 高并发造成死锁 --> <dependency> <

  • 浅谈Redis高并发缓存架构性能优化实战

    目录 场景1: 中小型公司Redis缓存架构以及线上问题实战 场景2: 大厂线上大规模商品缓存数据冷热分离实战 场景3: 基于DCL机制解决热点缓存并发重建问题实战 场景4: 突发性热点缓存重建导致系统压力暴增 场景5: 解决大规模缓存击穿导致线上数据库压力暴增 场景6: 黑客工资导致缓存穿透线上数据库宕机 场景7: 大V直播带货导致线上商品系统崩溃原因分析 场景8: Redis分布式锁解决缓存与数据库双写不一致问题实战 场景9: 大促压力暴增导致分布式锁串行争用问题优化 场景10: 利用多级缓

  • 详解nginx高并发场景下的优化

    在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里的优化主要是指对nginx的配置优化,一般来说nginx配置文件中对优化比较有作用的主要有以下几项: 1)nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数. worker_processes 8; 2)为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个

  • 高并发nginx服务器的linux内核优化配置讲解

    由于默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,是的Nginx可以拥有更高的性能: 在优化内核时,可以做的事情很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态web内容服务器.反向代理或者提供压缩服务器的服务器时,期内核参数的调整都是不同的,这里针对最通用的.使Nginx支持更多并发请求的TCP网络参数做简单的配置: 以下linux 系统内核优化配置均经在线业务系统测试,并发10万左右服务器运行

  • Windows服务器应对高并发和DDOS攻击的配置方法

    windows系统本身就有很多机制可以用来提高性能和安全,其中有不少可以用来应对高并发请求和DDOS攻击的情况. 通过以下配置可以改善windows服务器性能: 一.应对高并发请求: 1.TCP连接延迟等待时间 TcpTimedWaitDelay: 这是设定TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间.关闭和释放之间的此时间间隔通称 TIME_WAIT状态或两倍最大段生命周期(2MSL)状态.在此时间内,重新打开到客户机和服务器的连接的成本少于建立新连接.减少此条目的值允许 TC

  • 浅谈Nginx10m+高并发内核优化详解

    何为高并发 默认的Linux内核参数考虑的是最通用场景,不符合用于支持高并发访问的Web服务器,所以需要修改Linux内核参数,这样可以让Nginx拥有更高的性能: 在优化内核时,可以做的事情很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态web内容服务器.反向代理或者提供压缩服务器的服务器时,期内核参数的调整都是不同的,这里针对最通用的.使Nginx支持更多并发请求的TCP网络参数做简单的配置: 这些需要修改/etc/sysctl.conf来更改内核参数. 配置方法 配置详析

  • PHP解决高并发的优化方案实例

    我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键.举个例子,我们假设处理一个业务请求平均响应时间为100ms,同时,系统内有20台Apache的Web服务器,配置MaxClients为500个(表示Apache的最大连接数目). 那么,我们的Web系统的理论峰值QPS为(理想化的计算方式): 20*500/0.1 = 100000 (10万QPS) 咦?我们的系统似乎很强大,1秒钟可以处理完10万的

  • 浅谈Java高并发解决方案以及高负载优化方法

    目录 1.HTML静态化 2.图片服务器分离 3.数据库集群和库表散列 4.缓存 5.镜像 6.负载均衡 1)硬件四层交换 2)软件四层交换 一.高并发高负载类网站关注点之数据库 需要注意的是: 二.高并发高负载网站的系统架构之HTML静态化 网站HTML静态化解决方案 : 三.高并发高负载类网站关注点之缓存.负载均衡.存储 负载均衡/加速 存储 四.高并发高负载网站的系统架构之图片服务器分离 利用Apache实现图片服务器的分离,缘由: 环境介绍: 步骤: 五.高并发高负载网站的系统架构之数据

  • Java 处理高并发负载类优化方法案例详解

    java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slaves

  • Linux高并发踩过的坑及性能优化介绍

    目录 前言 Linux应用运行过程中出现Too many open files 问题分析和解决 Linux高并发下 time_wait 过多的问题分析及解决 Linux更多性能优化 小结 前言 Linux操作系统是现在服务器的首选操作系统,在Linux的默认系统参数下,Linux针对高并发的支持性并不是很好.小编从事Linux下应用程序开发多年,关于Linux系统下的高并发,小编自己踩过的坑,及如何解决踩过的坑下面列上几条,供大家参考,避免再次掉坑. Linux应用运行过程中出现Too many

随机推荐