自動生成日誌配置

前言

有時我們需要去線上或測試環境創建應用進行測試,內嵌的tomcat默認是不開啓access和catalina日誌的,每次都手動配置比較麻煩,自動配置日誌腳本見附件。

使用方式

把setlog.py放到項目根路徑執行即可,非springboot項目把這一段註釋去掉:

日誌路徑和級別可自定義,默認是debug。

import os

# 配置定義
gradle_settings = "    compile group: 'org.springframework.boot', name: 'spring-boot-starter-log4j2', version: " \
                  "'2.1.2.RELEASE'\n "
access_settings = '''<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <RollingFile name="RollingFile" fileName="logs/error.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認爲最多同一文件夾下7個文件,這裏設置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>
    <loggers>
        <logger name="org.springframework.security.web" level="ERROR"/>
        <logger name="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver" level="ERROR"/>
        <logger name="org.springframework.web" level="ERROR"/>
        <Logger name="com.custom" level="INFO" additivity="false">
            <appender-ref ref="RollingFile" />
        </Logger>
        <root level="${log4j.level}">
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>'''
catalina_settings = '''<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
    <!-- 都說spring boot使用日誌需要引入這個,但是我引入了之後總是打印兩份日誌,所以我去除了,並不影響使用 -->
    <!-- <include resource="org/springframework/boot/logging/logback/base.xml"/> -->
    <!-- 控制檯設置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- INFO -->
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件路徑 ,注意LOG_PATH是默認值,
            它的配置對應application.properties裏的logging.path值-->
        <file>${LOG_PATH}/info/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 文件名稱 -->
            <fileNamePattern>info/info-%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <!-- 文件最大保存歷史數量 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- DEBUG -->
    <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件路徑 ,注意LOG_PATH是默認值,
            它的配置對應application.properties裏的logging.path值-->
        <file>${LOG_PATH}/debug/debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 文件名稱 -->
            <fileNamePattern>debug/debug-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 文件最大保存歷史數量 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- WARN -->
    <appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件路徑 ,注意LOG_PATH是默認值,
            它的配置對應application.properties裏的logging.path值-->
        <file>${LOG_PATH}/warn/warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 文件名稱 -->
            <fileNamePattern>warn/warn-%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <!-- 文件最大保存歷史數量 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- ERROR -->
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件路徑 ,注意LOG_PATH是默認值,
            它的配置對應application.properties裏的logging.path值-->
        <file>${LOG_PATH}/error/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 文件名稱 -->
            <fileNamePattern>error/error-%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <!-- 文件最大保存歷史數量 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <logger name="org.springframework" additivity="false">
        <level value="ERROR" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="errorAppender" />
    </logger>

    <!-- 由於啓動的時候,以下兩個包下打印debug級別日誌很多 ,所以調到ERROR-->
    <logger name="org.apache.tomcat.util" additivity="false">
        <level value="ERROR"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="errorAppender"/>
    </logger>

    <!-- 默認spring boot導入hibernate很多的依賴包,啓動的時候,會有hibernate相關的內容,直接去除 -->
    <logger name="org.hibernate.validator" additivity="false">
        <level value="ERROR"/>
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="errorAppender"/>
    </logger>
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="infoAppender"/>
        <appender-ref ref="debugAppender"/>
        <appender-ref ref="warnAppender"/>
        <appender-ref ref="errorAppender"/>
    </root>
</configuration>'''
springboot_setting = '''server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.prefix=access_log 
server.tomcat.accesslog.file-date-format=-yyyy-MM-ddd
server.tomcat.basedir=tomcat
server.tomcat.accesslog.directory=logs
server.tomcat.accesslog.pattern=common
logging.level.org.apache.tomcat=DEBUG
logging.level.org.apache.catalina=DEBUG
logging.path=/app/tomcat/logs/springBoot
logging.config=classpath:logback-spring.xml
logging.pattern.console=[%d{yyyy-MM-dd HH:mm:ss}] -- [%-5p]: [%c] -- %m%n
logging.pattern.file=[%d{yyyy-MM-dd HH:mm:ss}] -- [%-5p]: [%c] -- %m%n'''

core_list = []
count = 0

def isMatchDescription(line_buffer):
    des = 'dependencies {'
    # if match the core description
    if line_buffer.strip() == des.strip():
        return True
    return False


def modifyFile(filename):
    global count

    lines = []
    with open(filename, "r") as f:
        lines = f.readlines()
        hit = 0

        for index, line in enumerate(lines):
            if isMatchDescription(line):
                hit = index
                print(hit)
                print("Matched file:%s" % filename)
                count += 1
        if hit > 0:
            lines.insert(hit+1, gradle_settings)
        f.close()

    # Write back to file
    with open(filename, "w") as f:
        for line in lines:
            f.write(line)
        f.close()



if __name__ == '__main__':
    base_dirs = os.path.abspath(os.curdir)
    dirs = base_dirs + "/src/main/resources/log4j.xml"
    print(dirs)
    if not os.path.exists(dirs):
        # 寫入access日誌配置
        with open(dirs, mode='w', encoding='utf-8') as g:
            g.write(access_settings)
            g.close()

    dirs = base_dirs + '/src/main/resources/logback-spring.xml'
    if not os.path.exists(dirs):
        # 寫入catalina日誌配置
        with open(dirs, mode='w', encoding='utf-8') as g:
            g.write(catalina_settings)
            g.close()

    '''
    #此項只針對非springboot項目,springboot-boot-starter會集成log4j依賴,重複引入會衝突
    # 添加依賴,目前只支持gradle
    modifyFile('build.gradle')
    '''
    # 修改springboot配置
    file = open(base_dirs + "/src/main/resources/application.properties", encoding="utf-8", mode="w")
    file.write(springboot_setting)
    file.close()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章