歡迎訪問昆山寶鼎軟件有限公司網站! 設為首頁 | 網站地圖 | XML | RSS訂閱 | 寶鼎郵箱 | 后臺管理
?

新聞資訊

MENU

軟件開發知識

消費線程取出 勞務派遣信息管理系統 LogEvent寫磁盤

點擊: 次  來源:寶鼎軟件 時間:2017-07-28

原文出處: 高廣超

這是在公司內部的一次進級實踐,刪除了許多隱私的內容,所以大概不是很完整。

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 機能

    吞吐量測試

    消費線程取出 勞務調派信息打點系統 LogEvent寫磁盤

    平均耗時

    消費線程取出 勞務調派信息打點系統 LogEvent寫磁盤

    個中:

  • 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 主要組件

    消費線程取出 勞務調派信息打點系統 LogEvent寫磁盤

    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>
    排列三305组选前后关系 所有股票一览表 上海十一选五一定牛漏号 上海快三最新开奖日期 云南福彩十一选五开奖号码 江苏7位数预测天降财神 重庆幸运农场最近500期 黄金炒股配资 湖北快三开奖结果查询 幸运28开奖网站 甘肃11选5中奖助手