欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

log4j2不会丢 劳务派遣管理系统 失日志事件

点击: 次  来源:宝鼎软件 时间:2017-07-17

原文出处: 高广超

这是在公司内部的一次进级实践,删除了许多隐私的内容,所以大概不是很完整。

1、配景

在任何系统中,日志都长短常重要的构成部门,它是反应系统运行环境的重要依据,也是排盘查题时的须要线索。绝大大都人都承认日志的重要性,可是又有几多人仔细想过该怎么打日志,日志对机能的影响毕竟有多大呢?

新的Log4j 2.0版本有了大幅的机能晋升、新的插件系统,以及设置配置方面的许多改进。Log4j 1.x 在高并发环境下呈现死锁导致cpu利用率异常飙升,而Log4j2.0基于LMAX Disruptor的异步日志在多线程情况下机能会远远优于Log4j 1.x和logback ——官方测试功效。

本次进级是以thrift处事化项目为例子举办的,后续会在其他项目中举办,本次事情内容为:Log4j1.x 进级到 Log4j2(假如不想相识道理,可以直接跳到:3、进级方法)

2、log4j2说明

2.1 特性

  • API疏散: Log4j2将API与实现分分开来(log4j-api: 作为日志接口层,用于统一底层日志系统,log4j-core : 作为上述日志接口的实现,软件开发,是一个实际的日志框架)
  • 改造的特定: Log4j2的机能在某些要害规模比Log4j 1.x更快,并且大大都环境下与Logback相当。
  • 多个API支持:Log4j2提供最棒的机能的同时,还支持SLF4J和民众日志记录API。
  • 自动设置加载:像Logback一样,一旦设置产生改变,Log4j2可以自动载入这些变动后的设置信息,又与Logback差异,设置产生改变时不会丢失任何日志事件。
  • 高级过滤成果:与Logback雷同,Log4j2可以支持基于上下文数据、标志,正则表达式以及日志事件中的其他组件的过滤。
  • 插件架构:所有可以设置的组件都以Log4j插件的形式来界说。无需修改任何Log4j代码就可以建设新的Appender、Layout、Pattern Convert 等等。Log4j自动识别预界说的插件,假如在设置中引用到这些插件,Log4j就自动载入利用。
  • 属性支持:属性可以在设置文件中引用,也可以直接替代或传入潜在的组件,属性在这些组件中可以或许动态理会。属性可以是设置文件,系统属性,情况变量,线程上下文映射以及事件中的数据中界说的值。用户可以通过增加本身的Lookup插件来定制本身的属性。
  • log4j2设置: 不支持properties文件,但却可以以json文件作为设置
  • 2.2 机能

    吞吐量测试

    log4j2不会丢 劳务调派打点系统 失日志事件

    平均耗时

    log4j2不会丢 劳务调派打点系统 失日志事件

    个中:

  • Loggers mixed sync/async: 同步与异步logger可以殽杂利用,别离由标签<logger> <asyncLogger> 指定
  • 异步Logger与异步Appender区别:AsyncAppender利用ArrayBlockingQueue来处理惩罚message,AsyncLogger利用LMAX Disruptor
  • AsyncAppender的做法是:应用线程建设LogEvent将其塞入Queue,消费线程取出LogEvent写磁盘。在这种框架的可扩展性欠好,当更加消费线程时各个线程的吞吐量会减半,所以总吞吐量并不会获得增加。原因是,并发queue是尺度java库的一部门,会利用锁来担保数据通报的正确性。
  • LMAX Disruptor是一个无锁数据布局,可以在线程间通报动静。具体先容可会见其网站:https://github.com/LMAX-Exchange/disruptor/wiki/Introduction
  • 更多机能测试信息可参考官方陈诉:

    http://logging.apache.org/log4j/2.x/manual/async.html#Performance

    http://logging.apache.org/log4j/2.x/performance.html

    2.3 主要组件

    log4j2不会丢 劳务调派打点系统 失日志事件

    2.4 设置

    Configuration

    示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
    
        <Properties>
            <Property name="pattern_layout">%d %-5p (%F:%L) - %m%n</Property>
            <Property name="LOG_HOME">/var/***/logs</Property>
        </Properties>
    
        <Appenders>
            <Console name="console" target="SYSTEM_OUT" follow="true">
                <PatternLayout pattern="${pattern_layout}"/>
            </Console>
    
            <RollingRandomAccessFile name="file"
                                     fileName="${LOG_HOME}/${sys:app.key}.log"
                                     filePattern="${LOG_HOME}/${sys:app.key}.log.%d{yyyy-MM-dd}">
                <PatternLayout pattern="${pattern_layout}"/>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                </Policies>
            </RollingRandomAccessFile>
    
            <RollingRandomAccessFile name="access_kpi"
                                     fileName="${LOG_HOME}/${sys:app.key}_access_kpi.log"
                                     filePattern="${LOG_HOME}/${sys:app.key}_access_kpi.log.%d{yyyy-MM-dd}">
                <PatternLayout pattern="${pattern_layout}"/>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                </Policies>
            </RollingRandomAccessFile>
    
    
            <RollingRandomAccessFile name="jmonitorappender"
                                     fileName="${LOG_HOME}/${sys:app.key}.jmonitor.log"
                                     filePattern="${LOG_HOME}/${sys:app.key}.jmonitor.%d{yyyy-MM-dd}.log.gz">
                <PatternLayout pattern="${pattern_layout}"/>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                </Policies>
            </RollingRandomAccessFile>
    
            <RollingRandomAccessFile name="jmonitorlogstoreappender"
                                     fileName="${LOG_HOME}/${sys:app.key}.jmonitor.logstore.log"
                                     filePattern="${LOG_HOME}/${sys:app.key}.jmonitor.logstore.%d{yyyy-MM-dd}.log.gz">
                <PatternLayout pattern="${pattern_layout}"/>
                <Policies>
                    <TimeBasedTriggeringPolicy/>
                </Policies>
            </RollingRandomAccessFile>
    
            <Scribe name="errorLog">
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
                <Property name="hostname">${sys:app.key}</Property>
                <Property name="scribeHost">127.0.0.1</Property>
                <Property name="scribePort">4252</Property>
                <Property name="scribeCategory">cos_errorlog</Property>
                <Property name="printExceptionStack">false</Property>
                <Property name="addStackTraceToMessage">false</Property>
                <Property name="timeToWaitBeforeRetry">6000</Property>
                <Property name="sizeOfInMemoryStoreForward">100</Property>
                <PatternLayout
                        pattern="%d %p $${sys:app.host} $${sys:app.ip} errorlog appkey=$${sys:app.key} location=%F:%L rawlog=%replace{%replace{%m}{=}{:}}{\n|\t}{<br/>} rawexception=%replace{%replace{%ex}{=}{:}}{\n|\t}{<br/>}%n"/>
            </Scribe>
    
    
        </Appenders>
    
        <Loggers>
    
    
            <Logger name="access_kpi" level="INFO" includeLocation="true" additivity="false">
                <AppenderRef ref="access_kpi"/>
            </Logger>
    
    
    
            <!-- tair Loggers -->
            <Logger name="com.taobao.tair3.client"  level="WARN" includeLocation="true" additivity="false">
                <AppenderRef ref="file"/>
                <AppenderRef ref="errorLog"/>
            </Logger>
    
            <!-- 3rdparty Loggers -->
            <Logger name="org.springframework" level="WARN"/>
            <Logger name="org.apache.zookeeper" level="ERROR"/>
            <Logger name="org.springframework.web" level="WARN"/>
    
            <!-- Root Logger -->
            <Root level="INFO" includeLocation="true">
                <AppenderRef ref="file"/>
                <AppenderRef ref="console"/>
                <AppenderRef ref="errorLog"/>
            </Root>
        </Loggers>
    </Configuration>